你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】STM32F10x远程升级方式(IAP)

[复制链接]
spyglass 提问时间:2014-4-9 16:30 /
 
IAP(In Application Programming)即在应用编程,也就是在原程序运行中,接收新的程序代码,写入程序ROM中,再跳转进入新的运行。
 
具体说,一般分为三个部分区域:(2个程序3个空间)
引导部分BOOT
应用部分APP
应用缓冲APPBUFF
 
方式一、如果APP比较大,要占用大部分ROM空间,只能如下安排ROM空间。
 
            APP
            
             
             
            0x800n000
            
            BOOT
            
             
            0x8000000
            

APPBUFF放在片外存储器中。
 
 
方式二、如果APP小于(1/2 ROM + BOOT),可作下面安排。
 
            APPBUFF
            
             
             
            0x80m0000
            
            APP
            
             
             
            0x800n000
            
            BOOT
            
             
            0x8000000
            

 
 
 
 
 
 
 
 
 
不需要片外存储器
 
 
升级流程:方式一为例
接收新的代码1 ,放入APPBUFF中,接收代码2,放入… , 接收完n,全部代码正确后,设置一个不挥发的新代码标志,重新启动(也可跳转进入boot)。进入BOOT后,检查新代码标志,没有,直接跳转到APP应用中。有,擦除APP区域ROM,把APPBUFF内容复制到APP中,正确完成后,不挥发的新代码标志写入为完成标志,跳转到APP应用中运行,升级完成。
 
注意不挥发3个字,防止意外断电,引发失败。
BOOT原则是要小。
 
方式二升级流程大同小异。但也有人这么用:APP => APP1,  APPBUFF => APP2。也就是有2个运行区,如果当前运行区是APP1,APP2就是BUFF,新代码直接放入APP2,正确后,把当前运行区调整到APP2,跳转到APP2运行,此后APP1就是BUFF。2个区域轮转。
 
方式没有好坏之分,合适使用是上策。
 
 
为了防止失败,除了断电,还有一些细节需要注意的。
新代码是否是你家的?
新代码是否有破损?
新代码是否超重?
升级期间,狗狗有吃的吗?
升级期间,中断宝宝睡觉了没有?

 
 
有一说法:细节决定成败。
 
 
跳转代码:
typedef void (*pFunction)(void);
u32 JumpAddress;
pFunction Jump_To_Application; 
 
 
 JumpAddress= *(uint32_t*)( APP_0_ADDR+4);
 Jump_To_Application = (pFunction) JumpAddress;
   __set_MSP(*(uint32_t*) APP_0_ADDR);
 Jump_To_Application(); 
 
 
APP_0_ADDR是APP程序的首地址;
__set_MSP()是原厂库文件core_cm3.c中函数
 
若有不明白的地方,参考原厂的应用笔记AN2557文档。
 
收藏 2 评论3 发布时间:2014-4-9 16:30

举报

3个回答
abb200628 回答时间:2015-2-2 13:10:09
不错,学习一下
stary666 回答时间:2015-2-5 00:11:03
AnnaLi 回答时间:2015-2-5 07:26:55
接收新的代码1 ,放入APPBUFF中,这部分能描述的详细一点吗?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版