零基礎學習STM32智慧家居系統之STM32模板程式解讀

在上一節中,我們在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所示。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖1 檢視函式GPIO_InitTypeDef

單擊後可以進入到GPIO_InitTypeDef函式體內,如圖2所示。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖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表示操作為使能。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖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燈初始化狀態為滅。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖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所示。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖5 建立外設資料夾LED

步驟二

:在LED資料夾下建立兩個檔案led。c和led。h,如圖6所示。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖6 建立檔案

步驟三

:進入keil中,為HARDWARE新增檔案led。c,如圖7所示。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖7 新增檔案

步驟四

:為專案新增HARDWARE下的LED標頭檔案,如圖8所示。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖8 新增標頭檔案

步驟五

:回到主介面,對程式進行編譯,這時可以看到HARDWARE下的led。c和led。h,如圖9所示。

零基礎學習STM32智慧家居系統之STM32模板程式解讀

圖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 開發模板程式的解讀,歡迎共同討論,糾錯。期待點贊、轉發。粉絲朋友可直接私信索要相關資料(包括模板及原始碼)。