本文介紹如何使用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