mySTM32way
STM32 的 GPIO 包括多個(gè)端口和引腳,每個(gè)端口包含一組連續(xù)的引腳。GPIO 引腳可以配置為輸入、輸出或復(fù)用功能,以滿足不同的應(yīng)用需求。
在 STM32 中,GPIO 以寄存器方式實(shí)現(xiàn)控制。對(duì)于每個(gè)端口,都有一組寄存器進(jìn)行配置和控制。這些寄存器包括數(shù)據(jù)寄存器、輸入狀態(tài)寄存器、輸出驅(qū)動(dòng)器控制寄存器等等。
STM32 的 GPIO 具有以下特點(diǎn):
支持不同的IO模式:GPIO模式、模擬模式、復(fù)用模式和中斷模式。
高速和低功耗模式可選,可以根據(jù)應(yīng)用場景選擇適合的速率。
支持上下拉電阻,可以從硬件保護(hù)的角度來避免外部設(shè)備產(chǎn)生的過壓或過流問題。
分類
STM32 的 GPIO 可以按照其性質(zhì)分為以下幾類:
通用輸入輸出GPIO
通用輸入輸出GPIO是STM32最常用的GPIO類型,它們可以用作一般輸入或輸出,實(shí)現(xiàn)常規(guī)GPIO的控制。通過配置CRH或CRL寄存器來設(shè)置GPIO的輸入或輸出模式。
復(fù)用輸入輸出GPIO
復(fù)用輸入輸出GPIO是用于支持STM32芯片的外圍設(shè)備或者總線的,例如UART、SPI或I2C總線。復(fù)用輸入輸出GPIO通過與特殊功能寄存器AFIO結(jié)合使用,可以設(shè)置特殊功能寄存器的映射來使能特定功能。
模擬輸入輸出GPIO
模擬輸入輸出GPIO是用于連接模擬傳感器和元件的,例如溫度傳感器、基準(zhǔn)電壓、微調(diào)電位器等。模擬輸入輸出GPIO沒有數(shù)字輸入/輸出級(jí)別,因此只能處理模擬信號(hào)。
中斷輸入輸出GPIO
中斷輸入輸出GPIO是能夠在輸入狀態(tài)改變時(shí)向CPU發(fā)出中斷請(qǐng)求的GPIO。中斷輸入輸出GPIO可以用于實(shí)現(xiàn)強(qiáng)實(shí)時(shí)應(yīng)用程序的硬件剝奪。配置EXTI寄存器可設(shè)置引腳的邊緣觸發(fā)、屏蔽和優(yōu)先級(jí)等屬性。
總結(jié)
STM32 的 GPIO 提供了多種類型的 GPIO 端口,并為不同的應(yīng)用場景提供了不同的配置選項(xiàng),靈活性較高。開發(fā)者可以根據(jù)具體的應(yīng)用需求和硬件平臺(tái)選擇合適的配置方式,并仔細(xì)配置相關(guān)參數(shù),才能實(shí)現(xiàn)良好的控制效果。
以下的代碼:
STM32 的 GPIO 工作模式:
推挽輸出模式(GPIO_Mode_Out_PP)
推挽輸出模式是 STM32 中最常用的輸出模式之一,通常用于連接 LED 燈、驅(qū)動(dòng)繼電器等應(yīng)用。在這種模式下,輸出引腳可以設(shè)置為高電平或低電平,也可以被直接拉到 VCC 或 GND 上。
開漏輸出模式(GPIO_Mode_Out_OD)
開漏輸出模式是一種特殊的輸出模式,主要用于連接一些需要共用線路的外設(shè),例如 I2C、SPI 等。在這種模式下,輸出引腳會(huì)被拉到 GND 上,此時(shí)需要通過外部上拉電阻將引腳拉到高電平。
浮空輸入模式(GPIO_Mode_IN_FLOATING)
浮空輸入模式是一種常見的輸入模式之一,引腳內(nèi)部沒有上拉或下拉電阻,如果沒有外部電路的干擾,引腳的電平將處于一個(gè)不確定的狀態(tài)。
上拉輸入模式(GPIO_Mode_IPU)
上拉輸入模式是一種常用的輸入模式,引腳內(nèi)部集成了上拉電阻,并且默認(rèn)上拉。一旦外部電路沒有將引腳拉到 GND 上,引腳就會(huì)保持在高電平狀態(tài)。
下拉輸入模式(GPIO_Mode_IPD)
下拉輸入模式與上拉輸入模式相似,區(qū)別在于引腳內(nèi)部集成了下拉電阻,并且默認(rèn)下拉。如果沒有外部電路將引腳拉到 VCC 上,引腳將保持在低電平狀態(tài)。
此外,STM32 的 GPIO 外設(shè)還支持中斷模式和模擬輸入等其他功能,具體情況需要根據(jù)外設(shè)的需求進(jìn)行配置。
在 STM32 開發(fā)中,需要根據(jù)具體的應(yīng)用場景選擇適當(dāng)?shù)?GPIO 工作模式,以滿足不同的應(yīng)用需求。同時(shí),需要注意 GPIO 的配置參數(shù)、引腳的連接方式等,以避免出現(xiàn)不必要的錯(cuò)誤和故障。
以下是使用 STM32 的 GPIO 模塊控制 LED 燈的代碼示例,其中主要涉及到推挽輸出模式:
上面的代碼演示了如何初始化一個(gè) GPIO 引腳為推挽輸出模式,并通過對(duì)其電平進(jìn)行控制來實(shí)現(xiàn) LED 燈的開關(guān)。在代碼中,使用了串行外設(shè) (RCC) 對(duì) GPIOA 以及其時(shí)鐘進(jìn)行了初始化配置,并通過 GPIO_InitTypeDef 結(jié)構(gòu)體對(duì)引腳進(jìn)行了具體的配置,最后使用了 GPIO_SetBits() 和 GPIO_ResetBits() 函數(shù)來控制引腳的電平。
需要注意的是,上述代碼中使用了 delay_ms() 函數(shù)來進(jìn)行時(shí)間延遲,這個(gè)函數(shù)需要根據(jù)具體的環(huán)境和需求進(jìn)行實(shí)現(xiàn)。同時(shí),在實(shí)際開發(fā)中還需要根據(jù)具體的應(yīng)用場景選擇適當(dāng)?shù)?GPIO 工作模式,以滿足不同的應(yīng)用需求。
下面是使用 STM32 的 GPIO 模塊連接按鍵并實(shí)現(xiàn)中斷功能的代碼示例,其中主要涉及到上拉輸入模式和中斷模式:
上面的代碼演示了如何初始化一個(gè) GPIO 引腳為上拉輸入模式,并通過 EXTI 模塊實(shí)現(xiàn)對(duì)按鍵的中斷控制。在代碼中,使用了串行外設(shè) (RCC) 對(duì) GPIOA、AFIO 以及其時(shí)鐘進(jìn)行了初始化配置,并通過 GPIO_InitTypeDef 結(jié)構(gòu)體對(duì)引腳進(jìn)行了具體的配置,在 EXTI_InitTypeDef 結(jié)構(gòu)體中對(duì)中斷線進(jìn)行了配置,在 NVIC_InitTypeDef 結(jié)構(gòu)體中對(duì)中斷向量表進(jìn)行了配置,最后在主函數(shù)中等待按鍵的中斷觸發(fā)。