STM32F4學(xué)習(xí)筆記3——通用IO
STM32F4每個(gè)GPIO端口有四個(gè)32位配置寄存器(GPIOx_MOER,GPIOx_OTYPER,GPIOx_OSPEEDR和GPIOx_PUPDR),兩個(gè)32位數(shù)據(jù)寄存器(GPIO_IDR和GPIO_ODR),一個(gè)32為置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)32為GPIO鎖寄存器(GPIOx_LCKR),兩個(gè)32為復(fù)用功能寄存器(GPIOx_AFRH和GPIOx_AFRL)。主要特性如下
·每個(gè)端口支持16個(gè)IO引腳控制
·推挽或者開漏+帶上拉電阻或者下拉電阻
·從數(shù)據(jù)輸出寄存器(GPIOx_ODR)或者外設(shè)(復(fù)用功能引腳)輸出數(shù)據(jù)
·每個(gè)IO支持速度選擇
·輸入狀態(tài):浮動(dòng),上拉/下拉,模擬
·輸入數(shù)據(jù)到輸入數(shù)據(jù)寄存器(GPIOx_IDR)或者外設(shè)(復(fù)用功能輸入)
·置位和復(fù)位寄存器(GPIOx_BSRR)
·GPIO鎖機(jī)制,用于凍結(jié)IO配置
·模擬輸入
·復(fù)用功能輸入輸出選擇寄存器
·每?jī)蓚€(gè)時(shí)鐘周期的快速IO切換
·高靈活度的復(fù)用功能使得IO可以作為通用IO使用或者外設(shè)使用
根據(jù)數(shù)據(jù)手冊(cè)中列出的每個(gè) I/O 端口的特定硬件特征,GPIO 端口的每個(gè)位可以由軟件分別配置成多
種模式。
·輸入浮空
·輸入上拉
·輸入下拉
·模擬輸入
·具有上拉下拉功能的開漏輸出
·具有上拉下拉功能的推挽輸出
·具有上拉下拉功能的推挽復(fù)用功能
·具有上拉下拉功能的開漏復(fù)用功能
每個(gè)IO口可以自由編程,端口寄存器必須按32位字被訪問(wèn)。GPIOx_BSRR跟GPIOx_BRR允許對(duì)熱河GPIO的讀/寫的獨(dú)立訪問(wèn);這樣在讀和寫之間訪問(wèn)之間產(chǎn)生IRQ(中斷請(qǐng)求)時(shí)不會(huì)發(fā)生危險(xiǎn)。 關(guān)于引腳耐壓5V可以參考數(shù)據(jù)手冊(cè)的引腳說(shuō)明。
復(fù)位期間跟剛復(fù)位后,復(fù)用功能未開啟,IO端口被配置成浮空輸入模式,復(fù)位后JTAG引腳被置于輸入上拉或下拉模式。
PA15:JTDI置于上拉模式
PA14:JTCK/SWCLK置于下拉模式
PA13:JTMS/SWDAT置于上拉模式
PB4:JNTRST置于上拉模式
PB3:JTDO浮空狀態(tài)
微控制器通過(guò)多路選擇器將 IO 引腳與相應(yīng)的片上外設(shè)相連接,這里要注意一點(diǎn),每一次只能與一個(gè)片上外設(shè)相連接,防止多個(gè)外設(shè)使用這個(gè)引腳造成沖突。
每個(gè)引腳都有一個(gè)多路選擇器,每個(gè)多路選擇器有 16 路輸入(AF0 到AF15) ,通過(guò)寄存器 GPIOx_AFRL(從 0 到 7)和 GPIOx_AFRH(從 8 到 15)進(jìn)行配置。
·復(fù)位后 IO 引腳默認(rèn)連接到系統(tǒng)復(fù)用功能 0(AF0)
·片上外設(shè)的復(fù)用功能映射從 AF1 到 AF13
·M4 的 FPU EVENTOUT 映射到 AF15
不能將EVENTOUT映射到一下引腳:PC13,PC14,PC15,PH0,PH1和PI8
置位和復(fù)位寄存器(GPIOx_BSRR)是一個(gè) 32 位寄存器,允許用戶程序置位或者復(fù)位輸出數(shù)據(jù)寄存器 GPIOx_ODR 的每個(gè)位。置位和復(fù)位寄存器GPIOx_BSRR 的位數(shù)是 GPIOx_ODR 的兩倍。寄存器 GPIOx_BSRR 就是對(duì)寄存器 GPIOx_ODR 的位操作,GPIOx_BSRR 的高 16 位用于
復(fù)位操作,低 16 位用置位操作,只有對(duì)寄存器 GPIOx_BSRR 相應(yīng)的位置 1 才對(duì)寄存器 GPIOx_ODR 有效,置 0 是無(wú)效的。如果對(duì)于寄存器GPIOx_ODR 的同一位同時(shí)進(jìn)行置位和復(fù)位操作,那么置位操作的優(yōu)先級(jí)要高。當(dāng)對(duì) GPIOx_ODR 的個(gè)別位編程時(shí),軟件不需要禁止中斷:在單次AHB1 寫操作里,可以只更改一個(gè)或多個(gè)位。GPIO鎖允許凍結(jié)IO配置。在一個(gè)端口位上執(zhí)行了LOCK程序,下一次復(fù)位前將不能再更改端口位配置。
所有端口都有外部中斷能力,在使用外部中斷先端口必須配置成輸入模式。
模擬輸入配置時(shí),輸出換從其被禁止,禁止施密特觸發(fā)器輸入,弱上拉下拉被電阻禁止,讀輸入寄存器時(shí)數(shù)值為0。
外設(shè)的GPIO設(shè)置模式在F1參考手冊(cè)上有,但是在F4上這個(gè)說(shuō)明沒(méi)有了具體大家在使用的時(shí)候可以參考f1,也可以參考官方外設(shè)例子。
STM32F4的GPIO庫(kù)
初始化配置函數(shù)
void GPIO_DeInit(GPIO_TypeDef*GPIOx)初始化GPIO寄存器到默認(rèn)值
void GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)GPIO初始化
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)將GPIO_InitStruct組員設(shè)置到默認(rèn)值
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)GPIO寄存器鎖
GPIO的讀和寫
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)讀某一引腳的輸入數(shù)據(jù)寄存器IDR
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)讀某一端口的輸入數(shù)據(jù)寄存器IDR
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)讀某一端口的輸出數(shù)據(jù)寄存器ODR
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)讀某一引腳的輸出數(shù)據(jù)寄存器ODR
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)GPIO置高
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)GPIO置低
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,BitAction BitVal)根據(jù)BitVal寫ODR寄存器
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)設(shè)置輸出寄存器ODR數(shù)值
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)通過(guò)GPIO->ODR^=GPIO_Pin;實(shí)現(xiàn)GPIO翻轉(zhuǎn)
GPIO復(fù)用功能配置函數(shù)
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)使用前要先使能GPIO時(shí)鐘與外設(shè)時(shí)鐘