IAP升级

一、概述

  IAP是通过外设来实现程序升级的一个统称,可以通过的外设有串口、WIFI、蓝牙、网口、无线模块等,只要可以和芯片通讯的都能做为IAP的升级方式。

  IAP项目需要三种东西。BOOT、APP和上位机,单独介绍下这几个东西:

    BOOT:实现程序的擦除和APP跳转和APP升级。必须实现有两个,一个是和外部升级设备的通讯,另一个是Flash的读写。

       APP:运行的程序,必须实现的功能,一个是和外部升级设备的通讯,另一个是Flash的读写,还有一个是软件的重启。(每次在APP运行中进行数据

          升级时候,给标志后,重启到BOOT进行升级工作,这样子最省空间,失败就重新刷就好了,又不会变砖)。APP一把需要的是BIN文件。

    上位机:用来发送APP给需要升级的芯片的,最好理解的是通过电脑上位机进行串口通讯进行的数据升级。这个升级协议一般都是私有的,根据个人的

        习惯和上位机的习惯来定制。现有大家使用比较多的是ymodem的协议有比较多的人在使用。

  注意在使用BOOT和APP编程时候有几个东西是共用的,boot地址是0x08000000, IAP大小默认3K,BOOT大小,共用存储空间的大小。

二、实战介绍

  使用STM32F1的芯片来实现串口IAP功能,在boot端实现了串口通讯和flash的读写,添加状态机和跳转APP程序,擦除APP区程序,写入APP程序程序;

  • 添加状态机在菜单、擦除,跳转和写入之间切换;
  • 跳转APP使用下面的函数
int8_t IAP_RunApp(void)
{
    if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)//判断栈定地址值是否在0x2000 0000 - 0x 2000 2000之间
    {   
        SerialPutString("
 Run to app.
");
        JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);//ApplicationAddress + 4  即为0x0800 3004 ,里面放的是中断向量表的第二项“复位地址”
        Jump_To_Application = (pFunction) JumpAddress;//Jump_To_Application指向了复位函数所在的地址
        __set_MSP(*(__IO uint32_t*) ApplicationAddress);//设置栈顶地址 用户代码的复位地址付给PC指针 
        Jump_To_Application();
        return 0;
    }
    else
    {
        SerialPutString("
 Run to app error.
");
        return -1;
    }
}
  • 擦除APP

    识别需要擦除的大小

    按页擦除

  • 写入APP
       
原文地址:https://www.cnblogs.com/luckytimor/p/14963262.html