STM32之GPIO輸出


本文介紹如何使用STM32標准外設庫對GPIO進行輸出控制,GPIO為通用輸入輸出端口,輸出功能即控制STM32的一個或多個引腳輸出高電平或者低電平,從而實現控制接入該引腳的其他電路之目的,最簡單直觀的輸出應用為控制LED燈的亮滅,本例程控制GPIOB的Pin5輸出高電平和低電平。

本文適合對單片機及C語言有一定基礎的開發人員閱讀,MCU使用STM32F103VE系列。

 

GPIO輸出分為兩部分,初始化和控制。

1.    初始化

初始化分為三步,包括時鍾啟用、結構體初始化和初始化庫函數調用。

1.1. 時鍾啟用

啟用GPIOB時鍾

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 

1.2.結構體初始化

1 typedef struct {
2   uint16_t GPIO_Pin;
3   GPIOSpeed_TypeDef GPIO_Speed;
4   GPIOMode_TypeDef GPIO_Mode;
5 }GPIO_InitTypeDef;
  • 引腳:配置需要輸出的引腳,第5個引腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;   
  • 速度:共3種

如果對功耗要求不嚴格,把速度設置為最大

如果對速度要求不嚴格,把速度設置為最小

常用的就是最大:50MHz  

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  • 輸入輸出模式:共8種

其中輸出兩種:推挽、開漏

對於輸出來說,常用的就是推挽輸出模式 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

1.3. 初始化庫函數調用

設置完結構體之后調用初始化庫函數,初始化GPIOB:

GPIO_Init(GPIOB, &GPIO_InitStructure); 

 2.    控制

控制分為兩種:輸出高電平和輸出低電平,通過調用控制庫函數實現。

  • 輸出高電平
GPIO_SetBits(GPIOB, GPIO_Pin_5);
  • 輸出低電平
GPIO_ResetBits(GPIOB, GPIO_Pin_5);

 

完整代碼(僅自己編寫的部分)

 1 void GPIO_Output_Config(void)
 2 {        
 3     //定義一個GPIO_InitTypeDef類型的結構體
 4     GPIO_InitTypeDef GPIO_InitStructure;
 5 
 6     //開啟指定端口的GPIO外設時鍾
 7     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 8     
 9     //選擇要控制的GPIO引腳
10     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;    
11 
12     //設置引腳速率為50MHz
13     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
14 
15     //設置引腳模式為通用推挽輸出
16     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
17 
18     //調用庫函數,初始化GPIO
19     GPIO_Init(GPIOB, &GPIO_InitStructure);    
20 
21     //設置初始狀態
22     GPIO_SetBits(GPIOB, GPIO_Pin_5);
23 }
24 
25 void delay_ms(__IO uint32_t ms)
26 {
27     uint32_t i;    
28     SysTick_Config(SystemCoreClock / 1000);
29     
30     for(i = 0; i < ms; i++)
31     {
32         // 當計數器的值減小到0的時候,CTRL寄存器COUNTFLAG會置1,置1后,該位清零
33         while( !((SysTick->CTRL) & SysTick_CTRL_COUNTFLAG_Msk) );
34     }
35     // CTRL寄存器ENABLE寄存器置零,關閉SysTick定時器
36     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
37 }
38 
39 int main(void)
40 {    
41     //GPIO端口output模式初始化
42     GPIO_Output_Config();     
43 
44     while (1)
45     {
46         GPIO_SetBits(GPIOB, GPIO_Pin_5);
47         delay_ms(100);
48         GPIO_ResetBits(GPIOB, GPIO_Pin_5);
49         delay_ms(100);
50     }
51 }

 

仿真結果

程序編譯成功后,點擊開始仿真,點擊,顯示邏輯分析串口,點擊Setup,顯示設置串口,點擊新建,然后輸入要查看的端口,可同時查看多個端口,比如要查看PORTB.5,那么輸入(PORTB & 0x00000020) >>5,Display type選擇Bit,Color中選擇合適的顏色,點擊Close關閉對話框,點擊運行程序,可在邏輯分析串口看到該端口的波形。通過鼠標滾輪可對顯示波形進行縮放。

示例仿真波形如下:

從仿真結果來看,PORTB.5每隔100ms電平會切換一次,跟程序設計一致,因此GPIO輸出驅動成功。

同時也可通過菜單欄Peripherals→General Purpose I/O→GPIOB查看該端口的設置及當前值。

 

 

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

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


免責聲明!

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



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