IAP(In Application Programming)即在应用编程,也就是在原程序运行中,接收新的程序代码,写入程序ROM中,再跳转进入新的运行。 具体说,一般分为三个部分区域:(2个程序3个空间) 引导部分BOOT 应用部分APP 应用缓冲APPBUFF 方式一、如果APP比较大,要占用大部分ROM空间,只能如下安排ROM空间。
APPBUFF放在片外存储器中。 方式二、如果APP小于(1/2 ROM + BOOT),可作下面安排。
不需要片外存储器 升级流程:方式一为例 接收新的代码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文档。 |
不错,学习一下 |
接收新的代码1 ,放入APPBUFF中,这部分能描述的详细一点吗? |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程