本文逐步介紹了作者自身在STM32處理器和IAR編譯環(huán)境的學(xué)習(xí)過程,并介紹了在該類環(huán)境下容易產(chǎn)生錯誤的地方,最后順利的進行Firmware下的程序編寫和ST-LINK的調(diào)試。
1.2 選擇STM32單片機/處理器在公司完成一個項目之后,需要考慮新的芯片適應(yīng)新的需求,以此,同主管商量之后,決定采用ST的8位或32位單片機。其價格、功能、用戶群都是比較不錯的。
介于自身對32位芯片的向往,于是義不容辭的直接上STM32單片機。公司正好有一塊STM32的板子,于是決定從STM32F103C8開始。
1.3 熟悉STM32的編程手法不同于以往的8位或16位單片機,STM32的編程大量使用Firmware,也就是固件,個人理解是:Firmware不需要或者很少修改之后,可以隨意的調(diào)用,即可以實現(xiàn)相關(guān)功能。Firmware的設(shè)計結(jié)構(gòu)預(yù)示著它具有很好的通用型,而且熟悉之后調(diào)用非常的簡單。
最大的困難在于當(dāng)初次接觸Firmware時,可能有點暈,于是本人花費了整整4天時間初步搞定了如何使用Firmware,以及使用開發(fā)板進行下載調(diào)試。
1.4 平臺選擇A、開發(fā)板、仿真器:使用的是STM32F103C8-PKT+ST-LINK;
B、開發(fā)環(huán)境:IAR Embedded Workbench for ARM, 32K Kick start Edition;
C、Firmware:STM32F10x_StdPeriph_Lib_V3.4.0
首先安裝IAR Embedded Workbench for ARM, 32K Kick start Edition;
下載STM32F10x_StdPeriph_Lib_V3.4.0;
二、準(zhǔn)備工作2.1 了解IAR for ARM編譯環(huán)境和很多其他的編譯環(huán)境一樣,IAR for ARM也分為創(chuàng)建項目,添加文件,編譯,連接,調(diào)試等相關(guān)流程。對IAR for ARM操作的重點在于對IAR環(huán)境的配置,將在后面詳細介紹。(不像Keil編寫51單片機一樣,只需要配置out有hex輸出既可)
2.2 了解Firmware-STM32F10x_StdPeriph_Lib_V3.4.0只有對Firmware有整體性的認識之后,你才能使用它,不至于很模糊。以此初學(xué)者一定要對Firmware有一個整體性的認識。
2.3 了解ST-LINK這里的ST-LINK是正宗的ST公司設(shè)計的,不是ST-LINKII,更不是III;
IAR for ARM中已經(jīng)提供了對ST-LINK的支持,以此很容易就可以使用ST-LINK進行配置。
三、開始工作和很多教程一樣,使用項目知道的方法,在實際的操作中來加深對該環(huán)境下的操作方法。
環(huán)境為:
STM32F103C8-PKT+ST-LINK
IAR Embedded Workbench for ARM, 32K Kick start Edition
STM32F10x_StdPeriph_Lib_V3.4.0
3.1 創(chuàng)建文件目錄創(chuàng)建一個文件夾20101223,在下面在創(chuàng)建一個EWARM文件夾:
20101223文件夾是你的整個項目的文件夾;
EWARM文件夾是項目中的放置工程文件夾;
3.2 創(chuàng)建一個工程目錄創(chuàng)建一個Workspace,一個Project,添加Add Group:
最后IAR for ARM中的結(jié)構(gòu)如下:
其中
CMSIS:Cortex Microcontroller Software interface standard
StdPeriph_Driver:Standard Peripheral Driver
這是你的代碼結(jié)構(gòu),主要是模仿Firmware中的Template,應(yīng)該是最清晰的結(jié)構(gòu)了。
文件組織結(jié)構(gòu)如下:
只要按照以上的建立方式,既可以進入下一階段。
3.3 添加Firmware相關(guān)文件該過程主要是Copy和Add兩個過程。
3.3.1 CopyA、Copy Firmware下的整個Libraries文件夾到20101223文件夾下B、 Copy Firmware中的main.c、
stm32f10x_conf.h、
stm32f10x_it.c、
stm32f10x_it.h 、
system_stm32f10x.c
如圖:
到20101223文件夾下,如圖:
C、 Copy 各類.ICF文件stm32f10x_flash.icf
stm32f10x_flash_extsram.icf
stm32f10x_nor.icf
stm32f10x_ram.icf
如圖:
到EWARM(即放置工程文件的文件夾下),如圖:
至此,所有的拷貝工作都已經(jīng)完成,進入Add調(diào)整階段。
3.3.2 Add以最簡單的GPIO端口操作為目的,開始Add相關(guān)文件。
添加之后的結(jié)果為:
其中:
core_cm3.c是內(nèi)核文件(沒深入研究);
system_stm32f10x.c是系統(tǒng)相關(guān)文件(沒深入研究);
misc.c是一個輔助文件;
stm32f10x_gpio.c是gpio的驅(qū)動文件;
stm32f10x_rcc.c是復(fù)位與時鐘控制器驅(qū)動文件;
main.c是主程序的入口函數(shù),是整個系統(tǒng)的一個主框架;
stm32f10x_it.c是系統(tǒng)的所有的中斷函數(shù)文件;
至此,所有的Copy和Add操作都已經(jīng)完成,接下來是Modify。
3.4 開始編譯和調(diào)試3.4.1 Compile with Modify首先修改main.c
修改main.c使之成為一個按照你的想法完成任務(wù)的系統(tǒng)功能。
最簡單的任務(wù)就是:讓4個LED循環(huán)亮滅;
源代碼如下:
/* Includes
--------------------------------------------*/
#i nclude "stm32f10x.h"
/* Private prototypes
--------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
typedef enum {
LED1 = 0,
LED2,
LED3,
LED4,
}LED_STATE;
LED_STATE led_status;
int main(void)
{
u32 cnt = 0x000fffff;
/* System Clocks Configuration */
RCC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();
led_status = LED1;
while (1){
switch (led_status){
case LED1:
GPIOB->BSRR = 0x1000E000; /* turn on LD1 */
led_status = LED2;
break;
case LED2:
GPIOB->BSRR = 0x2000D000; /* turn on LD2 */
led_status = LED3;
break;
case LED3:
GPIOB->BSRR = 0x4000B000; /* turn on LD3 */
led_status = LED4;
break;
case LED4:
GPIOB->BSRR = 0x80007000; /* turn on LD4 */
led_status = LED1;
break;
}
while(cnt--);
cnt = 0x000fffff;
}
}
/**
* @brief Configures the different system clocks.
* @param None
* @retval : None
*/
void RCC_Configuration(void)
{
/* Setup the microcontroller system. Initialize the Embedded Flash
Interface, initialize the PLL and update the SystemFrequency variable. */
SystemInit();
/* GPIOA clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
/**
* @brief Configure the GPIOD Pins.
* @param None
* @retval : None
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOB configuration: PB12 PB13 PB14 PB15 as led controller */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|
GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
Compile發(fā)現(xiàn)問題如下:
通過調(diào)整頭文件路徑解決:
右擊Project——>option——>C/C++Compile——>Preprocessor——>:
在Additional include directories中加入如下語句:
$PROJ_DIR$..
$PROJ_DIR$..LibrariesCMSISCM3CoreSupport
$PROJ_DIR$..LibrariesCMSISCM3DeviceSupportSTSTM32F10x
$PROJ_DIR$..LibrariesSTM32F10x_StdPeriph_Driverinc
如圖:
Compile:您有可能會出現(xiàn)以下問題:
這是需要修改stm32f10x.h文件中的相關(guān),因為你沒有為你的芯片選擇類型,點擊錯誤,即打開了stm32f10x.h頭文件,如圖:
只需要選擇您的期間類型就好,比如:
再Compile,這下錯誤出現(xiàn)的嚇人,鎮(zhèn)定發(fā)現(xiàn),我們沒有選擇device type:
右擊Project——>option——>General Options——>Target——>:
選擇好正確的芯片類型,如圖:
Compile,出現(xiàn):
分析好像沒有將一些頭文件包括進來,依然修改stm32f10x.h(注意:所有設(shè)備相關(guān)的頭文件都是由stm32f10x.h控制的),找到如下圖:
將其改成:
Compile:貌似ok了。
至此,程序基本上沒有問題,之后進行調(diào)試,測試功能相關(guān)。
3.4.2 Debug and Modify選擇調(diào)試工具:ST-LINK;
選擇調(diào)試方式:arm或者flash;
選擇燒寫配置文件:stm32f10x_flash.icf;
我們暫時使用ST-LINK進行flash的調(diào)試,這樣,調(diào)試結(jié)束后,程序已經(jīng)燒寫到芯片內(nèi)部,可以成為一個真正的系統(tǒng)了。
至此所有的調(diào)試準(zhǔn)備工作都已經(jīng)就緒;
連接設(shè)備:包括ST-LINK和電源線:
點擊,會出現(xiàn)如下結(jié)果:
你可以按F10、F11進行單步調(diào)試;
也可以按全速運行;
此時你可以看stack使用等相關(guān)情況,如圖所示:
此時,
拔掉電源,從新插上電源,即可以不用任何幫助,系統(tǒng)就會自動運行。
四、完成總結(jié)
【本文標(biāo)簽】: 多層 pcb 多層PCB面板 沉金板 公司設(shè)備
【責(zé)任編輯】:鼎紀電子PCB??? 版權(quán)所有:http://ai-hots.com/轉(zhuǎn)載請注明出處
掃一掃更精彩!
2001-2018 深圳鼎紀電子有限公司 版權(quán)所有
粵ICP備16081348號
全國服務(wù)熱線:0755-27586790
24小時銷售熱線:18025855806|18682125228
地址:深圳市寶安區(qū)西鄉(xiāng)黃崗嶺工業(yè)區(qū)灣區(qū)人工智能產(chǎn)業(yè)園B棟605
深圳鼎紀電子有限公司:單面PCB板