查看: 1521|回复: 0

STM32的IAP设计

[复制链接]
  • TA的每日心情
    慵懒
    2016-11-22 11:58
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2016-11-24 09:18:53 | 显示全部楼层 |阅读模式
    分享到:
    IAP(In-Application Programming)指当系统安装在终端产品上后,具有更新固件的能力。这个功能可以使用任何通讯协议(如CAN、USART、USB)对片上的内存进行重新编程。

    IAP原理
    IAP程序在FLASH中的存储方式如下图:

    IAP实际上是将应用程序分成两部分:

    • IAP程序
    • 应用程序
    IAP程序存放到FLASH的起始地址,这样设备复位后先执行IAP程序,再由IAP程序判断是更新应用程序还是直接跳转到应用程序。
    也就是说在产品出厂时,将本来只有应用程序一个bin文件组成的产品,变成由IAP程序与应用程序2个bin文件组成。然后分别烧写到不同的内存地址,如上图IAP程序烧写到起始地址为0x08000000,应用程序烧写到0x08002000上。
    注意:

    • IAP程序必须从起始地址0x08000000开始烧写
    • 应用程序烧写时注意不要将IAP程序擦掉,即烧写时不要擦除整片FLASH
    以后需要IAP更新程序的时候只是更新应用程序,即只擦除应用程序所在的FLASH的扇区,再重新烧写更新的应用程序。
    所以在编写IAP程序之前要先想好3件事情:

    • 怎么将IAP驱动程序与应用程序分区
    • 通过哪种方式更新应用程序,UART、USB等
    • 什么时候跳转应用程序
    IAP设计
    以我做过的一个项目为例:使用STM32F103RC芯片,产品启动2s内接受到相应的串口数据,则进入应用程序更新流程,否则跳到应用程序中执行。IAP程序存放在内存地址0x08000000~0x08002FFF。剩余的FLASH存放应用程序。注意IAP的存储区不要设置的过小,否则有可能越界与应用程序冲突,也不要太大造成浪费(如何确定IAP程序在FLASH中的大小可以看我的另一篇文章)。
    1. IAP程序设计
    IAP程序的流程如下图所示,若要更新程序则

    • 擦除应用程序所在FLASH区
    • 串口接收一部分数据烧写一部分数据,直至数据接收完全
    • 关闭使用的外设,并复位使用的外设如串口、定时器
    • 跳转到应用程序


    跳转程序的代码如下:
    typedef void (*pFunction)(void);unsigned char jumpToApp(){        unsigned int JumpAddress;        pFunction Jump_To_Application;        //因为程序的第一个字为栈顶地址        //所以判断栈顶地址是否在RAM中        if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)        {                //程序的第二个字存放的是复位函数的地址,                //通过这个地址跳转的应用程序中                JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);                Jump_To_Application = (pFunction) JumpAddress;                //指向应用程序的栈顶                __set_MSP(*(__IO uint32_t*) ApplicationAddress);                //执行应用程序的复位函数                Jump_To_Application();        }        return JUMP_ERROR;}程序修改完成后要开始设置IAP程序的烧写地址,以KEIL IDE为例,如下图设置:

    2.应用程序设计
    应用程序的设计不需要更改,只需要更改下烧写地址,以KEIL IDE为例,如下图设置:

    3.烧写
    烧写分两种方法

    • keil 烧写
    • jlink的J-Flash烧写bin文件
    使用keil烧写则按照上面的设置方法直接烧写就可以了,可以先烧些IAP驱动程序,也可以先烧些应用程序。
    使用bin文件通过jlink烧写则需要将

    • 生成bin文件
    • 修改jlink设置
    生成bin文件需要在 Project->Options for Target中的User中设置,如下图所示:

      1. 勾选Run #1
      2. 添加语句其组成为
    fromelf.exe所在路径 --bin --output 输出bin文件路径 输入的axf路径
    我的设置如下:D:\Program Files (x86)\keil-arm\ARM\ARMCC\bin\fromelf.exe --bin --output ./iap.bin ./output/iap.axf

    这样就能在指定的位置生成bin文件
    通过j-flash文件分别加在这两个bin文件进行烧写,注意加载bin文件的时候需要改变起始地址,IAP程序的起始地址是0x8000000,我的应用程序的地址是0x8003000。如下图所示

    总结
    IAP的程序设计分为两部分:

    •   IAP驱动程序
    •   应用程序(原来的程序)

    IAP驱动程序负责开机之后的流程处理:

    • 是否更新的应用程序
    • 如何接受更新的应用程序代码(bin文件)
    • 是否跳转到应用程序

    应用程序无需什么修改,只是更改下keil的设置即可。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 16:53 , Processed in 0.126045 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.