STM32 IAP 设计实例 (一)

项目需要,需要开发一款手持设备,对产品进行软件升级。现在的产品都是使用STM32,所以可以很方便的应用STM32的 IAP功能对软件进行在线升级。

总体需求就是,主机Master通过CAN接口,发送数据给从机Slave。从机在接收到应用程序APP后,把接收的数据覆盖掉原来的应用程序区。从而实现Master对Slave的在线升级。


这里先介绍IAP,对IAP的整体实现有个了解,方便后续开发。参考了原子STM32开发板,对IAP功能的介绍。

要实现IAP,需要有两个项目代码。第一个称之为Bootloader程序,第二个称之为APP程序。Bootloader负责引导APP程序启动,以及需要在线更新APP时,接收主机发送的APP文件,将接收的APP覆盖掉原来的APP。

关于IAP的具体内容,可以参考原子STM32开发板的开发指南的五十三章。

下面是自己对IAP有大概了解之后,进行的实验。1,编写bootloader程序测试程序,用来引导指定位置的APP。2,修改原来的一个应用程序,使之可以用该bootloader引导。3,通过jlink下载器,分别下载bootloader和APP。


一,bootloader程序。

主要代码如下,流水灯之后,执行跳转到APP区域的命令

[cpp]  view plain  copy
  1. int main(void)  
  2. {     
  3.     delay_init();  
  4.     LED_Init();  
  5.   
  6.     LED1 = 0;  
  7.     delay_ms(200);  //延时  
  8.     LED2 = 0;  
  9.     delay_ms(200);  //延时  
  10.     LED3 = 0;  
  11.     delay_ms(200);  //延时  
  12.     LED4 = 0;  
  13.     delay_ms(200);  //延时  
  14.       
  15.     LED1 = 1;          
  16.     delay_ms(200);  //延时  
  17.     LED2 = 1;  
  18.     delay_ms(200);  //延时  
  19.     LED3 = 1;  
  20.     delay_ms(200);  //延时  
  21.     LED4 = 1;  
  22.     delay_ms(200);  //延时      
  23.   
  24.     iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码  
  25. }  
[cpp]  view plain  copy
  1. #define FLASH_APP1_ADDR     0x08003C00      //第一个应用程序起始地址(存放在FLASH)  
  2.                     <span style="WHITE-SPACE: pre"> </span>//保留前15K的空间 做为bootloader区  
FLASH的起始地址是0x0800 0000,所以0x0800 0000~0x0800 3C00用于存放Bootloader。

二、APP程序区。

完成中断向量表的重定位。工程配置下载位置

[cpp]  view plain  copy
  1. int main(void)  
  2. {  
  3.   SCB->VTOR = FLASH_BASE | 0x3C00;  
  4.   /* Infinite loop */  
  5.   while (1)  
  6.   {  
  7.     OSInit();  
  8.     OSTaskCreate(Start_Task,   
  9.                 (void*)0,   
  10.                 &Start_Task_Stk[START_TASK_STK_SIZE-1],   
  11.                  START_TASK_PRIO);  
  12.       
  13.     OSStart();  
  14.     return 0;  
  15.   }  
  16. }  
在main函数,最开始处加入SCB->VTOR = FLASH_BASE | 0x3C00;这里的0x3C00,即在bootloader中设定的Bootloader区域。

jlink下载的地址配置成起始地址是0x0800 3C00。 这样下载的时候不会把bootloader区域擦除。


最后在keil下, 分别下载bootloader , APP两个工程, 可以看到bootloader流水灯最后,APP程序被启动。

通过该实验,可以实现bootloader程序对APP的引导。后续可以再实现主机通过CAN发送数据给从机,从机更新APP数据到flash,即可实现升级。

bootloader的示例代码,APP的代码在公司原来的工程上改,不方便公开,只要按照上面的说明进行配置,即可以进行实验。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值