首先啟動IAR開發環境。如果你的設置是在啟動時出現Embedded Workbench Startup對話框,那么可以直接在這個對話框中點擊第一個按鈕——Create new projectin current workspace。如果你選擇了啟動不出現這個對話框,那么你可以在IAR的菜單欄中找到Project菜單,在其子菜單中有一個“Create new project...”。點擊之后會出現創建新工程的對話框,Tool chain選擇ARM,Project templates我們選擇Empty project,然后點擊OK。這時會彈出保存工程的對話框,隨便些個工程名,例如MyTestProject,點擊保存。這時一個空的工程就創建好了,接下來我們對工程的選項進行設置。
在Workspace窗口中,右擊MyTestProject,在彈出的菜單中選擇Options,這時就打開了工程選項。在第一項GeneralOptions中,選擇Target標簽頁。在Processor variant分組中單擊Device單選按鈕,然后單擊Device右邊的器件選擇按鈕,在彈出的菜單中選擇ST菜單中的ST STM32F10x。Endian mode選擇為Little,即小端模式。Stack align選擇為4字節。Output標簽頁使用默認設置就可以了,不用動。Library Configuration標簽頁中的Library選擇為Full。Library options和MISRA C標簽頁不用動,使用默認即可。再切換到C/C++ Compiler分類,選擇Language標簽頁,Language我們選擇為C,并將Require prototypes勾上,在Language conformace分組中選擇Relaxed ISO/ANSI。其他幾個標簽頁可以不用修改。
然后再切換到Linker分類,在Output標簽頁中,在Format分組中將Allow C-SPY-specific extra的復選框勾上。再切換到Extra Output標簽頁,將Generate extra output file勾上。再切換到Config標簽頁,在Linker command file分組中將Override default勾上,這時有個默認的lnkarm.xcl文件,它位于IAR的安裝目錄IAR SystemsEmbedded Workbench 4.0Kickstartarmconfig下。點擊旁邊的瀏覽文件的按鈕,找到這個默認的lnkarm.xcl文件,然后復制一份到我們的工程目錄MyTestProject下。然后在Override default下面的框中寫入路徑$PROJ_DIR$lnkarm.xcl,這將使用我們工程目錄下的鏈接文件。但是這個鏈接文件還是不行的,需要做一下修改。用記事本打開我們剛剛復制到工程目錄下的lnkarm.xcl文件,找到以下部分并修改(其中用//注釋的是原來的):
//-DROMSTART=08000
//-DROMEND=FFFFF
-DROMSTART=0x8000000
-DROMEND=0x801FFFF
//-DRAMSTART=100000
//-DRAMEND=7FFFFF
-DRAMSTART=0x20000000
-DRAMEND=0x20004FFF
//-Z(CODE)INTVEC=00-3F
-Z(CODE)INTVEC=ROMSTART-ROMEND
//-D_CSTACK_SIZE=2000
-D_CSTACK_SIZE=800
//-D_HEAP_SIZE=8000
-D_HEAP_SIZE=400
再切換到Debugger分類,在Setup標簽頁中,Driver選擇Third-Party Driver。在Download標簽頁中,將Use flashloader勾上。
然后在切換到最下面的Third-Party Driver分類,以選擇調試器的驅動。在IAR debugger driver下的文本框中輸入驅動的路徑,一般是C:ManleydriversSTLinkSTM32Driver.dll,這要看你的STLink驅動裝在哪了,指定到安裝的路徑即可。
至此,我們的工程選項就設置完了。接下來我們寫個流水燈的程序。要控制LED亮,就需要將對應的IO口設置為輸出口,并控制IO口的輸出電平。通過查看萬利STM32板的原理圖,我們4個LED是分別接在PORTC的4、5、6、7這4個引腳上的,高電平時將點亮LED。
首先我們要將IO口設置為輸出模式,查看STM32F103的數據手冊,是通過GPIOx_CRL和GPIOx_CRH寄存器來選擇模式的。我們要設置PORTC口的4、5、6、7位,那么就應該使用GPIOC_CRL寄存器,它的地址為0x40011000。我們將這4個IO口設置為50MHz的推挽輸出模式,具體的代碼見后面。然后,我們就可以對IO口的高低電平進行控制了,這通過端口置1和清0寄存器來控制,即寄存器GPIOx_BSRR寄存器和GPIOx_BRR寄存器。GPIOx_BSRR寄存器可以同時置1和清0,高16位是用來清0的,低16位是用來置1的。如果置1和清0位被同時設置,那么置1的優先級高。由于我們這里是控制LED的,對操作要求不嚴格,所以我們不使用BSRR寄存器的高16位,而用GPIOx_BRR寄存器來清0。GPIOC_BSRR和GPIOC_BRR的地址分別為0x40011010和0x40011014。另外,我們還需要啟動PORTC的時鐘,才能讓端口工作起來。啟動PORTC時鐘的控制在RCC_APB2ENR寄存器中,其中Bit4控制PROTC的時鐘,該位為1時時鐘使能。RCC_APB2ENR的地址為0x4002 1018。
最終,我們寫出的流水燈程序入下所示。點擊創建新文本文件的圖標,建立一個新的源文件。然后將以下代碼復制進去:
#define GPIOC_CRL (*((unsigned int *)(0x40011000)))
#define GPIOC_BSRR (*((unsigned int *)(0x40011010)))
#define GPIOC_BRR (*((unsigned int *)(0x40011014)))
#define RCC_APB2ENR (*((unsigned int *)(0x40021018)))
void Delay(void)//延時函數,流水燈顯示用
{
unsigned int i;
for(i=0;i<0xFFFFF;i++);
}
void main(void)
{
//使能PORTC時鐘
RCC_APB2ENR |=(1<<4);
//將GPIOC_CRL高16位都清0
//這樣CNF為00,即選擇為推挽輸出模式
GPIOC_CRL &= 0x0000FFFF;
//MODE選擇為11,即50MHz輸出模式
GPIOC_CRL |= 0x33330000;
while(1)
{
GPIOC_BRR=(1<<4); //滅 LED5
GPIOC_BSRR=(1<<7);//亮 LED2
Delay();
GPIOC_BRR=(1<<7); //滅 LED2
GPIOC_BSRR=(1<<6);//亮 LED3
Delay();
GPIOC_BRR=(1<<6); //滅 LED3
GPIOC_BSRR=(1<<5);//亮 LED4
Delay();
GPIOC_BRR=(1<<5); //滅 LED4
GPIOC_BSRR=(1<<4);//亮 LED5
Delay();
}
}
然后將其保存為main.c文件。再在Workspace窗口中,右擊MyTestProject,在彈出的菜單中選擇“Add”→“Add Files...”,然后將我們剛剛保存的main.c文件增加進去。然后編譯,點擊開始調試,等下載完成后,全速運行,就可以看到流水燈跑起來了。
如果你需要產生一個HEX文件然后通過ISP下載來運行,那么還需要在我們剛剛的lnkarm.xcl文件最后加入一行:
-Ointel-extended,(CODE)=.hex
這樣就會在工程目錄的DebugExe下產生一個HEX文件。當然,具體是在Debug目錄還是Release目錄,就要看你當前選擇編譯模式了。
當然,上面這個工程只是一個非常簡單的例子,在實際的工程中,我們還有更多、更復雜的事情要做,例如各種時鐘的初始化、中斷初始化等等。這些就需要靠大家自己去看資料學習了,圈圈也只能是愛莫能助。ST提供的庫包含了很多已經寫好了的代碼,大家可以直接使用,以減少編程的工作量。
STM32/STM8
意法半導體/ST/STM
電子發燒友App











評論