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

posted @ 2020-06-20 11:54  心灵航帆  阅读(2644)  评论(0编辑  收藏  举报