教程
視頻
博主教程
STM32系統結構圖
GPIO
GPIO(General Purpose Input/Output)是STM32內部的一種外設。
一個STM32芯片內存在多個GPIO外設,每個GPIO外設有16個引腳;
比如GPIOA:PA0~PA15;
GPIOB:PB0~PB15。
每個IO引腳都有輸入電路和輸出電路。
GPIO8種工作模式
鏈接
輸入模式
由上下拉電阻控制。
上拉模式如何保持高電平
工作原理:
-
當配置為上拉模式時,GPIO內部會連接一個上拉電阻(通常約30-50kΩ)到VDD
-
當沒有外部信號驅動時,上拉電阻會將引腳電壓拉至高電平
VDD(正電源)
下拉模式如何保持低電平
工作原理:
-
當配置為下拉模式時,GPIO內部會連接一個下拉電阻(通常約30-50kΩ)到GND
-
當沒有外部信號驅動時,下拉電阻會將引腳電壓拉至低電平
VSS(負電源/地)
輸出模式
由正負半導體控制 。
MOS
MOS(金屬氧化物半導體)。
PMOS中的"P"
-
P代表Positive(正)
-
當輸出高電平時導通
NMOS中的"N"
-
N代表Negative(負)
-
當輸出低電平時導通
推挽輸出
1上高,0下低;
開漏輸出
PMOS斷開,無效,只有NMOS在工作。
通用和復用輸出
復用輸出模式,與通用輸出模式很是類似。只是輸出的高低電平的來源,不是寫程序讓CPU直接寫輸出數據到寄存器,取而代之利用片上(stm32芯片上的)外設模塊來輸出電平信號。
注意:通用模式和復用模式接線不同。
GPIO編程控制步驟
1,使用RCC開啟GPIO的時鐘;
2,使用GPIO_Init()函數初始化GPIO;
3,使用輸出/輸出函數控制GPIO口。
GPIO的庫函數
設置GPIO引腳電平
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:設置指定GPIO端口的單個或多個引腳為高電平(置1)
參數:
-
GPIOx
:GPIO端口(如GPIOA、GPIOB等) -
GPIO_Pin
:要設置的引腳(可使用|
組合多個引腳)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:設置指定GPIO端口的單個或多個引腳為低電平(置0)
參數:
-
GPIOx
:GPIO端口 -
GPIO_Pin
:要清除的引腳(可使用|
組合多個引腳)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
功能:設置指定GPIO端口的單個引腳狀態
參數:
-
GPIOx
:GPIO端口 -
GPIO_Pin
:要設置的引腳(只能單個引腳) -
BitVal
:引腳狀態(Bit_SET
或Bit_RESET
)
// 設置GPIOC的Pin4為高電平
GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_SET);// 設置GPIOC的Pin4為低電平
GPIO_WriteBit(GPIOC, GPIO_Pin_4, Bit_RESET);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
功能:一次性設置整個GPIO端口的輸出狀態
參數:
-
GPIOx
:GPIO端口 -
PortVal
:16位值,表示所有引腳的狀態(每個bit對應一個引腳)
// 設置GPIOA所有引腳狀態:Pin0=1, Pin1=0, Pin2=1, 其他=0
GPIO_Write(GPIOA, 0x0005); // 二進制 0000 0000 0000 0101
獲取引腳輸入/輸出電平
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
什么時候使用input,什么時候使用output?
函數類別 | 讀取的數據來源 | 典型應用場景 |
---|---|---|
Input系列函數 | 讀取GPIO引腳當前輸入電平 | 檢測外部信號(按鍵、傳感器等) |
Output系列函數 | 讀取GPIO輸出寄存器的值 | 驗證軟件配置的輸出狀態 |
(1) 何時使用Input
函數
當GPIO配置為輸入模式或需要讀取實際引腳電平時:
檢測外部信號:
// 讀取PA0引腳電平(配置為輸入模式)
if(GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_0) == Bit_SET) {// 高電平處理(如按鍵按下)
}
讀取多個輸入引腳:
uint16_t port_val = GPIO_ReadInputData(GPIOB); // 讀取PB0-PB15所有引腳
(2) 何時使用Output
函數
當需要確認輸出寄存器的狀態(而非實際引腳電平)時:
驗證輸出配置:
// 檢查PC13輸出寄存器是否設置為高電平
if(GPIO_ReadOutputDataBit(GPIOC, GPIO_PIN_13) == Bit_SET) {// 軟件設置過輸出高電平
}
批量讀取輸出狀態:
uint16_t output_states = GPIO_ReadOutputData(GPIOD); // 讀取PD端口輸出寄存器
關鍵注意:
-
輸出函數讀取的是輸出數據寄存器(ODR)的值,不一定等于實際引腳電平!
-
若外部電路拉低/拉高引腳(如短路),實際電平可能與ODR值不同。