一、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)
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