- 一、瞭解 MCU(GPIO)具有的所有複用功能
- 透過檢視 MCU 的資料手冊可以知道 MCU 的所有引腳的功能:
- 例 STM32L431:
- 例 stm32f103:
- 複用、重對映、多路複用(多功能引腳)
- GPIO複用(AF - Alternate Function)
- 重對映(Remapping)
- 多路複用(Multi-function)
- 常見引腳功能一覽表(stm32l431):
- 透過檢視 MCU 的資料手冊可以知道 MCU 的所有引腳的功能:
- 二、設定 GPIO 使用複用功能的步驟
- 透過檢視 MCU 的參考手冊可以知道 MCU 的所有引腳的功能的配置方法:
- 例 STM32L431(多路複用):
- 例 STM32F103:
- 透過檢視 MCU 的參考手冊可以知道 MCU 的所有引腳的功能的配置方法:
一、瞭解 MCU(GPIO)具有的所有複用功能
透過檢視 MCU 的資料手冊可以知道 MCU 的所有引腳的功能:
例 STM32L431:
目錄位置:
具體資訊:
- 引腳與引腳說明目錄下的 表14. 引腳表中使用的圖例/縮寫:
從這個表中我們可以知道引腳的型別有3種,分別為電源引腳(S)、僅輸入引腳(I)、輸入/輸出引腳(I/O);I/O結構有三種,5V 容忍 I/O(FT)、3.6V 容忍 I/O(TT)、帶嵌入式弱上拉電阻器的雙向復位引腳(RST),以及兩種TT或FT的可選項;引腳的功能有兩種,複用功能(透過 GPIOx AFR 暫存器選擇)、附加功能(透過外圍暫存器直接選擇/啟用)。以上這些應該都是比較常見的。
- 表15. 引腳定義:
這個表格中我們可以查到某型號 MCU 所有引腳編號對應的引腳名稱、引腳型別、I/O 結構、引腳功能。即 MCU 所有功能及其對應使用的引腳資訊。
- 表16. AF0 到 AF7 複用功能表(透過 GPIOx AFR 暫存器選擇):
這個表中我們可以的到複用功能標號 AF0 到 AF7 對應 GPIOx 引腳的複用功能。需要使用某個複用功能時只需檢視這個表,然後透過透過GPIOx AFR暫存器設定使用。
- 表17. AF8 到 AF15 複用功能表:
為表16的續表,複用功能標號 AF8 到 AF15 對應 GPIOx 引腳的複用功能。其實我們可以看到 stm32L431 是將所有 GPIO 引腳功能用功能按 AF0~AF15 編號
例 stm32f103:
目錄位置:
具體資訊:
與 stm32l431 不同,因為 stm32f103 還在使用重對映概念,所以資料手冊只有一個展示所有引腳功能的引腳定義表:
這個表格中我們可以查到某型號 MCU 所有引腳編號對應的引腳名稱、引腳型別、I/O 結構、引腳功能。即 MCU 所有功能及其對應使用的引腳資訊。
複用、重對映、多路複用(多功能引腳)
透過查閱 stm32L4 和 stm32F1 的參考手冊可以知道這兩款 mcu 的 GPIO 引腳複用的方式是有所不同的,其中 stm32F1 仍在使用重對映的概念,而 stm32L4 則使用的是多路複用概念。(以下為 glm-4 提供)
GPIO複用(AF - Alternate Function)
GPIO複用是指STM32的某些引腳可以除了提供標準的輸入輸出功能外,還可以被內建的外設(如定時器、串列埠、SPI、I2C等)用作特定的功能引腳。這些引腳通常被標記為AF(Alternate Function),表示它們有備選功能。
特點:
- 每個GPIO引腳可以有一個或多個複用功能。
- 在任何時刻,一個引腳只能啟用一個複用功能。
- 複用功能的選擇通常透過軟體配置。
配置步驟:
- 使能GPIO時鐘:透過RCC(Reset and Clock Control)來使能GPIO埠的時鐘。
- 使能外設時鐘:如果複用的外設不是預設使能的,需要透過RCC使能外設時鐘。
- 配置GPIO模式:將GPIO配置為複用功能模式(通常是
GPIO_Mode_AF_PP
或GPIO_Mode_AF_OD
)。
重對映(Remapping)
重對映功能允許設計者將某些內建外設的引腳功能重新分配到不同的GPIO引腳上。這是非常有用的,因為在某些封裝或板上空間受限的情況下,可能需要重新安排引腳的佈局。
特點:
- 重對映是透過配置特定的暫存器來實現的。
- 並非所有外設的引腳都可以重對映。
- 重對映可以減少PCB走線複雜度,減少訊號干擾。
配置步驟:
- 確定重對映選項:在資料手冊或參考手冊中查詢可用的重對映選項。
- 配置重對映暫存器:使用AFIO(Alternative Function Input/Output)的對映暫存器來設定重對映。
多路複用(Multi-function)
多路複用通常指的是一個引腳可以支援多個不同的複用功能。這意味著同一個引腳可以根據需要被不同的外設使用。
特點:
- 多路複用增加了設計的靈活性。
- 需要在軟體中進行選擇,以決定哪個功能被啟用。
- 通常,一個引腳的複用功能選擇是透過配置GPIO埠複用暫存器來實現的。
配置步驟:
- 選擇複用功能:根據設計需求,選擇需要啟用的複用功能。
- 配置GPIO埠:透過設定GPIO複用暫存器來選擇特定的複用功能。
在實際應用中,例如,STM32的一個GPIO引腳可能同時支援I2C和USART的功能。根據配置的不同,這個引腳可以作為I2C的資料線(SDA)或者作為USART的傳送(TX)或接收(RX)線。
在我看來多路複用概念是複用+重對映的整合,我認為其解決了複用+重對映功能複用不清晰、重對映使用複雜等問題,是利好程式設計師的最佳化,是GPIO複用更易用了。對於使用多路複用概念的 mcu,進行 GPIO 引腳複用時只需查詢複用功能表找到對應引腳複用功能編號,然後進行相應配置即可,無需考慮重對映問題,清晰明瞭。
常見引腳功能一覽表(stm32l431):
功能型別 | 功能名稱 | 中文資訊 |
---|---|---|
MCO | MCO | 是 "Main Clock Output" 的縮寫, 意為主時鐘輸出。 |
JTAG[1] | JTMS:JTAG 模式選擇(控制訊號)引腳 JTCK:JTAG 時鐘引腳 JTDI:JTAG 序列輸入引腳 JTDO:JTAG 序列輸出引腳 NJTRST[2]:非 JTAG 的 TRST(復位引腳)引腳 |
JTAG 除錯介面 |
SWD[3] | SWDIO:序列資料輸入輸出引腳 SWCLK:序列線時鐘引腳 |
序列線除錯介面 |
RTC[4] | RTC_OUT:實時時鐘的輸出引腳 RTC_REFIN:參考時鐘輸入引腳 |
實時時鐘 |
Trace | TRACECK[5]:跟蹤時鐘引腳 TRACED:跟蹤資料輸出引腳 |
跟蹤 |
LPUART[6] | LPUART_RX:低功耗串列埠接收引腳 LPUART_TX:低功耗串列埠傳送引腳 LPUART_CTS:低功耗串列埠清除傳送引腳 LPUART_RTS _DE:低功耗串列埠請求傳送/資料使能引腳 |
低功耗序列通訊介面 |
TIM1/TIM8 | TIM1_CH1:定時器通道1引腳 TIM1_CH1N:定時器通道1互補輸出[7]引腳 TIM1_ETR:定時器外部觸發輸入引腳 TIM1_BKIN:定時器斷點輸入 TIM1_BKIN_ COMP |
高階控制定時器 |
TIMx | TIMx_CH1:定時器通道1引腳 TIMx_ETR:定時器外部觸發輸入引腳 |
通用定時器 |
TIM6/TIM7 | - | 基本定時器 |
LPTIM | LPTIM_OUT:低功耗定時器輸出引腳 LPTIM_IN:低功耗定時器輸入引腳 LPTIM_ETR:低功耗定時器外部觸發輸入引腳 |
低功耗定時器 |
IR_OUT | IR_OUT | 紅外輸出 |
CAN[8] | CAN_RX:CAN 匯流排接收引腳 CAN_TX:CAN 匯流排傳送引腳 |
控制器區域網匯流排 |
TSC[9] | TSC_Gx_IO:TSC 通用輸入輸出引腳 TSC_SYNC:TSC 同步輸入引腳 |
觸控感應控制器外設 |
SPI[10] | SPI_SCK:SPI 時鐘訊號引腳 SPI_NSS:SPI 片選訊號引腳 SPI_MISO:SPI 主輸入從輸出引腳 SPI_MOSI:SPI 主輸出從輸入引腳 |
序列外設介面 |
QUADSPI[11] | QUADSPI_ BK1_NCS:QSPI Bank1 晶片選擇訊號引腳 QUADSPI_CLK:QSPI 時鐘訊號引腳 QUADSPI_BK1_IO:QSPI Bank1 晶片(外設)輸入輸出引腳 |
四線序列外設介面 |
USART[12] | USART_RX:USART 接收引腳 USART_TX:USART 傳送引腳 USART_CK:USART 時鐘引腳 USART_CTS:USART 清除傳送(控制流)引腳 USART2_RTS_DE:USART 請求傳送/資料使能引腳 |
通用同步/非同步序列通訊介面 |
I2C[13] | I2C_SMBA:I2C 系統管理匯流排(SMBus)警報引腳 I2C_SCL:I2C 時鐘引腳 I2C_SDA:I2C 序列資料引腳 |
積體電路間序列通訊匯流排 |
SWPMI[14] | SWPMI_RX:SWPMI 接收引腳 SWPMI_TX:SWPMI 傳送引腳 SWPMI_SUSPEND:SWPMI 掛起引腳 SWPMI_IO :SWPMI 輸入輸出引腳 |
單線協議主控介面 |
SDMMC[15] | SDMMC_D:SDMMC 資料引腳 SDMMC_CK:SDMMC 時鐘引腳 SDMMC_CMD:SDMMC 命令引腳 |
儲存卡介面 |
SAI[16] | SAI_EXTCLK:SAI 外部時鐘輸入引腳 SAI_MCLK_A:SAI 埠 A 主時鐘輸入引腳 SAI_SCK_A:SAI 埠 A 時鐘引腳 SAI_FS_A:SAI 埠 A 幀同步輸入引腳 SAI_SD_A:SAI 埠 A 序列資料輸出引腳 |
序列音訊介面 |
COMP | COMP_OUT:COMP 輸出引腳 | 模擬比較器 |
EVENTOUT | EVENTOUT | 可程式設計的事件觸發輸出引腳 |
想要了解 JTAG 和 SWD 的區別可以看這兩篇文章:SWD 與 JTAG 的區別與聯絡、下載除錯介面 SWD 和 JTAG的區別
想要詳細瞭解 SPI 和 QSPI 可以瀏覽:25. SPI—讀寫序列FLASH、21. QSPI—讀寫序列FLASH、簡單介紹SPI/Dual SPI/Quad SPI幾種通訊模式的差異
二、設定 GPIO 使用複用功能的步驟
透過檢視 MCU 的參考手冊可以知道 MCU 的所有引腳的功能的配置方法:
例 STM32L431(多路複用):
- 開啟需配置複用的 GPIO 埠時鐘
- 開啟需複用的功能(外設)的時鐘
- 配置使用複用功能的 GPIO 埠引腳的 GPIO 暫存器
- GPIO 埠模式暫存器對應引腳置為 10--複用功能模式
- GPIO 埠輸出型暫存器、輸出速度暫存器、上拉/下拉暫存器對應引腳位置按外設 GPIO 配置表[17]進行配置
- GPIO 複用功能暫存器配置對應引腳位置為複用功能編號(AFx)
- 配置對應複用功能暫存器組
目錄位置:
部分資訊:
例 STM32F103:
- 開啟需配置複用的 GPIO 埠時鐘
- 開啟需複用的功能(外設)的時鐘
- 按外設 GPIO 配置表[17:1]配置使用複用功能的 GPIO 埠配置暫存器的對應引腳位
- 配置對應複用功能暫存器組
若使用重對映功能:
- 開啟需配置複用的 GPIO 埠時鐘
- 開啟需複用的功能(外設)的時鐘
- 按外設 GPIO 配置表[17:2]配置使用複用功能的 GPIO 埠配置暫存器的對應引腳位
- 開啟 AFIO 時鐘
- 配置複用重對映和除錯 I/O 配置暫存器(AFIO_MAPR[18])
- 配置對應複用功能暫存器組
JTAG 是聯合測試工作組(Joint Test Action Group)的簡稱,是在名為標準測試訪問埠和邊界掃描結構的 IEEE 的標準 1149.1 的常用名稱。此標準用於驗證設計與測試生產出的印刷電路板功能。 ↩︎
NJTRST 是非 JTAG TRST(Non-JTAG TRST)的縮寫。在 JTAG 除錯介面中,TRST(Test Reset)訊號用於復位 JTAG 鏈上的所有裝置。NJTRST 通常被用於與 JTAG 介面相容的裝置中,但是這些裝置可能不支援標準的 JTAG 復位。透過使用 NJTRST,可以實現對這些裝置的復位功能,而不依賴於標準的 JTAG TRST 訊號 。 ↩︎
SWD 是序列線除錯(Serial Wire Debug)的簡稱,是 ARM 專門設計的協議,僅支援 ARM(所以在 ARM 系列微控制器中效能表現較佳)。 ↩︎
RTC 是實時時鐘(Real-Time Clock)的縮寫。實時時鐘是一個獨立的定時器。 RTC模組擁有一組連續計數的計數器,在相應軟體配置下,可提供時鐘日曆的功能。修改計數器的值可以重新設定系統當前的時間和日期。 ↩︎
TRACECK 是跟蹤時鐘(Trace Clock)的縮寫。TRACECK 通常用於連線到除錯介面(如 SWD 或 JTAG)上,以支援實時跟蹤程式執行流程、除錯程式碼、效能分析和軟體最佳化等功能。 ↩︎
LPUART 是低功耗通用非同步收發器(Low Power Universal Asynchronous Receiver Transmitter)的縮寫。LPUART1 是 STM32 系列微控制器中的一個序列通訊介面,具有低功耗特性,適用於對功耗要求較高的應用場景。 ↩︎
互補輸出:TIM1_CH1N 提供與 TIM1_CH1 相位相反的訊號。當 TIM1_CH1 輸出高電平時,TIM1_CH1N 輸出低電平,反之亦然。這非常適合驅動電機的上下橋臂,以實現電流方向的切換。 ↩︎
CAN 是控制器區域網匯流排(Controller Area Network)的縮寫,是一種廣泛應用於汽車和工業領域的序列通訊協議,用於在節點之間進行資料通訊。 ↩︎
TSC 是觸控感應控制器外設(Touch Sensing Controller)的縮寫,是一種整合在 STM32 微控制器中的功能模組,用於實現觸控感應功能。該模組允許您透過觸控式螢幕、觸控按鈕、滑動控制元件等方式與裝置進行互動。 ↩︎
SPI 協議是由摩托羅拉公司提出的通訊協議——序列外設介面(Serial Peripheral Interface)的縮寫,是一種高速全雙工的通訊匯流排。它被廣泛地使用在 ADC、LCD 等裝置與 MCU 間,要求通訊速率較高的場合。 ↩︎
QSPI 是四線序列外設介面(Queued SPI)的縮寫,是 Motorola 公司推出的 SPI 介面的擴充套件,比 SPI 應用更加廣泛。在 SPI 協議的基礎上,Motorola 公司對其功能進行了增強,增加了佇列傳輸機制,推出了佇列序列外圍介面協議(即 QSPI 協議)。QSPI 是一種專用的通訊介面,連線單、雙或四(條資料線) SPI Flash 儲存介質。 ↩︎
USART 代表通用同步/非同步序列介面(Universal Synchronous/Asynchronous Receiver/Transmitter)。USART 是一種通用的序列通訊介面,常見於微控制器和外部裝置之間的通訊。它可以支援同步傳輸(使用外部時鐘)和非同步傳輸(使用特定的波特率)兩種模式。 ↩︎
I2C 通訊協議(Inter-Integrated Circuit)是由 Phiilps 公司開發的,由於它引腳少,硬體實現簡單,可擴充套件性強, 不需要USART、CAN 等通訊協議的外部收發裝置,現在被廣泛地使用在系統內多個積體電路(IC)間的通訊。I2C 模組有多種用途,包括 CRC 碼的生成和校驗、 SMBus(系統管理匯流排—System Management Bus)和 PMBus(電源管理匯流排—Power Management Bus)。 ↩︎
SWP 協議即單線協議(Single Wire Protocol),是目前 在ETSI 已有成熟技術要求和測試方法的一種用於在非接觸通訊模組(ContactLess Frontend: CLF)與 USIM 卡間傳輸資訊的介面協議,確切來說 SWP 協議定義了 CLF 模組和 USIM 卡內的 SE 晶片傳輸資訊的物理連線形式和底層訊號傳輸要求等(包括物理層、資料鏈路層);SWPMI 是單線協議主介面(Single Wire Protocol Master Interface)的縮寫,SWPMI 旨在根據ETSI TS 102 613 標準中定義的單線協議實現全雙工單線通訊;某些 STM32 還嵌入了 SWP 收發 SWPMI 對應於第 2 層(資料鏈路層),SWP 收發器對應於第 1 層(物理層)。 ↩︎
SDMMC 是 Secure Digital Memory Card(SD卡)MultiMediaCard(多媒體卡)介面的縮寫,是一種用於連線 SD 卡和 MMC 卡的介面標準。SD 卡是一種常見的用於儲存資料的快閃記憶體儲存卡,而 MMC 卡也是一種類似的快閃記憶體儲存卡。SDMMC 介面標準定義了一種用於在計算機系統和這些儲存卡之間進行資料傳輸的通訊協議。 ↩︎
SAI 是序列音訊介面(Serial Audio Interface)的縮寫,是一種用於在數字音訊裝置之間傳輸音訊資料的序列通訊介面。SAI 通常用於連線音訊編解碼器、數字訊號處理器、音訊介面等裝置,用於實現音訊資料的傳輸和處理,具有靈活性高、配置多樣等特點,可支援多種音訊協議。 ↩︎
在 stm32f1 參考手冊中有一張 外設的 GPIO 配置表,其給出了 GPIO 配置各種複用功能時需要設定的 GPIO 配置,在 stm32l4 參考手冊中我並沒有找到這張表。以下為表的位置和部分資訊: ↩︎ ↩︎ ↩︎
AFIO 還有其他暫存器,這裡就不細講了,詳情可參見《STM32F10xxx參考手冊》8.4節。 ↩︎