STM32CubeMX教程2 GPIO输出 - 点亮LED灯

发布时间 2024-01-01 12:17:20作者: OSnotes

1、准备材料

开发板(STM32F407G-DISC1
ST-LINK/V2驱动
STM32CubeMX软件(Version 6.10.0
keil µVision5 IDE(MDK-Arm

2、实验目标

使用STM32CubeMX软件配置STM32F407开发板点亮LED灯

3、实验流程

3.0、前提知识

笔者使用的STM32F407G-DISC1开发板主控制器为STM32F407VGT6,该MCU封装为LQFP 100,一共100个引脚,除去16个POWER引脚、1个NRST引脚和一个BOOT0引脚外,还剩余82个引脚,剩下的这些引脚均可以作为GPIO输入输出引脚使用,这些引脚分为6组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE和GPIOH,除GPIOH只有2个引脚外,其余5组均为16个引脚,如下图所示

在编程语言学习的过程中,一般学习者初始程序大多选择输出“Hello World!”,而在嵌入式单片机的学习中,一般学习者初始程序大多为“点亮LED灯”,笔者使用的开发板上拥有四个不同颜色的LED灯,其硬件原理图如下图所示,从电路连接上可以看出,从上到下绿橙红蓝四个LED灯分别由单片机的PD12、PD13、PD14和PD15四个引脚控制,当这四个引脚输出高电平时,相应的LED则会被点亮

3.1、CubeMX相关配置

在Pinout & Configuration页面右边单片机引脚预览Pinout view中,寻找需要设置的具体GPIO,这里我们选择PD12、PD13、PD14和PD15四个引脚,左键单击引脚可以对引脚功能进行设置,这里我们统一选择为GPIO_Output

在页面左边单片机功能分类栏目中选择GPIO,然后在页面中间栏目GPIO Mode and Configuration中可以看到所有使用到的具体GPIO及其相关配置,单击某个GPIO可以对其配置进行修改

当引脚选择GPIO Output时,GPIO mode有推挽输出和开漏输出两种,GPIO Pull-up/Pull-down可以选择无上/下拉、上拉和下拉其中的几种,需要注意的是开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动(注释1)

当GPIO mode设置为推挽输出时,此时上/下拉只有在没有输出时才有作用,也就是说,推挽输出状态下,如果控制输出高电平那IO状态就为高电平,若控制输出低电平那IO状态就为低电平,此时与上/下拉无关,而当没有控制输出时,此时IO的状态由上/下拉决定(注释2)

当GPIO mode设置为开漏输出时,如果控制输出低电平那IO状态就为低电平;若控制输出高电平,此时输出指令就不会起到作用,IO状态由上/下拉决定

3.2、生成代码

由于不需要重新设置时钟和工程,因此直接单击上图页面右上角GENERATE CODE重新生成工程即可

打开工程,在main.c主函数中可以看到初始化部分多了MX_GPIO_Init()函数,此函数即初始化4个LED引脚为输出的函数

右键单击函数,单击Go To Definition Of 'MX_GPlO_Init' 定位(注释3)到函数定义所在的文件gpio.c(注释4)中,可以看到初始化函数中所做的设置正是我们在STM32CubeMX中所做的设置

此时如果不增加任何代码,编译整个工程应该是可以正常编译通过,0错误和0警告

然后我们就可以添加我们自己的功能代码,在主函数初始化LED的引脚之后,将引脚输出为高电平即可点亮LED,还可以在主循环中每隔一定时间翻转LED引脚的输出电平,形成LED闪烁的状态,添加代码如下图所示

源代码如下

点击查看代码
/*点亮四个LED灯*/
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port,GREEN_LED_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(ORANGE_LED_GPIO_Port,ORANGE_LED_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(RED_LED_GPIO_Port,RED_LED_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(BLUE_LED_GPIO_Port,BLUE_LED_Pin,GPIO_PIN_SET);
 
/*每隔100ms翻转绿色LED灯状态*/
HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin) ;
HAL_Delay(100);

4、常用函数

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:设置某个GPIO固定输出高电平或低电平
参数:

  1. GPIOx:引脚组别(GPIOA - GPIOI)
  2. GPIO_Pin:引脚(GPIO_PIN_0 - GPIO_PIN_15)
  3. PinState:低电平(GPIO_PIN_RESET)、高电平(GPIO_PIN_SET)

举例:HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
设置PA0引脚输出高电平

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个GPIO的输出电平翻转
参数:

  1. GPIOx:引脚组别(GPIOA - GPIOI)
  2. GPIO_Pin:引脚(GPIO_PIN_0 - GPIO_PIN_15)

举例:HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0);
翻转PA0引脚输出电平

5、烧录验证

5.1、具体步骤

“初始化LED引脚为输出 -> 使用HAL库函数设置LED引脚输出高电平 -> 引脚对应的LED点亮”

5.2、实验现象

烧录程序,然后观察开发板上LED灯的闪烁状态,发现开发板上电后4个LED均被点亮,其中GREEN_LED每隔一段时间闪烁一次

6、注释解析

注释1:参看文章“GPIO推挽输出和开漏输出模式区别详解
注释2:参看文章“STM32F4 GPIO八种模式及工作原理详解
注释3:需要先编译整个工程才可以跳转
注释4:如果在STM32CubeMX的Project Manager/Code Generator/Generated files中没有勾选Generate peripheral initialization as a pair of 'c/.h' files per peripheral,则所有生成的代码都会在main.c中实现,而不是每个外设分成.c/.h的形式