在上一節中,我們在MDK5中建立了STM32的模板程式,今天,我們來對程式進行解讀。我們先來上程式,然後對程式當中主要的語句進行解讀。
4.1 模板主程式解讀
#include “stm32f10x。h” #引入標頭檔案
void Delay(u32 count) #延遲函式
{
u32 i=0;
for(;i } int main(void)#進入主程式 { GPIO_InitTypeDef GPIO_InitStructure;// ① RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // ② GPIO_InitStructure。GPIO_Pin = GPIO_Pin_13; // ③ GPIO_InitStructure。GPIO_Mode = GPIO_Mode_Out_PP; // ④ GPIO_InitStructure。GPIO_Speed = GPIO_Speed_50MHz; // ⑤ GPIO_Init(GPIOC, &GPIO_InitStructure); // ⑥ GPIO_SetBits(GPIOC,GPIO_Pin_13); // ⑦ while(1) { GPIO_ResetBits(GPIOC,GPIO_Pin_13); ⑧ Delay(3000000); GPIO_SetBits(GPIOC,GPIO_Pin_13); Delay(3000000); } } 解讀程式: ① GPIO_InitTypeDef GPIO_InitStructure; 這一句聲明瞭一個GPIO_InitStructure的結構體,該結構體用來初始化stm32的GPIO。 GPIO_InitStructure的結構體採用函式GPIO_InitTypeDef來初始化。如果想要檢視函式GPIO_InitTypeDef的具體定義,可以選擇GPIO_InitTypeDef後,單擊滑鼠右鍵,在開啟的快捷選單中選擇Go To Definition Of ‘GPIO_InitTypeDef’選項,如圖1所示。 圖1 檢視函式GPIO_InitTypeDef 單擊後可以進入到GPIO_InitTypeDef函式體內,如圖2所示。 圖2 函式GPIO_InitTypeDef 具體內容為: typedef struct { uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef; 結構體中的第一句uint16_t GPIO_Pin定義了相應的IO口;第二句GPIOSpeed_TypeDef GPIO_Speed是對所定義IO的引腳速度;第三句GPIOMode_TypeDef GPIO_Mode定義了IO口的引腳模式。 ② RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 第二句是對外設時鐘的處理,RCC_APB2PeriphClockCmd函式用來開啟或關閉APB2外設時鐘。RCC_APB2Periph_GPIOC表示給埠GPIOC(PC)執行操作;ENABLE表示操作為使能。 圖3 STM32時鐘樹(摘自正點原子STM32材料) 圖3表示的是STM32的時鐘樹。 ③ ④ ⑤ GPIO_InitStructure。GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure。GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure。GPIO_Speed = GPIO_Speed_50MHz; ③ ④ ⑤ 這三句是根據GPIO_InitTypeDef的引數給IO引腳進行賦值。 第 ③ 句 GPIO_InitStructure。GPIO_Pin = GPIO_Pin_13;表示引腳定義為PC13; 第 ④ 句 GPIO_InitStructure。GPIO_Mode = GPIO_Mode_Out_PP;表示IO口設定為推輓輸出;GPIO的引腳為了保證正常工作常接兩個保護二極體(MOS管),根據兩個MOS管的工作狀態可以分為若干種輸出方式,推輓是其中的一種,兩個二極體都工作。 第 ⑤ 句 GPIO_InitStructure。GPIO_Speed = GPIO_Speed_50MHz;表示速度為50HZ 。 ⑥ GPIO_Init(GPIOC, &GPIO_InitStructure);按以上GPIO_InitStructure的設定初始化GPIOC口 ⑦ GPIO_SetBits(GPIOC,GPIO_Pin_13); 對PC13埠設定高電平。 ⑧ GPIO_ResetBits(GPIOC,GPIO_Pin_13); 對PC13埠設定低電平。 圖4為LED燈的接線圖,可以看出LED燈接在PC13引腳上,所以系統先對PC13引腳進行初始化,最後設定PC13引腳的電平為高電平,LED燈初始化狀態為滅。 圖4 LED燈接線圖 在後面的主程式中: while(1) { GPIO_ResetBits(GPIOC,GPIO_Pin_13); Delay(3000000); GPIO_SetBits(GPIOC,GPIO_Pin_13); Delay(3000000); } 透過GPIO_ResetBits()和GPIO_SetBits()來改變PC13的電平,並結合Delay()延遲函式來控制LED燈迴圈亮和滅。 4.2 HARDWARE 資料夾中的外設規範化處理 為了規範化處理外設,模板中應該單獨設定HARDWARE 資料夾來單獨處理與外設相關的操作。處理的步驟如下: 步驟一: 在 HARDWARE 資料夾下建立外設資料夾,以 LED 燈為例,如圖 5所示。 圖5 建立外設資料夾LED 步驟二 :在LED資料夾下建立兩個檔案led。c和led。h,如圖6所示。 圖6 建立檔案 步驟三 :進入keil中,為HARDWARE新增檔案led。c,如圖7所示。 圖7 新增檔案 步驟四 :為專案新增HARDWARE下的LED標頭檔案,如圖8所示。 圖8 新增標頭檔案 步驟五 :回到主介面,對程式進行編譯,這時可以看到HARDWARE下的led。c和led。h,如圖9所示。 圖9 led。c和led。h檔案 步驟七 :向led。c和led。h中新增程式碼。 led.c #include “led。h” void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure。GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure。GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure。GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_13); } led.h #ifndef __LED_H #define __LED_H #include “sys。h” #define LED2 PCout(13) void LED_Init(void); #endif 4.3 編寫main.c程式碼 #include “sys。h” #include “delay。h” #include “usart。h” #include “led。h” int main(void) { delay_init(); //延時函式初始化 LED_Init(); //初始化與LED連線的硬體介面 while( 1) { LED2=0; delay_ms(300); //延時300ms LED2=1; delay_ms(300); //延時300ms } } 以上是STM32 開發模板程式的解讀,歡迎共同討論,糾錯。期待點贊、轉發。粉絲朋友可直接私信索要相關資料(包括模板及原始碼)。