蓝桥杯嵌入式之 LED 闪烁

举报
糖果罐子 发表于 2023/10/31 21:00:54 2023/10/31
【摘要】 > 这篇文章将详细为大家介绍如何实现` LED 闪烁`。>我们使用的是` HAL 库`。@[TOC](文章目录)---# 前言---# 一、STM32CubeMX配置: 1. 使用的芯片是 `STM32G431RBTx`。![在这里插入图片描述](https://img-blog.csdnimg.cn/994a3548886444d2adeded298fd7d3ab.png)---2. 配置...

> 这篇文章将详细为大家介绍如何实现` LED 闪烁`。
>我们使用的是` HAL 库`。

@[TOC](文章目录)

---

# 前言



---



# 一、STM32CubeMX配置:
 1. 使用的芯片是 `STM32G431RBTx`。
![在这里插入图片描述](https://img-blog.csdnimg.cn/994a3548886444d2adeded298fd7d3ab.png)

---
2. 配置 `RCC`:

![在这里插入图片描述](https://img-blog.csdnimg.cn/71a5e6939c124ba59858d793d3449a4f.png)

---

3. 我们使用的板子有 8 个LED灯,分别需要 `PC8 ~  PC15` 来控制。(这个在下面原理图处会讲)

![在这里插入图片描述](https://img-blog.csdnimg.cn/60d7f63f90a04be7b5e4b111aa99598b.png)



 在 *STM32CubeMX*  里配置 引脚, `PD2 ` 也需要配置。(这个在下面原理图处会讲)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8fc31bdba25a48f7b6ebbd61b58e1b89.png)

---

# 二、LED 原理图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/8dbbb6fa24a442ac8daf9b91e7d95ca3.png)
从上图我们可以看到 **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 `文件。
 
![在这里插入图片描述](https://img-blog.csdnimg.cn/42fa57975f814dd8a0cd8556a21add7a.png)

#### 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。