此篇文章重點討論STM32的GPIO的配置種類以及上拉輸入、下拉輸入、浮空輸入、模擬輸入的區(qū)別
經過學習STM32發(fā)現,GPIO有8種工作方式
輸入模式:輸入浮空、輸入上拉、輸入下拉、模擬輸入
輸出模式:開漏輸出、開漏復用功能、推挽式輸出、推挽式復用功能
輸入模式參照圖片來講
浮空輸入:浮空輸入狀態(tài)下上拉電阻和下拉電阻都是斷開的,信號經過I/O端口——施密特觸發(fā)器——輸入數據寄存器——CPU讀取
上拉輸入:相比浮空輸入狀態(tài),就是上拉電阻閉合(下拉電阻仍然處于斷開狀態(tài))
下拉輸入:相比浮空輸入狀態(tài),就是下拉電阻閉合(上拉電阻仍然處于斷開狀態(tài))
模擬輸入:上拉電阻和下拉電阻都處于斷開狀態(tài),并且信號不是經過施密特觸發(fā)器,而是直接進入施密特觸發(fā)器之前的模擬輸入通道
輸出模式也參照圖片來講:
開漏輸出模式:其中1號區(qū)域,兩個寄存器有兩種讀寫方式,這個后面會介紹,這是關于寄存器的配置原因,對于輸出驅動器部分,當輸出控制電路輸出邏輯1(高電平)時,外部的I/O端口輸出的電平由外部電路決定,如果外部連接有上拉電阻,則輸出高電平,如果接有下拉電阻,則輸出低電平;當輸出控制電路輸出邏輯0(低電平)時,外部的電路不管是否接有上拉電阻還是下拉電阻,都輸出低電平;所有應用開漏輸出模式的時候想要輸出高電平切記要加上拉電阻
開漏復用功能輸出:此模式與開漏輸出模式只有一個不同的地方,就是在1號區(qū)域,此模式是直接在復用功能輸出引輸出部分輸出的
推挽輸出模式:也是走的1、2、3、4號路線,其中在2號區(qū)域輸出控制電路部分,如果輸出邏輯1,則3號區(qū)域P-MOS導通,N-MOS截止,輸出高電平(不管外部有沒有上拉電阻);如果輸出邏輯0,則3號區(qū)域P-MOS截止,N-MOS導通,輸出低電平(不管外部有沒有上拉電阻和下拉電阻)
推挽復用功能輸出:此模式與推挽輸出模式不同的地方就是1號區(qū)域,此模式是直接在復用功能輸出部分輸出的
下面講解一下輸出模式與寄存器的關系
在STM32的參考手冊中我們可以找到GPIOx_CRL和GPIOx_CRH寄存器,這兩個寄存器功能相同,就是GPIOx_CRL是用來配置低8位(例:PA0_PA7)I/O口的,GPIOx_CRH是用來配置高8位(例:PA8_PA15)I/O口的
這是一個32位寄存器,每4位配置一個端口,例:第1位和第0位即MODE0[1:0],用來設置Px0(PA0%20or%20PB0%20or%20PC0%20and%20so%20on)是輸入還是輸出,第3位和第2位即CNF0[1:0],用來選擇Px0的輸入或者輸出的具體模式。
其中有一個地方值得注意,就是在輸入模式下,CNFx=10的狀態(tài):上拉/下拉輸入模式,到底是上拉輸入模式還是下拉模式就要用到另一個寄存器GPIOx_ODR,并且這個寄存器對輸入和輸出有著不同的作用
這是一個32位寄存器,高16位保留,低16位每位對應Px的一個I/O口
在輸入模式下,如果對應位置1,則為上拉輸入;如果對應位置0,則為下拉輸入
在輸出模式下,如果對應位置0,則是要求輸出端口輸出默認輸出高電平,注意:此處,若為開漏輸出模式,若想輸出高電平需要外界上拉電阻
具體對應關系見下表:
還有一個寄存器需要介紹,端口位設置/清除寄存器(GPIOx_BSRR)
在輸出模式下,可以通過配置這個寄存器決定到底是輸出高電平還是低電平,低16位置1,則對應端口輸出高電平,高16位置1,則對應端口輸出低電平
這個寄存器就是上面講解輸出模式時的疑問
配置輸出模式時,可以通過配置寄存器GPIOx_BSRR然后映射到寄存器GPIOx_ODR,也可以直接配置寄存器GPIOx_ODR,但是對于運行效率來說,還是通過GPIOx_BSRR映射到GPIOx_ODR效率更高。