现象描述: app独自运行没有问题,初始化或者长时间运行都不会跑飞;但是加入bootloader后主程序出现异常。
注: bootloader内启用了systick,一个串口(用于升级主程序),一个外部IO中断。
程序框架:
0x08000000 ~ 0x08002000 :bootloader占用;
0x08002000 ~ 最大: app和备份app平分占用;
问题原因: 上述bootloader 中开启了3个中断且在转入app之前中断向量表映射至app起始地址;并且关闭了串口和外部IO中断;但是忽略了systick中断导致进入app后偶发程序harderror异常;
经分析,具体原因是app中加入了freertos并占用了systick定时器,在刚进入app后并没有立即初始化systick,原bootloader中断仍然会进入到当前中断服务函数中,freertos的systick中有切换任务的相关命令(会改变PC值),但实际这时还没有初始化freertos相关信息,导致PC取值异常。
综上: 在bootloader中占用的所有硬件资源外设资源,在进入app之前务必要deinit释放掉,特别是各种中断要从源头关闭释放。否则进入app后,原来设置的中断依然会在不停的中断,中断过程PC的值会被改变,进而出现异常现象。
STM32 Bootloader程序在进入app之前,要清除所有中断,关闭所有使用的外设资源;防止进入app后中断跳出导致app程序跑飞!