更新:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)0x8000004才是复位向量,所以需要在add+4 

这两天再看IAP实验,觉得很实用,最近在做一个小项目,日后也肯定需要升级的。原子的程序是写在STM32的内部Flash,内部SRAM。还可以把程序写到外部Flash或者SD卡来更新。

目前做了第一步:从串口更新,移植的正点的代码。先将IAP bootload写入ROM起始地址,这里我的ROM总共256k,我分了一半给bootload,一半给app。注意设置地址问题。

                       只更新了Flash app。用的流水灯实验。SD卡FAT目前先没用,空间节省不少啊,这个RAM,ROM占用很厉害啊。这个问题还需要去解决。

                       串口接收APP设置了10k容量。

                       流程:1,Jlink写bootload到ROM起始,与平时一样

                               2,串口发送app.bin,串口接收

                               3,将接收的app.bin写入flash的指定app位置

                               4,使用bootload中的函数跳转到flash的指定app位置,执行app。

   

 1 #ifndef __IAP_H__
 2 #define __IAP_H__
 3 #include "sys.h"  
 4 //////////////////////////////////////////////////////////////////////////////////     
 5 //本程序只供学习使用,未经作者许可,不得用于其它任何用途
 6 //ALIENTEK战舰STM32开发板
 7 //IAP 代码       
 8 //正点原子@ALIENTEK
 9 //技术论坛:www.openedv.com
10 //修改日期:2012/9/24
11 //版本:V1.0
12 //版权所有,盗版必究。
13 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
14 //All rights reserved                                      
15 //////////////////////////////////////////////////////////////////////////////////    
16 typedef  void (*iapfun)(void);                //定义一个函数类型的参数.
17 
18 #define FLASH_APP1_ADDR        0x08020000      //第一个应用程序起始地址(存放在FLASH)
19                                             //保留0X08000000~0X0800FFFF的空间为IAP使用
20 
21 void iap_load_app(u32 appxaddr);            //执行flash里面的app程序
22 void iap_load_appsram(u32 appxaddr);        //执行sram里面的app程序
23 void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 applen);    //在指定地址开始,写入bin
24 #endif
iap.h

相关文章: