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