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