首先先来了解 LED 模块原理图:

image-20240314210251591

如图所示,8 个 led 和引脚之间有着一个锁存器,

了解锁存器作用:

理解成开关加存储器的结合体更为贴切,当锁存器使能时,可以用于数据交换;交换后的数据就被关起来了,暂时无法更改,直到下一次锁存器使能进行数据交换。

PD2 引脚为控制锁存器引脚,当 PD2 输出高电平时,锁存器解锁,反之上锁。

由图可知,LED 拥有公共的 VDD,而为了让二极管导通,PCx 引脚需要输出低电平(即 0)

由锁存器的知识可知,PD2 引脚需要是有效电平,才能让 PCx 引脚工作,如图可得,PD2 需要输出高电平(即 1)

CUBEMX 配置:

GPIO 配置:

将所用到的 GPIO 设成输出模式

image-20240314212415776

RCC 配置:

image-20240314212608698

时钟树配置:

这里采用内部时钟:

led.c:

void LED_Control(u8 led_ctrl)
{
	// 先熄灭所有 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);	// 让 PC8~PC15 输出高电平,熄灭 LED
	HAL_GPIO_WritePin(GPIOC,0xff00,GPIO_PIN_SET);		// 让 PC8~PC15 输出高电平,熄灭 LED
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	// 打开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	// 关闭锁存器
// 根据 led_ctrl 来点亮对应的 LED
HAL_GPIO_WritePin(GPIOC,led_ctrl<<8,GPIO_PIN_RESET);// 根据 led_ctrl 输出低电平,点亮 LED
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	// 打开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);	// 关闭锁存器
}