这篇文章将详细为大家介绍如何实现
LED 闪烁
。
我们使用的是HAL 库
。
文章目录
- 前言
- 一、STM32CubeMX配置:
- 二、LED 原理图:
- 三、LED闪烁 讲解:
- 1. HAL_GPIO_WritePin 函数:用于操作 *GPIO* 电平。
- 2.HAL_Delay函数:作为毫秒级延迟的函数。
- 四、例程代码:
- 总结
- LED 闪烁效果展示:
前言
一、STM32CubeMX配置:
- 使用的芯片是
STM32G431RBTx
。
- 配置
RCC
:
- 我们使用的板子有 8 个LED灯,分别需要
PC8 ~ PC15
来控制。(这个在下面原理图处会讲)
在 STM32CubeMX 里配置 引脚, PD2
也需要配置。(这个在下面原理图处会讲)
二、LED 原理图:
从上图我们可以看到 8个 LED 是共阳(左边都接在 VDD 处),LED 左边是高电平,只要右边输出低电平就可以使 LED 亮。
SN74HC573ADWR
锁存器:
在 LED 的最后面有 8 个PC接口, PC8 ~PC15
通过中间的锁存器控制 LED。
锁存器 Q 端 和 D 端的电压受
PD2
电平的影响:
(1)PD2 为高电平, D 和 Q电平一致。 (打开锁存器)
(2)PD2 为低电平, Q 的电平不被影响。(关闭锁存器)
当 PD2 = 1 时,D端的电平等于Q端电平,则可以通过 PC8 ~PC15 的电平控制 LED1 ~ LED8。
操作锁存器原则:
在打开锁存器前,需要保持PC8 ~PC15
数据的稳定 。(这个在下面的程序中会很好的体现)
在关闭锁存器后,才可以操作 PC 端改变数据。
三、LED闪烁 讲解:
在编写程序时,我们采用 模块化编程 。所以对于 LED 程序,我们可以单独设置一个 led.c 和 led.h
文件,便于管理。 在 Inc 里添加.h
文件,在 Src 里添加 .c
文件。
1. HAL_GPIO_WritePin 函数:用于操作 GPIO 电平。
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
GPIOx
:对应GPIO总线, 例如 GPIOC。
GPIO_Pin
:对应引脚数,例如GPIO_PIN_8。
PinState
:对应高低电平,GPIO_PIN_RESET
输出低电平;GPIO_PIN_SET
输出高电平。
由上面的 LED 原理图可知 当 PD2 为高电平, D 和 Q 电平一致。则可以通过 PC8 ~PC15
控制 LED1 ~ LED8
。
PC8 ~PC15
输出低电平就会使对应的 LED1 ~ LED8
点亮。输出低电平就会使对应的 LED1 ~ LED8
熄灭。
例如:PC8 端口控制 LED1。
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET); //点亮 LED1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET); //熄灭 LED1
2.HAL_Delay函数:作为毫秒级延迟的函数。
__weak void HAL_Delay(uint32_t Delay)
Delay
:对应的延迟毫秒数。
四、例程代码:
- led.c 文件:
这里我们定义一个 u8 类型的变量 led_ctrl* 来代替需要设置的 GPIO 引脚。由于 HAL_GPIO_WritePin 函数的第二个参数的类型是 uint16_t , 所以需要左移 8 位。
0xff 就是选中 8 个LED 灯,设置电平为 GPIO_PIN_SET 高电平,就使其熄灭。
当然大家也可以使用上面的方法,直接写 GPIO 引脚 熄灭所有的LED。 HAL_GPIO_WritePin ( GPIOC , GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15 , GPIO_PIN_SET ) ;
PD2 端口在设置数据后先高电平打开,再低电平关闭。
void LED_Control(u8 led_ctrl)
{
/* 熄灭所有的LED */
HAL_GPIO_WritePin(GPIOC, 0xff<<8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //高电平开锁存器
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //低电平关闭锁存器
HAL_GPIO_WritePin(GPIOC, led_ctrl<<8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); //高电平开锁存器
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); //低电平关闭锁存器
}
- main.c 文件:
0x55 就是使 LED 灯,间隔一个选中一个。500 毫秒闪烁一次。
LED_Control(0x55);
HAL_Delay(500);
LED_Control(0x00);
HAL_Delay(500);
总结
实现了 LED 闪烁 就是成功的第一步,大家跟着我的文章学习一定会收益颇大。
LED 闪烁效果展示:
下面是本实验的效果演示
:
【蓝桥杯嵌入式之Led闪烁】 https://www.bilibili.com/video/BV1W84y1a7pA/?share_source=copy_web&vd_source=62327db395640e4069ddf63611f28bd3