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