STM32之GPIO輸入


本文介紹如何使用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為高電平,程序繼續運行時會跳轉到高電平部分。

 

 

源碼下載:(不包括工程文件和庫文件)

https://files.cnblogs.com/files/greatpumpkin/GPIO_input.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM