摘要 在消费电子产品领域,开机方案通常是由用户手动按键上电,而后芯片初始化,将自身供电极拉高,完成启动。那么由此带来的一个问题就是:当硬件复位或系统复位时,同时也会复位供电极,因此芯片也会断电,无法实现再上电重启。 基于该一情况,本文提出了两种解决方案,分别为内核复位和主动跳转至bootloader复位,这两种方案不会影响外围电路,即供电极不会被复位,使得系统可以完成自动升级重启。 此外,本文同样适用的产品方案设计对象:允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数值不能改变等。 目录一、绪论 二、MCU启动流程回顾 三、MCU复位方法概述 四、MCU重启方案实现 五、实验结果与分析 六、调试问题回顾及总结 七、参考文献 一、绪论(1)概述 在消费电子产品的OTA升级过程中,产品是不插电工作的,当产品跟蓝牙完成升级文件包交互后,此时可以选择两种方式完成升级: (2)方案优缺点比较 二、MCU启动流程回顾芯片初始上电时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,从flash启动方式确定,arm内核将0x0800 0000地址映射到0x0000 0000中,代码区从0x0000 0000开始执行。 (1)裸机启动流程
(2)带操作系统启动流程 操作系统初始化所做工作如下图所示,仅作参考 三、MCU复位方法概述
整个芯片的所有电路都会被复位,包括ARM内核、芯片外设等
只复位内核——(CPU寄存器、特殊功能寄存器、NVIC、Systick、Debug、内存接口等),不影响外设电路变化
在app段设置MSP为bootloader段的栈顶指针,然后跳转至0x0800 0004所指向的复位中断程序入口,执行流程参考裸机启动流程。 在该复位模式下,CPU寄存器、NVIC向量中断等变量 由用户根据实际需要自行设置。 四、MCU重启方案实现裸机环境或操作系统环境下的重启方案,并无不同。
(1)当内核复位时,除了外设电路外的内核参数均被复位,此时操作系统与裸机环境一致; (2)当跳转复位时,操作系统一般处于线程模式,使用PSP;裸机使用MSP 此前由用户手动禁用中断,当主动跳入到0x0800 0004指向的复位中断时,cortex-m内核自动使用MSP,此时操作系统与裸机环境一致。 以下代码方案,仅作参考 (1)内核复位
(2)跳转复位
五、实验结果与分析(1)实验方法:
(2)实验结果
结论:多次重复执行复位重启,系统并无卡顿、死机等不良现象发生,证明该代码方案切实可行。 六、调试问题回顾及总结(1)对bootloader工程以及app工程的环境配置有何要求? boot以及app的开发环境尽可能保持一致,包括using microlib、Optimization等框选项的选择应同步设置,否则有可能导致无法正常升级跳转。 以下为是否勾选using microlib执行的mcu堆栈开辟方式,设计者须充分考虑代码方案差异可能带来的后果,并进行可行性验证
(2)为什么跳转后会触发HardFault异常? 有如下原因:跳转前未关中断;中断控制器标志数据未清零;中断向量偏移值未更改为目标工程的偏移。 (3) 七、参考文献 |
|
来自: logicsoft > 《bootloader》