OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4171|回复: 1

BootLoader程序中带ucosii操作系统时的APP下载之后跳转前处理

[复制链接]

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-5-25 17:41:12 | 显示全部楼层 |阅读模式
本帖最后由 shumivan 于 2021-5-26 08:56 编辑

通常情况下,BootLoader程序是以简单为主,所以大部分工程中的BootLoader都是裸跑,但是如果带有操作系统的话,那你在下载完APP之后按照常规的跳转,你会发现跳过去没反应.当然我也遇到了这情况.我是把下载包打印出来与原bin文件一一对比,无误;然后又把下载并写入flash的数据读出来对比,也是无误;所以我很确定是跳转前某些部分处理不当造成的.后来通过多方查阅,确定是中断未关闭造成的.特此将经历的关键信息记录一下,分享给大家.
我的主芯片用的是STM32H743的,以此为例表述如下:
首先,BootLoader工程的地址配置如图 BootLoader工程地址配置.jpg
其次,APP的工程地址配置如图
APP工程地址配置.jpg
最后,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);        //提示 即将运行新固件
                }


完结!


APP工程地址配置.jpg
海纳百川者,荣耀伴一生!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-5-25 18:28:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表