您的位置 首页 发布

STM32学习记载18 IAP(1)

项目需要,需要开发一款手持设备,对产品进行软件升级。现在的产品都是使用STM32,所以可以很方便的应用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 plaincopy

  1. intmain(void)
  2. {
  3. delay_init();
  4. LED_Init();
  5. LED1=0;
  6. delay_ms(200);//延时
  7. LED2=0;
  8. delay_ms(200);//延时
  9. LED3=0;
  10. delay_ms(200);//延时
  11. LED4=0;
  12. delay_ms(200);//延时
  13. LED1=1;
  14. delay_ms(200);//延时
  15. LED2=1;
  16. delay_ms(200);//延时
  17. LED3=1;
  18. delay_ms(200);//延时
  19. LED4=1;
  20. delay_ms(200);//延时
  21. iap_load_app(FLASH_APP1_ADDR);//履行FLASHAPP代码
  22. }
[cpp]view plaincopy

  1. #defineFLASH_APP1_ADDR0x08003C00//第一个使用程序开端地址(寄存在FLASH)
  2. //保存前15K的空间做为bootloader区

FLASH的开端地址是0x0800 0000,所以0x0800 0000~0x0800 3C00用于寄存Bootloader。

二、APP程序区。

完结中断向量表的重定位。工程装备下载方位

[cpp]view plaincopy

  1. intmain(void)
  2. {
  3. SCB->VTOR=FLASH_BASE|0x3C00;
  4. /*Infiniteloop*/
  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. OSStart();
  13. return0;
  14. }
  15. }

在main函数,最开端处参加SCB->VTOR = FLASH_BASE | 0x3C00;这儿的0x3C00,即在bootloader中设定的Bootloader区域。

jlink下载的地址装备成开端地址是0x0800 3C00。 这样下载的时分不会把bootloader区域擦除。

最终在keil下, 别离下载bootloader , APP两个工程, 能够看到bootloader流水灯最终,APP程序被发动。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/272490.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部