蓝桥杯嵌入式之 LED 闪烁

简介: 蓝桥杯嵌入式之 LED 闪烁

一、STM32CubeMX配置:


使用的芯片是 STM32G431RBTx。

fd6f504bb31f4e4b4e987dae817fa9a.png

配置 RCC:

23f2762a6a6149c7a688ce8d7e53577.png


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

522f32e563a9ae4f8b5b8f1405e8d9d.png


在 STM32CubeMX 里配置 引脚, PD2 也需要配置。(这个在下面原理图处会讲)


b86122cf10b21d3361436b11d5496d7.png

二、LED 原理图:



从上图我们可以看到 8个 LED 是共阳(左边都接在 VDD 处),LED 左边是高电平,只要右边输出低电平就可以使 LED 亮。

f72c64f49278c4cedd22ccb3f7dfe90.png

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 文件。


faaba63468207cbd5b2d550d37ad0a7.png


1. HAL_GPIO_WritePin 函数:用于操作 GPIO 电平。

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

1

2

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

1

2

2.HAL_Delay函数:作为毫秒级延迟的函数。

__weak void HAL_Delay(uint32_t Delay)

1

2

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 闪烁效果展示:

下面是本实验的效果演示:(视频录制在B占)

【蓝桥杯嵌入式之Led闪烁】 https://www.bilibili.com/video/BV1W84y1a7pA/?share_source=copy_web&vd_source=62327db395640e4069ddf63611f28bd3

相关文章
|
7月前
|
C语言
蓝桥杯嵌入式零基础如何准备
蓝桥杯嵌入式零基础如何准备
|
7月前
|
缓存 网络协议 算法
[蓝桥杯嵌入式]hal库 stm32 PWM的使用(随时修改占空比,随时修改频率)
[蓝桥杯嵌入式]hal库 stm32 PWM的使用(随时修改占空比,随时修改频率)
|
7月前
蓝桥杯嵌入式第十一届(第一场)省赛
蓝桥杯嵌入式第十一届(第一场)省赛
198 1
|
7月前
蓝桥杯嵌入式第十二届省赛
蓝桥杯嵌入式第十二届省赛
117 0
|
7月前
蓝桥杯嵌入式第十一届(第二场)省赛
蓝桥杯嵌入式第十一届(第二场)省赛
135 0
|
7月前
|
芯片
蓝桥杯嵌入式创建第一个工程(点亮led灯)
蓝桥杯嵌入式创建第一个工程(点亮led灯)
106 0
|
内存技术
蓝桥杯嵌入式之 Keil 仿真与调试
蓝桥杯嵌入式之 Keil 仿真与调试
400 1
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
115 0
|
7月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
88 0