蓝桥杯嵌入式之 LED 闪烁
【摘要】 > 这篇文章将详细为大家介绍如何实现` LED 闪烁`。>我们使用的是` HAL 库`。@[TOC](文章目录)---# 前言---# 一、STM32CubeMX配置: 1. 使用的芯片是 `STM32G431RBTx`。---2. 配置...
> 这篇文章将详细为大家介绍如何实现` LED 闪烁`。
>我们使用的是` HAL 库`。
@[TOC](文章目录)
---
# 前言
---
# 一、STM32CubeMX配置:
1. 使用的芯片是 `STM32G431RBTx`。

---
2. 配置 `RCC`:

---
3. 我们使用的板子有 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* 电平。
```c
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。
```c
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函数:作为毫秒级延迟的函数。
```c
__weak void HAL_Delay(uint32_t Delay)
```
`Delay` :对应的延迟毫秒数。
---
# 四、例程代码:
1. ***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* 端口在设置数据后先高电平打开,再低电平关闭。
```c
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); //低电平关闭锁存器
}
```
2. ***main.c 文件:***
0x55 就是使 LED 灯,间隔一个选中一个。500 毫秒闪烁一次。
```c
LED_Control(0x55);
HAL_Delay(500);
LED_Control(0x00);
HAL_Delay(500);
```
# 总结
实现了 `LED 闪烁` 就是成功的第一步,下一节我们讲解 `按键点灯` 。
#### LED 闪烁效果展示:
`下面是本实验的效果演示`:(视频录制在B占)
【蓝桥杯嵌入式之Led闪烁】 https://www.bilibili.com/video/BV1W84y1a7pA/?share_source=copy_web&vd_source=62327db395640e4069ddf63611f28bd3
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)