首页
/
每日頭條
/
科技
/
stm32應用框架
stm32應用框架
更新时间:2026-01-12 07:38:33

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

stm32應用框架(零基礎學習STM32智能家居系統之STM32模闆程序解讀)1

圖1 查看函數GPIO_InitTypeDef

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

stm32應用框架(零基礎學習STM32智能家居系統之STM32模闆程序解讀)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表示操作為使能。

stm32應用框架(零基礎學習STM32智能家居系統之STM32模闆程序解讀)3

圖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智能家居系統之STM32模闆程序解讀)4

圖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智能家居系統之STM32模闆程序解讀)5

圖5 創建外設文件夾LED

步驟二:在LED文件夾下創建兩個文件led.c和led.h,如圖6所示。

stm32應用框架(零基礎學習STM32智能家居系統之STM32模闆程序解讀)6

圖6 創建文件

步驟三:進入keil中,為HARDWARE添加文件led.c,如圖7所示。

stm32應用框架(零基礎學習STM32智能家居系統之STM32模闆程序解讀)7

圖7 添加文件

步驟四:為項目添加HARDWARE下的LED頭文件,如圖8所示。

stm32應用框架(零基礎學習STM32智能家居系統之STM32模闆程序解讀)8

圖8 添加頭文件

步驟五:回到主界面,對程序進行編譯,這時可以看到HARDWARE下的led.c和led.h,如圖9所示。

stm32應用框架(零基礎學習STM32智能家居系統之STM32模闆程序解讀)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 開發模闆程序的解讀,歡迎共同讨論,糾錯。期待點贊、轉發。粉絲朋友可直接私信索要相關資料(包括模闆及源代碼)。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
汽車進氣管被堵會有什麼影響
汽車進氣管被堵會有什麼影響
1、自動擋車會降檔,現在人們為了方便一般買自動擋車的人比較多,尤其是這幾年剛考完駕照的新手一般都會選擇自動擋車。那自動擋車在排氣管堵塞的時候就會出現發動機功率下降,一般車主在檔位到了的時候還想加速就會踩油門,沒有就會猛踩油門,但是一般這種不會真的提速,而且會出現降檔的情況,這個就是因為車的排氣管堵塞...
2026-01-12
微信公衆号漲粉應該怎麼做
微信公衆号漲粉應該怎麼做
1、充分利用個人微信号。運營公衆号不僅僅是讓别人主動搜索你的公衆号關注你,大家也不要忽略了個人微信号的作用。比如,個人微信發現”中有有許多功能,搖一搖、附近的人、漂流瓶等等,這些功能都可以成為我們吸引用戶的途徑,利用這些功能來獲取新的用戶流量,将用戶吸引到公衆号上就可以達到我們公衆号增粉的目的。2、借助微博力量。微博是當下年輕人相當喜歡的一個社交平台,玩微博的用戶是非常多的,它的月活用戶也是不可低
2026-01-12
怎樣把手機殼變白
怎樣把手機殼變白
1、風油精:其實風油精也是可以清洗手機殼的,直接用棉簽沾一點風油精塗在有污漬的地方,然後擦幹淨就可以了。2、草酸溶劑:如果有鏽迹的話建議用2%的酸草溶劑進行溶解,噴在鏽迹的地方,過2-3分鐘在用紙巾或者抹布就能夠擦幹淨了。3、牙刷牙膏:手機殼縫隙中有灰塵所以可以用牙刷加肥皂來進行清洗,但是不要要用太大的力氣來刷,隻要輕輕刷一遍,就能夠達到效果。4、面膜貼紙:平時我們貼完面膜的面膜紙也是可以用來擦手
2026-01-12
辣椒如何育苗
辣椒如何育苗
1、處理種子:育苗時間一般選在春季的2月中下旬,此時對于育苗的成功具有很大幫助。收集好種子之後,放在太陽光底下暴曬,時間大約2天左右,這樣能把外面的病菌殺死,也可以采用化學方法,泡在消毒溶液中20-30分鐘,之後把外面的藥水洗幹淨,浸泡在溫水中,8-12個小時後撈出。準備一塊紗布,将種子放在上面,然...
2026-01-12
電視機提示沒授權是怎麼回事
電視機提示沒授權是怎麼回事
1、數字電視上有一些頻道是需要花錢訂購的,而如果你沒有花錢訂購這些頻道,是沒法觀看的,屏幕也會顯示出未受權”的字樣。2、如果是全部節目都顯示沒授權的話,可能是費用到期了,需要重新授權下,聯系安裝的師傅或聯網機構重新交費就可以了。3、如果說的是其中的某一個節目,在提示此節目沒有授權,說明這個節目你沒有...
2026-01-12
Copyright 2023-2026 - www.tftnews.com All Rights Reserved