STM32外設-GPIO輸出(不含復用)
- 一,GPIO模式簡介
- 1,輸入模式
- 2,輸出模式
- 3,模擬模式
- 4,復用模式
- 二,輸出模式詳解
- 1, 輸出類型
- 1,推挽輸出:
- 2,開漏輸出
- 2,輸出速度
- 三,GPIO配置選項
- 四,STM32 HAL庫GPIO配置
- 1,GPIO初始化結構體
- 2,引腳復用機制
- 3,GPIO時鐘使能
- 4,GPIO操作函數
GPIO(通用輸入/輸出口)是微控制器上可以由用戶自定義控制的引腳
一,GPIO模式簡介
1,輸入模式
將引腳配置為輸入模式,用于讀取外部信號。
適用場景:讀取按鈕狀態、傳感器信號等
2,輸出模式
將引腳配置為輸出模式,用于驅動外部設備或信號。
適用場景:LED控制、電機驅動等
3,模擬模式
將引腳配置為模擬模式,用于模擬信號輸入或輸出。
適用場景:ADC讀取、DAC輸出等
4,復用模式
將引腳配置給某個外設的使用,如UART、SPI或I2C等。
適用場景:通信接口、定時器輸出等
二,輸出模式詳解
1, 輸出類型
共有兩種輸出類型:推挽輸出模式和開漏輸出模式,先講一下電路原理
1,推挽輸出:
下圖是STM32引腳電路原理圖,右邊兩個二極管只起 保護作用,暫時省略
我們通過HAL庫的API接口函數對寄存器寫入0/1,從而控制P-MOS和N-MOS的截止,達到輸出高低電平的目的:
當P-MOS導通,N-MOS截止時,N-MOS處是斷路,上面VDD和P-MOS處是短路,測出引腳電壓為VDD(將電流推出去)
(其實VDD和P-MOS有阻抗,但是直接測引腳電壓就相當于測的是內阻的電壓,沒有其他電阻分壓測出來就是VDD)
如果此時在引腳處接一個LED,LED會被點亮
當P-MOS截止,N-MOS導通時,P-MOS處是斷路,上面N-MOS處是短路,此時引腳輸出低電平(將電流挽進來)
2,開漏輸出
開漏輸出可以輸出低電平和高阻態,開漏輸出時P-MOS永遠截止,輸出哪個狀態取決于N-MOS的截止和導通(為什么叫開漏?N-MOS管的漏極的開與關決定了開漏模式的輸出)
當N-MOS導通時,開漏輸出與推挽輸出一致,輸出低電平
而當N-MOS截止時,輸出的是高阻態,為什么輸出的是高阻態?
了解高阻態的定義:引腳與電源和地之間呈現高電阻狀態,即高阻態。此時輸出引腳不對外提供確定電平信號,其電平由外部電路決定。
那高阻態有什么作用呢?
作用1:改變芯片輸出的電平。如下圖,STM32引腳輸出3.3V,但我想讓其輸出5V,可以在引腳外接一個上拉電阻1(假設為10K),根據分壓原理,N-MOS阻值無窮大,綠點處是5V
作用2:利用高阻態的線與特性
線與:即只有當所有連接在一起的輸出端口都輸出高電平時,總的輸出才為高電平;只要有一個輸出端口為低電平,總的輸出就是低電平 。
線或:只要連接的輸出端口中有一個輸出高電平,總的輸出就為高電平;只有當所有輸出端口都為低電平時,總的輸出才是低電平 。
如下圖,兩個芯片外接一個上拉電阻,只有當兩個引腳同時為高阻態時,才能輸出高電平,有一個引腳輸出低電平就輸出低電平
若 GPIO 配置為開漏輸出模式,默認就是高阻態狀。開漏輸出下,N-MOS 管用于控制輸出,無外部上拉電阻時,N-MOS 管截止就會呈現高阻態 。 此外,當復用功能輸出信號未有效驅動、相關寄存器配置錯誤,或芯片處于特定低功耗模式影響 GPIO 驅動電路時,也可能使輸出進入高阻態。
-
推挽輸出模式 (Push-Pull)
功能:可以驅動高電平(邏輯1)和低電平(邏輯0)
工作原理:有兩個晶體管配置,一個用于拉高電平,一個用于拉低電平
優點:驅動能力強,適用于大多數數字輸出應用
缺點:高頻切換時可能導致較大功耗和信號干擾
應用示例:LED控制、開關控制、信號輸出 -
開漏輸出模式 (Open-Drain)
功能:只能拉低電平(邏輯0),高電平由外部上拉電阻提供
工作原理:只有一個下拉晶體管,高電平依賴外部上拉電阻
優點:支持多路信號線"線與"邏輯,適合共享總線
缺點:無法直接驅動高電平,需要外部電阻
應用示例:I2C總線、外部信號線共享 -
推挽輸出 vs 開漏輸出
特性 | 推挽輸出 | 開漏輸出 |
---|---|---|
高電平驅動 | ? 內部提供 | ? 需要外部上拉 |
低電平驅動 | ? 內部提供 | ? 內部提供 |
多設備共享總線如iic總線 | ? 不適合 | ? 適合 |
電流驅動能力 | ? 較強 | ? 取決于上拉電阻 |
LED控制適用性 | ? 非常適合 | ? 需要外部上拉 |
相對于51單片機只有輸出0和1兩種情況,STM32輸出變復雜有什么好處?
2,輸出速度
先來解釋一下什么是輸出驅動電路帶寬和不失真信號:
輸出驅動電路帶寬:指輸出驅動電路能夠不失真地傳輸信號的頻率范圍,單位通常是赫茲(Hz) 即范圍。也就是說,帶寬越大,電路能夠承受的信號頻率越大,能傳輸的信號頻率越高,信號的變化速度就可以越快。
不失真信號:信號傳輸時,不發生變化的信號。
舉個例子:cpu執行程序先輸出高電平,在輸出低電平,最后輸出高電平,如果信號變化很快,超出了IO的帶寬,IO在輸出高低高時,可能會發生:先輸出高,本該變成低時沒有反應過來,此時CPU又讓IO輸出高,整體來看,IO是一直輸出高電平,發生了信號失真
GPIO 輸出驅動電路主要由晶體管(通常是 MOS 管)構成,通過控制這些晶體管的導通和截止來實現信號的輸出
那么STM32是如何控制輸出高速信號和低速信號的呢?
有一個思路是更改高速晶體管和低速晶體管,但實際上是:改變晶體管導通和截止的速度。
-
低速 (Low Speed) 對應2-10MHz
特性:輸出驅動電路帶寬低,能通過的不失真信號最大頻率低 。信號電平轉換相對慢,功耗小、噪聲低,產生的電磁干擾(EMI)2也較小
適用場景:按鍵、LED控制等低頻應用 -
中速 (Medium Speed) 對應10-50MHz
特性:輸出驅動電路帶寬適中,信號電平轉換速度適中。
適用場景:一般通信接口、顯示驅動等 -
高速 (High Speed) 對應50-100MHz
特性:輸出驅動電路帶寬高,能通過高頻信號,信號電平轉換速度快。
適用場景:高速總線、快速數據傳輸等 -
超高速 (Very High Speed) 對應100MHz+
特性:輸出驅動電路帶寬更高,信號電平轉換迅速。
適用場景:高速存儲器接口、高速數據采集等
注意
更高的速度會導致:
更多的功耗
更大的電磁干擾(EMI)
更快的信號上升和下降時間
對于LED控制這類應用,通常選擇低速即可,這能降低功耗并減少EMI。
因此,在實際應用中,需要根據具體的需求來合理選擇 GPIO 的輸出速度,在速度、功耗和 EMI 之間找到一個平衡點。
三,GPIO配置選項
再用STM32CubeMX配置GPIO引腳時,需要對下圖紅框的配置選項進行配置,下面我將將所有的配置選擇都介紹一下
- GPIO Mode (GPIO模式)
決定引腳的基本工作方式,是STM32CubeMX中最基礎的配置項。
Input Mode (輸入模式) | Output Mode (輸出模式) | Analog Mode (模擬模式) | Alternate Function (復用功能) |
---|---|---|---|
配置引腳為輸入,用于讀取外部信號 | 配置引腳為輸出,用于控制外部設備 | 配置引腳為模擬模式,用于ADC/DAC | 連接內部外設如UART/SPI/I2C等 |
配置提示: 對于LED控制,通常選擇Output Mode。如果需要通過PWM控制LED亮度,則選擇Alternate Function并連接到定時器。
- GPIO Output Type (輸出類型)
當GPIO配置為輸出模式時,可以選擇不同的輸出類型。
Push-Pull (推挽輸出) | Open-Drain (開漏輸出) |
---|---|
可以主動輸出高電平和低電平,驅動能力強。 | 只能主動輸出低電平,高電平需要外部上拉電阻。 |
高電平:主動拉高 低電平:主動拉低 | 高電平:依靠外部上拉 低電平:主動拉低 |
LED控制 數字信號輸出 | I2C總線 多設備共享總線 |
配置提示: 對于一般的LED控制,選擇Push-Pull輸出類型。對于需要共享總線的場景(如I2C),選擇Open-Drain輸出類型。
- GPIO Speed (輸出速度)
決定GPIO引腳狀態切換的速率和驅動能力。更高的速度設置意味著更快的電平切換速率和更強的電流驅動能力。
速度設置 | 最大頻率 | 適用場景 |
---|---|---|
Low (低速) | ~2MHz | 低功耗應用、LED指示燈 |
Medium (中速) | ~10MHz | 一般數字接口、按鍵控制 |
High (高速) | ~50MHz | SPI通信、快速信號處理 |
Very High (超高速) | ~100MHz+ | 高速通信接口、時鐘信號 |
配置提示: 對于普通LED控制,選擇Low速度即可。更高的速度會增加功耗和電磁干擾,除非應用需要,否則不要選擇過高的速度設置。
- GPIO Pull-up/Pull-down (內部的上拉/下拉電阻)
決定GPIO引腳在未被驅動時的默認狀態。
No Pull-up/Pull-down | Pull-up (上拉) | Pull-down (下拉) |
---|---|---|
不啟用內部上拉/下拉電阻,引腳浮空。 | 啟用內部上拉電阻,引腳默認為高電平。 | 啟用內部下拉電阻,引腳默認為低電平。 |
模擬輸入 外部已有定義電平 | 按鍵檢測 I2C總線 | 上拉型開關檢測 默認低電平信號 |
- GPIO Label (引腳標簽)
為GPIO引腳指定一個有意義的名稱,方便在代碼中引用。
命名規范:
使用有描述性的名稱,如 LED_GREEN、BUTTON_USER
避免使用特殊字符,使用下劃線分隔單詞
保持命名一致性,便于代碼維護
命名示例:
功能 | 推薦標簽名 |
---|---|
LED指示燈 | LED_RED, LED_GREEN, LED1, LED2 |
按鍵輸入 | BUTTON_USER, KEY1, KEY2 |
傳感器控制 | SENSOR_ENABLE, TEMP_ALERT |
配置提示: 合理命名GPIO引腳可以大大提高代碼的可讀性和可維護性。CubeMX會根據標簽名自動生成相應的宏定義,方便在代碼中使用。
- GPIO Signal (引腳信號)
STM32的每個GPIO引腳通常可以復用為多個不同的外設信號。例如,一個引腳可能既可以作為USART1的TX,也可以作為TIM2的通道3,還可以作為SPI3的MOSI。那么如何在CubeMX中實現GPIO引腳復用呢?
首先將GPIO配置為復用功能(Alternate Function)模式,“Signal” 選項用于指定該引腳連接到STM32內部的哪個外設的哪個具體信號。
然后通過在CubeMX的"Signal"下拉列表中選擇,或者直接在代碼中配置GPIO的 Alternate 字段(使用HAL庫時),可以決定該引腳當前連接到哪個外設信號。
最后提供一些常見的復用功能信號類型:
TIM1_CH1 (定時器通道)
USART1_TX (串口發送)
USART1_RX (串口接收)
SPI1_SCK (SPI時鐘)
SPI1_MISO (SPI主入從出)
SPI1_MOSI (SPI主出從入)
I2C1_SCL (I2C時鐘線)
I2C1_SDA (I2C數據線)
ADC1_IN0 (ADC輸入通道)
DAC1_OUT1 (DAC輸出通道)
TIMx_CHx (定時器通道)
TIMx_ETR (外部觸發)
TIMx_BKIN (剎車輸入)
USARTx_TX (串口發送)
USARTx_RX (串口接收)
USARTx_CK (同步時鐘)
USARTx_CTS (流控)
USARTx_RTS (流控)
I2Cx_SCL (I2C時鐘)
I2Cx_SDA (I2C數據)
SPIx_SCK (SPI時鐘)
SPIx_MISO (主入從出)
SPIx_MOSI (主出從入)
SPIx_NSS (片選)
I2Sx_CK (I2S時鐘)
I2Sx_WS (字選)
I2Sx_SD (串行數據)
CANx_TX (CAN發送)
CANx_RX (CAN接收)
USB_OTG_FS/HS_…
ETH_… (以太網)
SDMMCx_… (SD卡)
QUADSPI_… (QSPI)
SYS_… (系統功能, 如SWD, JTAG)
RCC_… (時鐘輸出, 如MCO)
EVENTOUT (事件輸出)
LED控制相關的信號類型:
TIMx_CHx - 定時器PWM輸出通道,用于控制LED亮度
GPIO_Output - 普通GPIO輸出,用于簡單的LED開關控制
配置示例:通過PWM實現LED亮度控制或呼吸燈效果:
將目標GPIO引腳的模式設置為 Alternate Function Push-Pull (通常推挽輸出效果更好)。
在 “Signal” 下拉列表中,選擇一個可用的 TIMx_CHx (定時器通道) 信號。
轉到對應的 TIMx 外設配置界面。
配置定時器的時鐘源和預分頻器(Prescaler)、自動重載寄存器(ARR)以設定PWM頻率。
啟用所選的 Channel x,并將其模式設置為 PWM Generation CHx。
配置比較寄存器(CCR / Pulse)的值來控制PWM占空比,從而控制LED亮度。
重要提示:務必查閱STM32芯片的數據手冊(查找 “Alternate function mapping” 相關表格),確認所選引腳支持你想要連接的定時器通道。并非所有引腳都支持所有定時器的所有通道。
四,STM32 HAL庫GPIO配置
STM32 HAL(Hardware Abstraction Layer,硬件抽象層)庫提供了一套完整的API來配置和控制GPIO引腳。相比直接操作寄存器,HAL庫更易用且可移植性更好。
1,GPIO初始化結構體
HAL庫使用GPIO_InitTypeDef結構體來配置GPIO引腳:
Pin: 要配置的引腳,如GPIO_PIN_0, GPIO_PIN_1等
Mode: 引腳模式,如GPIO_MODE_OUTPUT_PP(推挽輸出)
Pull: 上拉/下拉設置,如GPIO_NOPULL, GPIO_PULLUP等
Speed: 輸出速度,如GPIO_SPEED_FREQ_LOW
Alternate: 復用功能選擇(僅在復用模式下使用)
2,引腳復用機制
STM32微控制器的GPIO引腳可以分配給不同的外設功能,這稱為引腳復用(Alternate Function):
每個引腳可以有多達16個不同的復用功能(AF0-AF15)
例如,同一個引腳可以配置為UART發送、SPI時鐘或I2C數據線
復用功能在芯片手冊中有詳細說明,不同系列和型號的STM32有所不同
使用GPIO_MODE_AF_PP或GPIO_MODE_AF_OD模式并設置相應的AF值
3,GPIO時鐘使能
在STM32中,使用任何外設前都必須使能其時鐘:
使用__HAL_RCC_GPIOx_CLK_ENABLE()宏來使能GPIO端口時鐘
這一步驟在配置GPIO前必須完成,否則配置無效
不同的GPIO端口(GPIOA, GPIOB等)需要單獨使能
4,GPIO操作函數
HAL庫提供了多種操作GPIO的函數:
HAL_GPIO_WritePin(): 設置引腳輸出高/低電平
HAL_GPIO_ReadPin(): 讀取引腳輸入狀態
HAL_GPIO_TogglePin(): 翻轉引腳狀態
HAL_GPIO_LockPin(): 鎖定引腳配置
HAL_GPIO_EXTI_IRQHandler(): 中斷處理
這些函數屏蔽了底層寄存器操作的復雜性,使得代碼更清晰易讀。
什么是上拉電阻?什么是下拉電阻
一,上拉電阻和下拉電阻的概念
下圖中,單片機引腳輸出5V高電平,什么都不接的情況下,測試為5V
但接了一個下拉電阻后,輸出3.8V:原因是單片機內部P-MOS含有阻抗,對5V進行了分壓
在此基礎上,再接一個上拉電阻,輸出變成了4.2V:原因是外部電阻和P-MOS的阻抗并聯,總阻抗減小,輸出有升高了0.4V
二,上拉電阻的作用:將高阻態鉗位在高電平
開漏輸出高阻態時,單片機內部兩個MOS截止,阻抗無窮大,此時在外部接一個上拉電阻(10K),它與P-MOS并聯后總阻值約為10K,和N-MOS相比幾乎不分電壓,最終輸出5V
??
電磁兼容性(EMC)和電磁干擾(EMI)
電磁兼容性(EMC)
定義:設備或系統在其電磁環境中能正常工作,且不對該環境中其他設備產生難以承受的電磁干擾的能力 。
原理:通過合理的電路設計(如濾波、屏蔽 )、接地處理等措施,減少自身產生的電磁干擾,同時增強對外部電磁干擾的抵抗能力。
作用:保證多個電子設備在同一環境中能互不干擾、穩定運行,提高整個系統的可靠性。
電磁干擾(EMI)
定義:由電磁場引起的對電子設備、電氣設備或電磁設備的有害影響 。可分為傳導干擾(通過導電介質傳播 )和輻射干擾(通過空間以電磁波形式傳播 )。
原理:電子設備工作時,內部的電流變化、信號傳輸等會產生電磁波,若不加以抑制,就會干擾其他設備。
作用:會造成信號失真、設備誤動作等問題,影響設備正常工作,所以在電子產品設計中要采取措施抑制 EMI。 ??