金牌会员
- 积分
- 1322
- 金钱
- 1322
- 注册时间
- 2015-3-3
- 在线时间
- 127 小时
|
本帖最后由 shumivan 于 2021-5-26 08:56 编辑
通常情况下,BootLoader程序是以简单为主,所以大部分工程中的BootLoader都是裸跑,但是如果带有操作系统的话,那你在下载完APP之后按照常规的跳转,你会发现跳过去没反应.当然我也遇到了这情况.我是把下载包打印出来与原bin文件一一对比,无误;然后又把下载并写入flash的数据读出来对比,也是无误;所以我很确定是跳转前某些部分处理不当造成的.后来通过多方查阅,确定是中断未关闭造成的.特此将经历的关键信息记录一下,分享给大家.
我的主芯片用的是STM32H743的,以此为例表述如下:
首先,BootLoader工程的地址配置如图
其次,APP的工程地址配置如图
最后,IAP升级将远程的bin文件下载并写到自身的Flash指定地址后,跳转时执行该语句
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000) == 0x08000000) //判断是否为0X08XXXXXX.
{
iap_load_app(FLASH_APP1_ADDR); //执行FLASH APP代码
}
其中关键在iap_load_app()函数内容中,具体如下:
__set_PRIMASK(1); // 关中断
__set_BASEPRI(0);
__set_FAULTMASK(0);
__set_PSP(*((volatile unsigned long int *)appxaddr));// 重新设置进程PSP堆栈地址,UCOS用
__set_MSP(*((volatile unsigned long int *)appxaddr)); // 重新设置MSP,中断用
__set_CONTROL(0);
if(((*(vu32*)appxaddr)&0x2FF00000)==0x24000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
else
{
IAP_Txt_Display(8); //提示 即将运行新固件
}
完结!
|
-
|