第一節(jié) IO簡(jiǎn)介
GPIO是通用輸入/輸出端口的簡(jiǎn)稱,是STM32可控制的引腳。GPIO的引腳與外部硬件設(shè)備連接,可實(shí)現(xiàn)與外部通訊、控制外部硬件或者采集外部硬件數(shù)據(jù)的功能。每個(gè)GPIO內(nèi)部都有這樣的一個(gè)電路結(jié)構(gòu):
這邊的電路圖稍微提一下:
保護(hù)二極管:IO引腳上下兩邊兩個(gè)二極管用于防止引腳外部過(guò)高、過(guò)低的電壓輸入。當(dāng)引腳電壓高于VDD時(shí),上方的二極管導(dǎo)通;當(dāng)引腳電壓低于VSS時(shí),下方的二極管導(dǎo)通,防止不正常電壓引入芯片導(dǎo)致芯片燒毀。但是盡管如此,還是不能直接外接大功率器件,須加大功率及隔離電路驅(qū)動(dòng),防止燒壞芯片或者外接器件無(wú)法正常工作。
P-MOS管和N-MOS管:由P-MOS管和N-MOS管組成的單元電路使得GPIO具有“推挽輸出”和“開(kāi)漏輸出”的模式。這里的電路會(huì)在下面很詳細(xì)地分析到。
Q-TTL肖特基觸發(fā)器:信號(hào)經(jīng)過(guò)觸發(fā)器后,模擬信號(hào)轉(zhuǎn)化為0和1的數(shù)字信號(hào)。但是,當(dāng)GPIO引腳作為ADC采集電壓的輸入通道時(shí),用其“模擬輸入”功能,此時(shí)信號(hào)不再經(jīng)過(guò)觸發(fā)器進(jìn)行TTL電平轉(zhuǎn)換。ADC外設(shè)要采集到的原始的模擬信號(hào)。
這里需要注意的是,在查看數(shù)據(jù)手冊(cè)中,會(huì)看到有“FT”一列,這代表著這個(gè)GPIO口時(shí)兼容3.3V和5V的;如果沒(méi)有標(biāo)注“FT”,就代表著不兼容5V。
GPIO支持4種輸入模式(浮空輸入、上拉輸入、下拉輸入、模擬輸入)和4種輸出模式(開(kāi)漏輸出、開(kāi)漏復(fù)用輸出、推挽輸出、推挽復(fù)用輸出)。同時(shí),GPIO還支持三種最大翻轉(zhuǎn)速度。每個(gè)I/O口可以自由編程,但I(xiàn)/O口寄存器必須按32位字被訪問(wèn)。下面將具體介紹GPIO的這八種工作方式。
1,浮空輸入模式
浮空輸入模式下,I/O端口的電平信號(hào)直接進(jìn)入輸入數(shù)據(jù)寄存器。也就是說(shuō),I/O的電平狀態(tài)是不確定的,完全由外部輸入決定;如果在該引腳懸空(在無(wú)信號(hào)輸入)的情況下,讀取該端口的電平是不確定的。
2,上拉輸入模式
上拉輸入模式下,I/O端口的電平信號(hào)直接進(jìn)入輸入數(shù)據(jù)寄存器。但是在I/O端口懸空(無(wú)信號(hào)輸入)的情況下,輸入端的電平可以保持在高電平;并且在I/O端口輸入為低電平的時(shí)候,輸入端的電平也還是低電平。
3,下拉輸入模式
下拉輸入模式下,I/O端口的電平信號(hào)直接進(jìn)入輸入數(shù)據(jù)寄存器。但是在I/O端口懸空(在無(wú)信號(hào)輸入)的情況下,輸入端的電平可以保持在低電平;并且在I/O端口輸入為高電平的時(shí)候,輸入端的電平也還是高電平。
4,模擬輸入模式
模擬輸入模式下,I/O端口的模擬信號(hào)(電壓信號(hào),而非電平信號(hào))直接模擬輸入到片上外設(shè)模塊,比如ADC模塊等等。
5,開(kāi)漏輸出模式
開(kāi)漏輸出模式下,通過(guò)設(shè)置位設(shè)置/清除寄存器或者輸出數(shù)據(jù)寄存器的值,途經(jīng)N-MOS管,最終輸出到I/O端口。這里要注意N-MOS管,當(dāng)設(shè)置輸出的值為高電平的時(shí)候,N-MOS管處于關(guān)閉狀態(tài),此時(shí)I/O端口的電平就不會(huì)由輸出的高低電平?jīng)Q定,而是由I/O端口外部的上拉或者下拉決定;當(dāng)設(shè)置輸出的值為低電平的時(shí)候,N-MOS管處于開(kāi)啟狀態(tài),此時(shí)I/O端口的電平就是低電平。同時(shí),I/O端口的電平也可以通過(guò)輸入電路進(jìn)行讀取;注意,I/O端口的電平不一定是輸出的電平。
6,開(kāi)漏復(fù)用輸出模式
開(kāi)漏復(fù)用輸出模式,與開(kāi)漏輸出模式很是類(lèi)似。只是輸出的高低電平的來(lái)源,不是讓CPU直接寫(xiě)輸出數(shù)據(jù)寄存器,取而代之利用片上外設(shè)模塊的復(fù)用功能輸出來(lái)決定的。
7,推挽輸出模式
推挽輸出模式下,通過(guò)設(shè)置位設(shè)置/清除寄存器或者輸出數(shù)據(jù)寄存器的值,途經(jīng)P-MOS管和N-MOS管,最終輸出到I/O端口。這里要注意P-MOS管和N-MOS管,當(dāng)設(shè)置輸出的值為高電平的時(shí)候,P-MOS管處于開(kāi)啟狀態(tài),N-MOS管處于關(guān)閉狀態(tài),此時(shí)I/O端口的電平就由P-MOS管決定:高電平;當(dāng)設(shè)置輸出的值為低電平的時(shí)候,P-MOS管處于關(guān)閉狀態(tài),N-MOS管處于開(kāi)啟狀態(tài),此時(shí)I/O端口的電平就由N-MOS管決定:低電平。同時(shí),I/O端口的電平也可以通過(guò)輸入電路進(jìn)行讀取;注意,此時(shí)I/O端口的電平一定是輸出的電平。
8,推挽復(fù)用輸出模式
推挽復(fù)用輸出模式,與推挽輸出模式很是類(lèi)似。只是輸出的高低電平的來(lái)源,不是讓CPU直接寫(xiě)輸出數(shù)據(jù)寄存器,取而代之利用片上外設(shè)模塊的復(fù)用功能輸出來(lái)決定的。
第二節(jié) 硬件解讀
先看看原理圖:
開(kāi)發(fā)板上面一共有3顆可編程LED,控制的引腳分別是PB2,PB5和PB12,LED右側(cè)通過(guò)一共限流電阻上拉到3.3V,所有stm32給一個(gè)低電平就會(huì)點(diǎn)亮LED,反之則熄滅。
第三節(jié) CubeMX配置
第一步:雙擊打開(kāi)STM32CubeMX,如下圖,新建項(xiàng)目。【注意:新建項(xiàng)目本教程只介紹一次,以后項(xiàng)目的建立不在重復(fù)】
第二步:在英文狀態(tài)下搜索芯片:STM32WLE5CCU6【注意:盡可能靠近該芯片,不一定是STM32WLE5CCU6,不同STM32CubeMX版本,芯片的名字不一樣的】選后選擇對(duì)應(yīng)的芯片即可。
第三步:在1處查看芯片的視圖,選擇2處后可以看見(jiàn)芯片所有的功能,選擇3處的RCC時(shí)鐘,在4處配置外部高速時(shí)鐘,一切配置完了之后,會(huì)在5處看見(jiàn)GPIO變綠色。,如下圖。【注意:本教程晶振配置僅配置一遍,后續(xù)教程將不再重復(fù)】
第四步:在1處切換到時(shí)鐘樹(shù)頁(yè)面,在2處配置外部晶振大小,藍(lán)橋杯物聯(lián)網(wǎng)開(kāi)發(fā)板外接高速晶振為32MHZ,所以這里配置成32MZH,在3處配置HCLK時(shí)鐘為最大時(shí)鐘,最大時(shí)鐘為48MHZ。如下圖。【注意:本教程時(shí)鐘樹(shù)配置僅配置一遍,后續(xù)教程將不再重復(fù)】
第五步:配置下載器,在3處選擇DEBUG,在4處選擇JTAG模式,之后就可以看見(jiàn)5處和6處的GPIO變綠色了。【注意:本教程下載器配置僅配置一遍,后續(xù)教程將不再重復(fù)】
第六步:配置STM32的PB2引腳為GPIO_Output,如下圖:
第七步:以同樣配置STM32的PB5和PB12引腳為GPIO_Output,如下圖:
第八步:在1處可以看見(jiàn)選中GPIO的配置,在2處看見(jiàn)GPIO的輸入輸出的引腳,在3處選擇PB2,在4處配置GPIO的默認(rèn)高低電平,因?yàn)榈碗娖絃ED亮,我們默認(rèn)低電平,在5處配置為上拉,和硬件配置保持一致,在6處配置用戶標(biāo)簽,便于管理。如下圖:
其中:具體配置信息如下:
GPIO output leve:表示上電的默認(rèn)電平,可配置高(High)或者低(Low);
GPIO mode:表示輸出模式,可為Output Push Pull(推挽輸出)或Output Open Drain(開(kāi)漏輸出);
GPIO Pull-up/Pull-down:表示是否上下拉,可配置為上拉(Pull-up)或者下拉(Pull-down)或不上拉也不下拉(No Pull-up and no Pull-down);
Maximum output speed:表示輸出速度,可配置為低速(Low)或者中速(Medium)或高速(High)或超高速(Very High);
User Label:表示用戶標(biāo)簽,可修改IO口名稱,比如可寫(xiě)入LED,把IO口名稱變?yōu)長(zhǎng)ED;
第九步:和PB2一樣配置其他2個(gè)GPIO。
第十步:選擇項(xiàng)目信息,如下配置:2處是項(xiàng)目的名字;3處是項(xiàng)目的路徑;4處是編譯器;5處是編譯器版本。【注意:項(xiàng)目路徑不能包含中文等其他非法字符;編譯器一定要選擇MDK-ARM;編譯器版本要選擇最新的,本教程為v5.37。后續(xù)教程將不在重復(fù)本步操作】
第十一步:如下圖,將3,4處的按鈕勾選,點(diǎn)擊5處,生成Keil工程。【注意:后續(xù)教程將不在重復(fù)本步操作】
第十二步:點(diǎn)擊上步的5處之后,會(huì)有一個(gè)對(duì)話框,意思分別是:打開(kāi)項(xiàng)目文件夾位置;打開(kāi)項(xiàng)目;關(guān)閉本窗口。【注意:這里靈活處理,打開(kāi)文件夾和項(xiàng)目都可以。后續(xù)教程將不在重復(fù)本步操作】
第四節(jié) MDK代碼
第一步,編譯代碼,檢查STM32CubeMX生成的代碼是否正常。如下圖,點(diǎn)擊1處編譯,之后在2處可以看見(jiàn)一個(gè)警告,是因?yàn)镸DK版本太新,高于CubeMX選擇的V5.37,導(dǎo)致編譯器不一樣,但是不影響程序運(yùn)行。【注意:后續(xù)教程將不在重復(fù)本步操作】
第二步:配置下載器,這一步很多步驟,希望大家仔細(xì)一點(diǎn),一步一步來(lái)。【注意:不要忘記點(diǎn)擊“OK”,后續(xù)教程將不在重復(fù)本步操作】
第三步:新建.h文件。在“項(xiàng)目名/Core/Inc”中新建一個(gè)“zsdz.h”的文件。【注意:后續(xù)教程將不在重復(fù)本步操作】
第四步:新建.c文件。在“項(xiàng)目名/Core/Src”中新建一個(gè)“zsdz.c”的文件。【注意:后續(xù)教程將不在重復(fù)本步操作】
第五步:添加“zsdz.c”文件。點(diǎn)擊1處,可以看見(jiàn)項(xiàng)目的所有的文件,點(diǎn)擊2,3處,準(zhǔn)備添加“zsdz.c”文件,但是發(fā)現(xiàn)沒(méi)有“zsdz.c”文件,如下圖:需要返回到上一層文件目錄中,點(diǎn)擊4處。【注意:后續(xù)教程將不在重復(fù)本步操作】
如下圖:雖然沒(méi)有發(fā)現(xiàn)“zsdz.c”文件,但是我們看見(jiàn)了Core文件夾,還記得我們的“zsdz.c”文件保存在哪嗎?在“項(xiàng)目名/Core/Src”中,所以我們進(jìn)入到“/Core/Src”,找到“zsdz.c”文件即可。【注意:后續(xù)教程將不在重復(fù)本步操作】
第六步:如下圖,代表添加成功。【注意:后續(xù)教程將不在重復(fù)本步操作】
第七步:如下,點(diǎn)擊1處,可以看見(jiàn)MDK中的“zsdz.c”文件。【注意:如果利用STM32CubeMX生成MDK項(xiàng)目,“zsdz.c”文件可能會(huì)從MDK項(xiàng)目中移除,請(qǐng)重新添加】
第八步:編寫(xiě)“zsdz.c”文件的代碼,如下:【注意:后續(xù)教程將不在重復(fù)本步操作】
第九步:進(jìn)入到“zsdz.h”文件,右鍵,選擇“Go to Headerfile‘zsdz.h’”。【注意:后續(xù)教程將不在重復(fù)本步操作】
第十步:編寫(xiě)“Zsdz.h”文件的代碼,如下:【注意:后續(xù)教程將不在重復(fù)本步操作】
第十一步:在Main中添加“zsdz.h文件”,如下:【注意:只可以添加在“USER CODE BEGIN”和“USER CODE BEGINEND”之間,否則等下次利用STM32CubeMX生成MDK項(xiàng)目時(shí),不在“USER CODE BEGIN”和“USER CODE END”之間的代碼會(huì)被覆蓋】
第十二步:編寫(xiě)LED的函數(shù)模板,具體如下:【注意:不要忘記聲明gpio.c文件。注意:后續(xù)教程將不在重復(fù)本步操作】
第十三步:以上就是LED所有的封裝函數(shù)了,我們?cè)凇皕sdz.h”文件中聲明他們,如下圖:【注意:后續(xù)教程將不在重復(fù)本步操作】
第十四步:現(xiàn)在隨便在main函數(shù)中寫(xiě)幾個(gè),看看效果。
第十五步:編譯檢查代碼并下載。點(diǎn)擊1處編譯代碼,之后在2處可以看見(jiàn)0錯(cuò)誤0警告。代碼沒(méi)有問(wèn)題之后,點(diǎn)擊3處下載代碼,在4處看見(jiàn)Flash Load finished at xxxx,就證明代碼下載成功。【注意:后續(xù)教程將不在重復(fù)本步操作】
第五節(jié) 實(shí)驗(yàn)現(xiàn)象
注意:
1,請(qǐng)用USB線連接電腦與開(kāi)發(fā)板。
2,請(qǐng)選擇A開(kāi)發(fā)板。
現(xiàn)象:AL2以400ms為間隔閃爍。
來(lái)源:撞上電子微信公眾號(hào)
版權(quán):東莞市東城墨竹公子電子工作室
日期:2024.11.03
第六節(jié) 課后作業(yè)
請(qǐng)讓AL1長(zhǎng)亮,AL2以500ms為間隔閃爍,AL3以1000ms為間隔閃爍。
-
led
+關(guān)注
關(guān)注
242文章
23332瀏覽量
662152 -
STM32
+關(guān)注
關(guān)注
2270文章
10920瀏覽量
356916 -
GPIO
+關(guān)注
關(guān)注
16文章
1216瀏覽量
52254 -
藍(lán)橋杯
+關(guān)注
關(guān)注
1文章
129瀏覽量
10168
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論