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

如图所示,8 个 led 和引脚之间有着一个锁存器,
了解锁存器作用:
理解成开关加存储器的结合体更为贴切,当锁存器使能时,可以用于数据交换;交换后的数据就被关起来了,暂时无法更改,直到下一次锁存器使能进行数据交换。
PD2 引脚为控制锁存器引脚,当 PD2 输出高电平时,锁存器解锁,反之上锁。
由图可知,LED 拥有公共的 VDD,而为了让二极管导通,PCx 引脚需要输出低电平(即 0)
由锁存器的知识可知,PD2 引脚需要是有效电平,才能让 PCx 引脚工作,如图可得,PD2 需要输出高电平(即 1)
CUBEMX 配置:
GPIO 配置:
将所用到的 GPIO 设成输出模式

RCC 配置:

时钟树配置:
这里采用内部时钟:

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); // 关闭锁存器 | |
} |