|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
STM32 F103 IAP 分区 关机残留电压导致异常上电问题总结
基于你整套硬件架构、代码现状、故障现象,整理一份精简实用技术文案,可用于笔记、归档、项目复盘:
故障现象
设备采用 APP0 (0x08000000 引导区) + APP1 (0x08010000 主程序) 双 IAP 分区架构。
整机供电:电池→DCDC→LDO 3.3V,电源后端并联大容量储能电容。
- 正常开机、日常运行、充电、手动关机全部正常;
- 设备正常关机后,静置等待约 3 秒,再次插入 USB 上电;
- 主板供电正常维持,但屏幕无显示、系统无法正常启动,程序卡死不运行。
根本原因
- 关机为直接 IO 切断总电源,无软件复位动作;
- 板载 100uF 大容量电容放电缓慢,关机 3 秒后 3.3V 仍残留约 0.5V 低压;
- STM32F103 未彻底掉电清零,芯片处于低压锁存异常状态;
- 二次 USB 上电时,不执行标准冷启动,不进入 APP0 引导程序,直接跑飞卡死;
- 原 IAP 跳转代码缺少中断、定时器资源清理,双程序运行存在寄存器、中断冲突隐患。
代码现状说明
- APP1 主程序起始已正确配置向量表偏移:
SCB->VTOR = FLASH_BASE | 0x10000;
配置规范无误,无需修改; - 原 IAP 跳转逻辑仅做栈顶合法性校验,未关闭全局中断、SysTick、中断标志位,跨程序跳转存在稳定性隐患;
- 关机逻辑仅关闭硬件电源,无软复位与死循环兜底,低压场景极易异常。
解决方案
1、优化 IAP 跳转代码(APP0)
跳转前统一关闭总中断、清空 SysTick、清除所有中断挂起与使能位,实现引导程序与主程序硬件资源完全隔离,杜绝冲突。
2、完善关机执行逻辑
关机流程调整为:数据保存 → 关闭硬件电源 → 软件强制复位 → 死循环兜底。
[mw_shl_code=applescript,true]write_sys(); // 保存配置参数
MachinePS_OF(); // 切断整机电源
NVIC_SystemReset(); // 芯片强制软复位
while(1); // 防止指令未执行完成跑飞[/mw_shl_code]
3、硬件优化(可选)
3.3V 电源增加对地泄放电阻,加快电容残余电量释放,保证短时间内电压彻底归零,从硬件层面规避低压锁存问题。
优化后效果
- 保留原有 IAP 分区、程序地址、功能逻辑不变;
- 无论正常开关机、关机静置后插电、USB 上电等所有场景,均可正常引导、正常进入主程序;
- 双程序跳转更稳定,杜绝随机死机、黑屏、无法启动等玄学故障;
- 适配大容量电容供电架构,兼容低压残留的复杂掉电工况。
|
|