在上一節中,我們在MDK5中建立了STM32的模闆程序,今天,我們來對程序進行解讀。我們先來上程序,然後對程序當中主要的語句進行解讀。
4.1 模闆主程序解讀
#include "stm32f10x.h" #引入頭文件
void Delay(u32 count) #延遲函數
{
u32 i=0;
for(;i<count;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 開發模闆程序的解讀,歡迎共同讨論,糾錯。期待點贊、轉發。粉絲朋友可直接私信索要相關資料(包括模闆及源代碼)。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!