1. 问题现象与背景分析
最近在调试杰理测试盒的串口升级功能时,遇到了一个奇怪的现象:设备在升级过程中进度达到70%左右时,会突然重新开始升级流程。经过多次复现和排查,最终定位到问题根源与触摸供电电路设计有关。
这个问题的典型表现为:
- 使用串口工具进行固件升级时,进度条显示正常传输
- 当升级进度达到约70%时,设备突然重启
- 升级流程重新开始,形成无限循环
- 最终导致设备无法完成正常升级
2. 问题根因深度解析
2.1 硬件电路设计分析
问题的本质在于电源管理电路与触摸控制电路的交互异常。具体机制如下:
-
供电控制逻辑:在串口升级模式下,系统会主动将触摸屏的供电IO口(假设为PA5)置为低电平,目的是为了降低功耗。
-
意外反馈回路:当触摸供电被切断后,触摸芯片的PB1引脚(复位检测脚)却意外输出了持续的3.3V高电平。
-
复位机制触发:主控芯片的看门狗电路检测到PB1异常高电平后,在约8秒后触发硬件复位。
关键提示:这种设计缺陷在嵌入式系统中很常见,通常是因为未充分考虑外设断电时的引脚状态保持特性。
2.2 信号时序详解
让我们用示波器捕捉的实际信号时序来说明问题:
| 时间点 | 信号 | 状态 | 影响 |
|---|---|---|---|
| T0 | 升级开始 | PA5=高 | 触摸正常供电 |
| T1 | 升级30% | PA5=低 | 触摸断电 |
| T2 | 触摸断电后 | PB1=3.3V | 异常信号产生 |
| T3 | T2+8秒 | 系统复位 | 升级中断 |
3. 解决方案设计与验证
3.1 硬件修改方案
对于已出货设备,建议采用以下硬件修改:
-
增加下拉电阻:
- 在PB1引脚添加10KΩ下拉电阻
- 确保触摸断电时PB1被拉低
- 修改成本:约0.1元/台
-
电源隔离设计:
circuit复制VCC ----[二极管]----> 触摸VCC | [电阻] | GND
3.2 软件解决方案
对于新版本固件,可通过软件方式规避:
- 升级流程优化:
c复制void upgrade_procedure() {
// 修改前
// set_touch_power(OFF);
// 修改后
set_pb1_pull_down(ENABLE); // 先配置下拉
delay_ms(10);
set_touch_power(OFF);
}
- 看门狗配置调整:
c复制void wdt_init() {
WDT_CTRL = 0x5A; // 解锁配置
WDT_TIMEOUT = 30; // 延长超时到30秒
WDT_CTRL = 0xA5; // 锁定配置
}
4. 实施步骤与验证方法
4.1 硬件修改实施
-
物料准备:
- 10KΩ 0402封装电阻
- 热风焊台
- 放大镜
-
操作步骤:
- 拆解设备外壳
- 定位PB1测试点
- 焊接电阻到PB1与GND之间
- 用万用表验证阻抗
- 重新组装设备
4.2 软件升级验证
-
测试流程:
- 连接串口工具
- 发送升级命令
bash复制
jl_tool -p /dev/ttyUSB0 -f firmware.bin- 监控日志输出
- 确认升级进度达到100%
-
验证指标:
- 连续10次升级成功率100%
- 系统运行72小时无异常复位
- 触摸功能测试通过率100%
5. 经验总结与进阶建议
在实际工程实践中,这类问题给我们几个重要启示:
-
电源时序设计黄金法则:
- 外设断电前应先配置其IO状态
- 关键信号线必须考虑上下拉
- 复位电路要隔离外设影响
-
调试技巧:
- 使用逻辑分析仪同时捕捉PA5和PB1信号
- 在复位前插入调试断点
- 对比正常/异常时的电源波形
-
预防性设计建议:
- 在新版PCB中将PB1改为专用复位引脚
- 增加电源状态监测电路
- 实现升级进度非易失性存储
这个案例也提醒我们,嵌入式系统开发中,硬件与软件的协同设计至关重要。特别是在低功耗场景下,各种外设的电源状态切换可能引发意料之外的系统行为。建议在项目初期就建立完整的电源状态转换图,对每个状态的IO配置进行严格定义和验证。