本文介紹如何使用STM32標准外設庫讀取GPIO輸入信號,GPIO為通用輸入輸出端口,輸入功能即讀取STM32的一個或多個引腳輸入的是高電平還是低電平,從而實現檢測接入該引腳的電路情況之目的,最簡單直觀的應用為檢測按鍵的按下和彈起,本例程讀取GPIOA的Pin0。
本文適合對單片機及C語言有一定基礎的開發人員閱讀,MCU使用STM32F103VE系列。
GPIO輸入分為兩部分,初始化和控制。
1. 初始化項目
初始化分為三步,包括時鍾啟用、結構體初始化和初始化庫函數調用。
1.1. 開啟指定GPIO時鍾
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
1.2. 結構體
typedef struct { uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef;
- 引腳:配置需要輸出的引腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- 輸入輸出模式:共8種
其中輸入四種:模擬、浮空、上拉、下拉
對於按鍵輸入來說,一般使用浮空輸入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
1.3. 庫函數
設置完結構體之后調用庫函數,初始化GPIOA
GPIO_Init(GPIOA, &GPIO_InitStructure);
2. 控制:讀取電平
輸入信號分為兩種:輸入高電平和輸入低電平,通過調用控制庫函數實現。
- 判斷輸入高電平
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1
- 判斷輸入低電平
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0
- 讀取電平
uint8_t inputDataBit;
inputDataBit = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
完整代碼(僅自己編寫的部分)
1 void GPIO_Input_Config(void) 2 { 3 /*定義一個GPIO_InitTypeDef類型的結構體*/ 4 GPIO_InitTypeDef GPIO_InitStructure; 5 6 /*開啟指定端口的GPIO外設時鍾*/ 7 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 8 9 /*選擇要控制的GPIO引腳*/ 10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 11 12 /*設置引腳模式為浮空輸入*/ 13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 14 15 /*調用庫函數,初始化GPIO*/ 16 GPIO_Init(GPIOA, &GPIO_InitStructure); 17 } 18 19 void delay_ms(__IO uint32_t ms) 20 { 21 uint32_t i; 22 SysTick_Config(SystemCoreClock / 1000); 23 24 for(i = 0; i < ms; i++) 25 { 26 // 當計數器的值減小到0的時候,CTRL寄存器COUNTFLAG會置1,置1后,該位清零 27 while( !((SysTick->CTRL) & SysTick_CTRL_COUNTFLAG_Msk) ); 28 } 29 // CTRL寄存器ENABLE寄存器置零,關閉SysTick定時器 30 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; 31 } 32 33 int main(void) 34 { 35 uint8_t inputDataBit; 36 37 /* 端口初始化 */ 38 GPIO_Input_Config(); 39 40 while(1) 41 { 42 inputDataBit = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); 43 44 if(inputDataBit == 1){ //高電平 45 delay_ms(100); 46 }else if(inputDataBit == 0){ //低電平 47 delay_ms(200); 48 } 49 } 50 }
仿真結果
程序編譯成功后,點擊開始仿真,打開菜單欄Peripherals→General Purpose I/O→GPIOA,默認Pin0為低電平,程序單步運行時會跳轉至低電平部分,鼠標點擊Pins最后一位,顯示√表示引腳Pin0為高電平,程序繼續運行時會跳轉到高電平部分。