STM32的GPIO內部結構及相關暫存器

2021-08-03 13:43:22 字數 2454 閱讀 5004

學完大二上學期51微控制器課程的寒假,在家我就開始搗鼓stm32了,記得那時候接觸stm32感覺它很難,20多天下來就學習了rcc時鐘體系和gpio控制模組,開學後又開始忙一些有的沒的,stm32的學習也擱置了,以至於後來跟學校當時在念博的老師交流時,我是這樣描述我的stm32開發水平的:「我只會用gpio寫流水燈程式」,說來汗顏。

最近一陣子又回歸stm32學習之旅,對於gpio模組其實很不想寫文章,感覺在炒冷飯,不過,認真考慮後還是敲起了鍵盤,對於概念性的東西還是做一下筆記吧,程式設計方面的,挺簡單,相關資料很多,就不記錄了。

gpio是通用輸入/輸出埠的簡稱,是stm32可控制的引腳。gpio的引腳與外部硬體裝置連線,可實現與外部通訊、控制外部硬體或者採集外部硬體資料的功能。最簡單的helloworld級別的例子: 將gpio引腳接到led燈,通過控制引腳的輸出高、低電平試下開關控制led;將按鍵接到gpio引腳,通過讀取gpio引腳區分按鍵是按下還是鬆開。

接下來幹嘛?肯定是上那副經典的gpio內部結構圖了:

1.1 保護二極體

io引腳上下兩邊兩個二極體用於防止引腳外部過高/過低的電壓輸入,當引腳電壓高於vdd時,上方的二極體導通,當引腳電壓低於vss時,下方的二極體導通,防止不正常電壓引入晶元導致晶元燒毀。但是儘管如此,還是不能直接外接大功率器件,須加大功率及隔離電路驅動,防止燒壞晶元或者外接器件無法正常工作。

1.2 p-mos管和n-mos管

圖中紅色箭頭2方向為輸出模式的gpio,由p-mos管和n-mos管組成的單元電路使得gpio具有「推挽輸出」和「開漏輸出」的模式。這兩個mos管接管電路的輸入訊號是由gpio的輸出資料暫存器gpiox_odr提供的,也就是我們可以通過程式設計修改gpiox_odr暫存器的值從而影響該單元電路的輸出。

常用的還用置位/復位暫存器gpiox_bsrr和復位暫存器gpiox_brr,設定這兩個暫存器後也能影響gpiox_odr,進而影響單元電路輸出。

除此,還有復用功能輸出,意思是指stm32的其它片上外設對gpio引腳進行控制,此時該引腳作為外設功能的一部分。片上外設資料訊號作為雙mos管接管的輸入,進而輸出到gpio引腳中。例如usart串列埠通訊,要用到某個gpio 引腳作為通訊傳送引腳,就可以把該gpio 引腳配置成usart 串列埠復用功能,由串列埠外設控制該引腳,傳送資料。

1.3 ttl肖特基觸發器

圖中紅色箭頭1方向為輸入模式的gpio,gpio引腳經過內部上/下拉電阻配置成上/下拉、或者浮空輸入,然後連線到觸發器。訊號經過觸發器後,模擬訊號轉化為0和1的數碼訊號,然後儲存在輸入暫存器gpiox_idr中,通過讀取gpiox_idr暫存器就可以知道gpio的電平狀態。

同理,與復用功能輸出類似,這裡也有復用功能輸入,gpio引腳的輸入訊號會傳輸到stm32的其他片上外設,由外設去讀取該引腳狀態。例如使用usart串列埠通訊,用某個gpio引腳作為通訊的接收引腳。

另外,當gpio引腳作為adc採集電壓的輸入通道時,用其「模擬輸入」功能,此時訊號不再經過觸發器進行ttl電平轉換。adc外設要採集到的原始的模擬訊號。類似的,當gpio引腳用於dac模擬電壓輸出通道時,此時作為「模擬輸出」功能,dac訊號輸出不經過雙mos管。

gpio的硬體結構,決定了gpio可以配置成的工作模式有:

typedef enum

gpiomode_typedef;

2.1 輸入模式(上拉/下拉/浮空/模擬)

gpio在輸入模式中,肖特基觸發器被開啟,輸出被禁止,通過gpiox_idr讀取i/o狀態。上拉/下拉輸入,其預設電平由上拉/下拉決定,浮空輸入的電平則是不確定的,完全由外部決定,一般按鍵就是採用浮空輸入;模擬輸入用於adc取樣。

2.2 輸出模式(推挽/開漏)

gpio在輸出模式中,肖特基觸發器同樣被開啟著的,即輸入可用,這樣通過輸入資料暫存器gpiox_idr可以讀取到io實際狀態。推挽模式時,雙mos以輪流方式工作,開漏模式下,只有n-mos管工作。輸出暫存器gpiox_odr可控制是輸出高低電平;輸出的速率可配,有2mhz/10mhz/50mhz。頻率越高,功耗越大,效率也越高。

2.3 復用功能

復用功能中,輸出輸入都使能,可工作與開漏或推挽模式,但是輸出訊號源於片上外設,輸出資料暫存器gpiox_odr無效,輸入暫存器gpiox_idr仍然有效,可通過它獲取io實際狀態,片上外設相關暫存器也是通過gpiox_idr獲取該資料訊號。

控制gpio埠工作模式暫存器是gpiox_crl和gpiox_crh,它們都是32位的暫存器,分別管控gpio的低8位io和高8位io。另外涉及到的暫存器還有:

gpiox_odr: 設定輸出資料

gpiox_idr:讀取輸入資料

gpiox_bsrr:置1/清零gpio的相應引腳

gpiox_brr:清零gpio的相應引腳

這些暫存器的設定參照stm32中文參考手冊即可,很簡單,不贅述。另外,要讓gpio正常工作,記得開啟gpio的時鐘。

STM32 內部結構

為了進一步明確stm32103系列mcu的內部資源。我們可以從兩份資料著手學習。乙份是 stm32中文資料 乙份是 stm32f103中文資料 您的英文水平如果還可以,那麼您就使用原版的英文資料。但是因為中文資料是廠家提供的。那我們基本可以放心使用了。我們檢視 stm32中文資料 的第二節 儲存器和...

STM32的GPIO內部結構及相關暫存器

學完大二上學期51微控制器課程的寒假,在家我就開始搗鼓stm32了,記得那時候接觸stm32感覺它很難,20多天下來就學習了rcc時鐘體系和gpio控制模組,開學後又開始忙一些有的沒的,stm32的學習也擱置了,以至於後來跟學校當時在念博的老師交流時,我是這樣描述我的stm32開發水平的 我只會用g...

STM32入門系列 GPIO結構

已經了解了stm32 gpio的基本概念及引腳分類。現在來看下stm32 gpio內部的結構是怎樣的。io埠位的基本結構如下圖所示。從圖中可以看出gpio內部結構還是比較複雜的,只要將這張gpio結構圖理解好,那麼關於gpio的各種應用模式將非常清楚。圖中最右端i o埠就是stm32晶元的引腳,其它...