请选择 进入手机版 | 继续访问电脑版
    查看: 217|回复: 1

    [单片机资料] STM32 IAP 设计分享

    [复制链接]

    签到天数: 414 天

    [LV.9]元老将成

    发表于 2018-8-10 21:09:53 | 显示全部楼层 |阅读模式
    项目需要,需要开发一款手持设备,对产品进行软件升级。现在的产品都是使用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区域的命令

    1. int main(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.    
    14.     LED1 = 1;        
    15.     delay_ms(200);        //延时
    16.     LED2 = 1;
    17.     delay_ms(200);        //延时
    18.     LED3 = 1;
    19.     delay_ms(200);        //延时
    20.     LED4 = 1;
    21.     delay_ms(200);        //延时   

    22.     iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
    23. }
    复制代码
    1. #define FLASH_APP1_ADDR                0x08003C00          //第一个应用程序起始地址(存放在FLASH)
    2.                                                 //保留前15K的空间 做为bootloader区
    复制代码
    FLASH的起始地址是0x0800 0000,所以0x0800 0000~0x0800 3C00用于存放Bootloader。

    二、APP程序区。

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


    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,即可实现升级。

    1.jpg

    2.jpg



    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

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

    返回顶部