spyglass 发表于 2014-4-9 16:30:33

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

 
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文档。
 

abb200628 发表于 2015-2-2 13:10:09

不错,学习一下

stary666 发表于 2015-2-5 00:11:03

:loveliness::loveliness::loveliness::loveliness::loveliness:

AnnaLi 发表于 2015-2-5 07:26:55

接收新的代码1 ,放入APPBUFF中,这部分能描述的详细一点吗?
页: [1]
查看完整版本: 【MCU实战经验】STM32F10x远程升级方式(IAP)