很多同学第一次拿到蓝桥杯嵌入式开发板(STM32G431RBT6),打开 CubeMX 看到一堆引脚就懵了。PC8 到 PC15 连了 8 个 LED,为什么还要多一个 PD2?这就要说到蓝桥杯板子一个独特的设计:用锁存器控制 LED。
一、为什么 LED 不直接接单片机?
蓝桥杯开发板用的是 SN74HC573 锁存器,LED 并不是直接挂在 PC8~PC15 上的,中间隔了一个锁存器。原因很简单:PC8~PC15 同时还连着 LCD 屏幕,如果 LED 直接挂在引脚上,LCD 一刷新画面,LED 就会跟着乱闪。
锁存器的作用就是"记住"LED 的状态。PD2 是锁存器的"开关":PD2 高电平时,PC8~PC15 的电平会传过去控制 LED;PD2 低电平时,锁存器保持当前状态,PC 引脚再怎么变 LED 也不受影响。所以每次改完 LED 状态,都要给 PD2 一个高脉冲把状态"锁"进去。
二、CubeMX 里的工程配置
先打开CubeMX,然后点击File,再点击Nex Project...(新建工程的意思)

在输入框,输入STM32G431RBT6,选择第一个,双击。

先配置时钟点击SysTem Core,选择RCC,点击Crystal/Ceramic Resonator(晶体 / 陶瓷谐振器)

点击SYS,选择Serial Wire(用于调试)

根据原理图可知,我们这次需要配置PC8、PC9、PC10、PC11、PC12、PC13、PC14、PC15、PD2

点击芯片上的PC8引脚,选择GPIO_Output即可,其他8个也是一样我这边就不展示了。

然后点击System Core下面的GPIO。

按住SHIFT,再点击pc8,选择好后再下滑点击PC15,即可将其全部选中。根据图片操作,选择高电平,因为根据原理图我们要想点亮LED给低电平就可以了,我们这边默认上电不点亮LED,选择高电平。

GPIO模式选择推挽输出(OutPut Push Pull),另一个是开漏输出。

这里选择No pull-up and no pull-down :无上下拉(浮空), Pull-up :上拉
Pull-down :下拉

速度选择低速(Low)

PD2的话就默认不改就行了,高电平允许数据输入低电平锁存上一次输入的电平,这里看不懂的话可以去看这一篇文章74HC573 锁存器:从原理到实战,一篇就够了
然后点击Clock Configuration配置时钟树

输入80点击回车(ENTER)相当于给单片机配置80Mhz的频率

点击OK

点击Project Manager

输入项目名称,我这边输入LED。

启动软件选择MDK-ARM

点击Code Generator,勾选图片里框出来的那个选项,主要是生成单独的.c和.h文件

点击Advanced Settings,因为我这边使用LL库,所以要把HAL库改成LL库

点击切换就可以了

然后点击GENERATE CODE生成即可,主要在输入项目名称下面可以选择文件路径。

生成好后,直接打开工程就可以了

点亮LED 的核心代码
c
void Led_Disp(uint8_t uled)
{
//拉高PD2,使能输入
LL_GPIO_SetOutputPin(GPIOD,LL_GPIO_PIN_2);
//控制PC8~PC15的电平变化,因为是低电平点亮,我们如果想要输入1来点亮一个电平就得给uled取反
LL_GPIO_WriteOutputPort(GPIOC,(~uled)<<8);
//拉低PD2,失能输入,锁存上一次的输入电平
LL_GPIO_ResetOutputPin(GPIOD,LL_GPIO_PIN_2);
}
需要完整代码可以点击下载蓝桥杯LL库GPIO驱动LED代码.zip