GPIO(General Purpose Input/Output)可以說是微控制器最基本的功能,因此第一堂當然要先教 GPIO 的使用方式。
在本文中,將會介紹 STM32 的基本輸出與輸入的設定及模式。
相比於 Arduino,STM32 在使用 GPIO 時,要設定和注意的地方有很多,因此我先簡單介紹一下 STM32 的 GPIO。
首先最基本的,在設定 GPIO 時除了可以指定這個 Pin 腳是要是「General Purpose」的 Input 還是 Output 外,還有所謂的「Alternate Function(AF,復用功能)」,也可以設定是否啓用 STM32 內建的 上/下拉電阻(Pull-Up/Down Resistor)。
若選擇的是 Output 的話,還要設定輸出電路組態是「Push-Pull(PP,推挽)」或「Open-Drain(OD,汲極開路)」,和設定 IO 的速度(如 2MHz)。
如果是 Input 的話則有「類比(Analog)」與「浮接(Floating)」輸入,使用浮接輸入時也常常搭配 STM32 內建的上/下拉電阻使用。
功能模式:
High
還是 Low
,也可以由程式碼直接讀取該 Pin 腳的值。High
或 Low
,而是由指定的特殊功能來控制。輸出電路組態:
High
或 Low
電位。Low(GND)
或 Open(開路)
狀態,因此要外加一上拉電阻才能使其輸出的 Open
狀態變成 High
,而 High
狀態的實際電壓根據上拉電阻所接的電源而定,可以高或低於 IC 本身的電壓值。擁有線接及閘(Wired AND)的特性。輸入模式:
上面的內容涉及一些基本電學或電子學的知識,以上僅簡單介紹。
▲ GPIO 內部架構圖。取自 ST Wiki。
剛開始使用 STM32 時可能會搞不太懂上面這些,尤其是 AF 的部分,簡單來說,「General Purpose」就是可以單純地人爲控制輸出 High/Low
,而使用「Alternate Function」則會將控制 High/Low
的權利和責任交給指定的特殊功能,例如指定該 Pin 腳爲 UART-Tx,那我就沒辦法直接設定它要 High
還是 Low
,因爲 UART-Tx 的 High/Low
要依據其通訊協定和資料來決定,我們只能告訴 UART 要傳送的資料是什麼,再由 UART 來依據此資料自動控制該 Pin 腳的 High/Low
以完成通訊。
而「Push-Pull」和「Open-Drain」不知道要怎麼選的話,一般都是用「Push-Pull」,因爲它可以直接輸出強高或強低,但最好還是去詳細瞭解它們的差異。
另外,STM32 並非所有 Pin 腳都可以相容/承受 5V 的電壓,有些僅能 3.3V,且每個型號每支接腳都不一樣,在接電路或購買電子零件時,請查看 Datasheet 並多加留意是否需要電平轉換。
對於非 F1 系列的 STM32,要使用 AF 功能時,還有知道目標功能是「AF 幾?」。
以 STM32F446RE 爲例,在其 Datasheet DS10693 中的「Table 11. Alternate function」有把各個 AF 及其功能對應好。
例如要把 PA2 及 PA3 腳當成 USART2 的 Tx 與 Rx 使用的話,要設定這兩腳要啓用的 AF 爲「AF7」。
▲ GPIO 與 AF 功能的對應表。取自 DS10693 Rev10 P.57。
今天簡單說明了 STM32 GPIO 的模式,這些算是基本中的基本,只要弄清楚,未來在使用時就會輕鬆很多,明天終於要正式寫程式了。
另外,在 STM32 中,STM32F1 是一個比較特別的系列,它的一些設計及用法和其它系列不同(例如 AF 的設定、GPIO Remap),這點可以多注意一下。
p.s. 我其實一直不確定要怎麼翻譯「Alternate Function」比較貼切,只好先使用簡體圈常見的用詞。
本文同步發表於我的 Blog。