STM32学习笔记---GPIO
STM32的學習筆記—GPIO
我使用的是STM32F401ZGT6,有7組IO口,每組16個引腳,共112個引腳。
因為太菜了,確實容易出錯,還請賜教
參考官方文檔:八種IO口模式區別
結構原理
該單片機在GPIO功能方面有以下特點:
(1)4種輸入模式:
GPIO_Mode_AIN 模擬輸入
GPIO_Mode_IN_FLOATING 浮空輸入
GPIO_Mode_IPD 下拉輸入
GPIO_Mode_IPU 上拉輸入
(2)4種輸出模式:
GPIO_Mode_Out_OD 開漏輸出
GPIO_Mode_Out_PP 推挽輸出
GPIO_Mode_AF_OD 復用開漏輸出
GPIO_Mode_AF_PP 復用推挽輸出
(3)4種最大輸出速度:2MHz,25MHz,50MHz,100MHz
圖為該單片機芯片的IO口對應的結構圖:
平時接觸比較多的有:推挽輸出,開漏輸出,上拉輸入。
推挽輸出和開漏輸出的區別:
推挽輸出可以輸出高電平和低電平,因為推挽結構是由兩個三極管實現的,兩只對稱的功率開關管子每次只導通一個。因此輸出既可以向負載灌電流,也可以從負載抽取電流。
開漏輸出因為輸出端只有集電極,只可輸出低電平,所以如果想要輸出高電平,需要同時使用上拉電阻,但是這也意味著只要改變上拉電源電壓便可以改變輸出電平。
以下為使用IO口時的模式選擇情況:
1.浮空輸入-IN_FLOATING,用的還不多,可以在識別KEY時候使用(因為KEY也是邏輯電平)
2.帶上下拉輸入_IPU/_IPD,根據實際情況隨意選擇
3.模擬輸入_AIN,可用于模數轉換中(ADC)模擬電平的輸入
4.開漏輸出 _OUT_OD,可以輸出為0,要想輸出為1,要接上拉電阻。可以讀取IO輸入電平變化
5.推挽輸出_OUT_PP,可以輸出0,1,相當于GND,VCC
6.復用功能的推挽/開漏輸出 _AF_PP/_AF_OD,輸出時候使用片外設功能
注意:如果為無上拉電阻,IO默認高電平;可以用上拉輸入,浮空輸入和開漏輸出讀取電平
通常有5種方式使用引腳功能,配置方式如下:
(1)普通情況下GPIO輸入:浮空輸入,上下拉輸入,同時不使用引腳復用功能
(2)普通情況下GPIO輸出:推挽開漏輸出,不要使用復用功能
(3)GPIO模擬輸入:引腳為模擬輸入模式,不要使用復用功能
(4)內置外設的輸入:在(1)基礎上使能復用功能
(5)內置外設輸出:在(2)的基礎上使能復用功能
注意:如果有多個復用功能對應同一個引腳,比如經過查詢原理圖知道
PB0IO口可以復用為定時器一的CH2N通道(即二號高級通道),定時器三的CH3通道等,在編程之后的運行時,只使這個引腳實現這些功能的一種。
程序
以官方跑馬燈實驗庫函數版本為例:
其框架排布如下:
由于是筆記的第一篇,因此對框架作解釋:
為啦方便查找,keil的框架和實際文件夾的框架保持一致。
首先是USER文件夾,其中包括主文件,和兩個官方文件
HARDWARE文件一般用來配置引腳以實現外設功能,如本文通過IO口輸出高低電平來實現燈的亮滅
SYSTEM文件包含系統文件,和引腳的功能有關,如圖中的sys是時鐘方面的,delay是延時函數方面的,usart為串口通信方面的(這里其實不用的)
CORE文件中只有一個文件,但是必須要有
FWILB文件中為官方庫,配置GPIO以及復用功能的庫函數的聲明和定義以及一些變量和結構體的宏定義都在里面。
在配置好框架后,我們主要負責兩個地方:主文件和led.c文件
首先是HARDWARE中的led文件:
以下為led.c配置文件
#include "led.h"void LED_Init(void) { GPIO_InitTypeDef GPIOInitStructure;//自定義的結構體變量名,成員由結構體類型決定,該類型于stm32f4xx_gpio.c中定義 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//該函數和變量于stm32f4xx_rcc.c和對應頭文件中定義GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//結構體名字必須和第一行對應,也必須是PA9和PA10才行GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//總共有IN OUT AF AN四種模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//由OD和PP兩種GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz,還有2M(低速),25M(中速),50M(快速),100M(高速)GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//有上拉下啦和無三種GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化完畢 }由原理圖可知led外設的結構,當對應端口輸出低電平時,燈亮,當端口輸出高電平,燈不亮
因此我們可以在LED_Init()末尾加這樣一句話來確保剛開始時候燈是滅的
下邊是主文件的代碼
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h"int main(void) { delay_init(168); //初始化延時函數LED_Init(); //使用led.c中定義的文件while(1){GPIO_ResetBits(GPIOF,GPIO_Pin_9); //LED0燈亮GPIO_SetBits(GPIOF,GPIO_Pin_10); //LED1燈滅delay_us(500); //等0.5sGPIO_SetBits(GPIOF,GPIO_Pin_9); //LED0燈滅GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1燈亮delay_ms(500); //延遲0.5s} }—————————————————————————————
輸入實例(因為上邊這個實例是輸出)
按鍵輸入實例:(僅看初始化部分即可)
總結
以上是生活随笔為你收集整理的STM32学习笔记---GPIO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WiFi_Direct 直连开发实战
- 下一篇: (转载)各种图的画法与定义