STM32的GPIO为输出模式时获取其输出状态
拋出一個問題,STM32的GPIO能否在不改變模式的情況下同時做輸入和輸出呢?答案是可以
STM32F103 的參考手冊GPIO章節摘錄:
第5點,在開漏模式時,對輸入數據寄存器的讀訪問可得到I/O狀態。從這一點我們可以看出,STM32的GPIO設置為開漏輸出模式時,改變輸出電平可以生效(但輸出1時受外部上拉電阻影響),同時可以通過輸入數據寄存器即GPIOx_IDR讀取該IO口的狀態。(開漏輸出加外部上拉電阻,實際上就是相當于51單片機的準雙向IO了。)
這里還要注意第6點,在推挽輸出模式下,讀取輸出數據寄存器即GPIOx_ODR只能讀到該IO口最后一次設定的輸出電平狀態,而不一定是實際的IO口狀態。比如說,寫寄存器使IO輸出低,但外部電路使其強拉到高,這時讀GPIOx_ODR只能讀到低,因為最后一次寫操作就是低。
注意:讀最后一次設定的輸出電平狀態,在推挽輸出模式時,除了GPIOx_ODR,讀GPIOx_IDR也是一樣的(假定外部電路不影響其輸出電平)。(讀GPIOx_ODR寄存器用的是GPIO_ReadOutputDataBit函數,讀GPIOx_IDR寄存器用的是GPIO_ReadInputDataBit函數)
讀最后一次設定的輸出電平狀態在一些特定應用場合非常有用,比如
uint8_t pwr_state=0; void pwr_on(void) {pwr_state = 1;GPIO_SetBits(GPIOA, GPIO_Pin_1); } void pwr_off(void) {pwr_state = 0;GPIO_ResetBits(GPIOA, GPIO_Pin_1); } uint8_t get_pwr_state(void) {return pwr_state; }上述代碼為了便于判斷當前電源的開關狀態,用了一個變量pwr_state作為指示電源開關狀態,實際上可以將GPIOx_ODR用起來,這個寄存器就可以反映最后一次對該IO的操作。舉例如下:
void pwr_on(void) {GPIO_SetBits(GPIOA, GPIO_Pin_1); } void pwr_off(void) {GPIO_ResetBits(GPIOA, GPIO_Pin_1); } uint8_t get_pwr_state(void) {return GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1); }這樣省略了一個變量的操作。
總結
以上是生活随笔為你收集整理的STM32的GPIO为输出模式时获取其输出状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 调试脚上电默认电平
- 下一篇: KILE退出调试模式时显示Encunte