96SEO 2026-06-07 05:24 0
先说说这事儿怎么来的
说实话,蓝桥杯的嵌入式赛道上,hen多小伙伴dou被同一个坑绊倒。
那就是 STM32G431RBT6 开发板上,LCD和板载 LED竟然抢了同一片 GPIOC。

哈哈,你想啊,两个功Nengdou要用,同一根针脚还Neng不冲突?
别急,我给你掰开揉碎讲。
冲突的根源到底是啥咱就是说GPIOC 的 PC0、PC1、PC2、PC3 本来是给 LED 预留的。
可官方库里 LCD_Init 那段代码直接把这些引脚改成了复用功Neng,用来驱动 ILI9341 的数据线。
结果一打开 LCD,LED 那几个灯立马暗了——因为引脚Yi经被 LCD “占领”。
这个现象在调试时Zui常见:HAL_GPIO_WritePin 完全没反应。
Zui直接的办法,就是在每次调用 LCD 相关函数前,把 LED 的寄存器状态先存下来。
等 LCD 操作结束后再把状态写回去。
不对不对,这里要注意:只保存需要的几位,不要把整个 ODR 整个抹掉,要不然别的外设会被误改。
下面这段代码就演示了怎么Zuo到:
static uint16_t led_state_backup = 0;
// 保存当前 LED 状态
static void LED_SaveState
{
// 只取 PC0~PC3 四位
led_state_backup = ;
}
// 恢复之前保存的 LED 状态
static void LED_RestoreState
{
// 清除 PC0~PC3,然后写回
GPIOC->ODR = | led_state_backup;
}
// 包装一下 LCD 的初始化函数
void LCD_Init_With_LED_Safe
{
LED_SaveState; // 先保存
LCD_Init; // 正式初始化 LCD
LED_RestoreState; // 再恢复
}
// 包装一下所有可Neng改动 GPIOC 的函数
void LCD_Clear_With_LED_Safe
{
LED_SaveState;
LCD_Clear;
LED_RestoreState;
}
记得把所有直接调用 LCD_* 系列函数的地方,dou换成上面这几个包装好的版本。
这样Zuo的好处是几乎零成本——只多了几行寄存器读写。
顺带一提:代码里也Ke以这么写
LCD_Init;
LED_ON;
LCD_Clear; //清除lcd为黑色
LCD_SetBackColor; //设置背景颜色为黑色
LCD_SetTextColor; //设置字体颜色为白色
不过上面那段其实缺少了状态恢复。我们加上:
void Demo
{
uint16_t saved = GPIOC->ODR & 0x000F; // 保存
LCD_Init; // 初始化会改掉 PC0~PC3
// 正常使用 LCD
LCD_Clear;
LCD_SetBackColor;
LCD_SetTextColor;
GPIOC->ODR = | saved; // 恢复 LED 状态
}
思路二:硬件层面的“抢位”解决法——74LS573 锁存器
Ru果你怕软件每次dou忘记保存,那就让硬件帮你搞定吧。
经典老牌子 74LS573 是个三态锁存器,输入端 D 接 MCU 的 PC0~PC3,输出端 Q 接到实际的 LED 引脚。
当 PD2 拉高时锁存器捕获 D 的电平;拉低时则进入高阻,让 MCU Neng自由控制这些引脚给 LCD 用。
说白了就是在软件里控制 PD2,高电平时让 MCU 把 LED 灯关掉并锁住;低电平时再打开,让它们跟随 MCU 信号走。
Pseudo‑Code 示意
// PD2 为锁存器使Neng信号
#define LOCK_EN_PIN GPIO_PIN_2
#define LOCK_EN_PORT GPIOD
static inline void Lock_Enable { HAL_GPIO_WritePin; }
static inline void Lock_Disable { HAL_GPIO_WritePin; }
void Init_Hardware_Lock
{
// 默认关闭锁存,使Neng MCU 控制 PC0~PC3 给 LCD 用
Lock_Disable;
}
void Show_LCD_And_LED
{
Lock_Disable; // 把锁存关闭,让 MCU Neng给 LCD 用这些针脚
LCD_Init; // 正常初始化
Lock_Enable; // 再打开锁存,把之前的 LED 状态冻结在 Q 输出上
// 此后即使再改动 PC0~PC3,也不会影响实际灯光,因为 Q Yi经保持原样
}
害,这套方案kan起来有点繁琐,但对那些追求“永远不忘记恢复”的选手来说是个保险箱。
思路三:改走别的引脚——重新映射功NengSTM32 系列支持 AF映射,只要把 ILI9341 的数据线搬到别的端口,就Neng彻底摆脱冲突。
比如把原来的 PC5‑PC12 改成 PB8‑PB15,只要硬件连线允许,这招立马生效。
SRC 示例:修改 CubeMX 配置文件
// 假设我们把原本的 PC5 改成 PB8:
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init;
Ehh,这种方式Zui大的好处是“一劳永逸”。但代价是需要重新布线,而且有时候板子本身Yi经焊好,不方便改动。
思路四:利用 DMA/中断降低占用时间You know what? Ru果你的项目对显示刷新频率要求不高,Ke以把所有对 LCD 的操作集中在一次 DMA 传输里然后快速返回主循环,让 MCU 有时间去切换 LED 引脚状态。
AFAIK,大多数 ILI9341 库dou有提供基于 DMA 的画点或填充矩形函数,你只需要把这些函数包装一下在 DMA 完成中断里恢复 LED 即可。
void DMA_LCD_FillRect(uint16_t x, uint16_t y,
uint16_t w, uint16_t h,
uint16_t color)
{
uint16_t saved_led = GPIOC->ODR & 0x000F;
// 启动 DMA 写入帧缓冲区...
Start_DMA_Transfer;
// 等待完成
while ) {}
GPIOC->ODR = | saved_led;
}
A Few Gotchas—别踩坑啦!
⚠️ 别忘了在 Main.c/.ioc/CubeMX 中把对应引脚从 “GPIO_Output” 改成 “AF” 或 “Analog”,否则库函数会自行覆盖你的手动配置。
⚠️ 保存/恢复状态的时候,只处理涉及到冲突的位,否则会意外改掉其他外设。
⚠️ Ru果使用锁存器方案,一定要在系统启动后先把 PD2 拉低,让锁存器进入透明模式,否则第一次访问 PCB 上的灯会异常暗淡。
⚠️ 调试时Ke以打开 Debugger kan一下 SVD Viewer → GPIO → ODR/IDR , 确认哪几位真的被改变。
⚠️ 别忘了给每个函数加点注释,免得以后自己回头kan还得抓狂。
P.S. 小结一下:
✅ 软件层面:保存/恢复寄存器状态Zui省事;包装所有 LCD_*
✅ 硬件层面:74LS573 锁存器让状态“卡死”,适合保守派;或者搬迁引脚彻底根除冲突;或者 DMA+中断压缩占用时间。
✅ 调试技巧:用 SVD 查kan ODR,用示波器捕捉 PD2 波形,kan锁存是否按预期工作。
✅ 心态建议:别太纠结“一次性完美”,先跑通再优化。蓝桥杯嘛,实战才是王道!
end of story—祝你玩得开心!#蓝桥杯 #嵌入式 #STM32 #LCD #LED #调试经验 咱们下次再聊别的话题吧,记得多喝水,多休息,代码出 bug 时先深呼吸,再去找原因。懂吗?哈哈!
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback