在线时间1 小时
UID243801
ST金币0
蝴蝶豆0
注册时间2008-1-8
初级会员
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
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文档。
|
|