这是以前就想写的一个小专题关于IAP,以及IAP在STM32编程的应用,专题分三小节,主要介绍常见的单片机烧录方式,IAP的实际应用,以及Ymodem协议在IAP编程中应用,在笔记吃灰很久了,终于拿出来晒晒太阳了@-@。
第一章:浅析ICP与ISP、及IAP三种单片机烧录方式
第二章:STM32应用IAP进行程序更新详解及实例
第三章:Ymodem协议解析-基于STM32的IAP实现


0、序

  • 硬件平台:STM32F103RCT6
  • 软件平台:GCC + STM32CubeMX + STM32CubeProgram
  • Bin文件传输工具:Tera Term

1、新建IAP工程

1.1、工程配置

  由于本次实际是通过串口进行bin文件的传输,所以在新建工程的时候最少使能一组串口用于传输烧录文件使用,新建工程的话在这里就不赘述了,毕竟本文的center是IAP的应用。

1.2、移植官方demo中的相关文件

  官网demo传送门:https://www.st.com/content/st_com/zh/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32cube-expansion-packages/x-cube-iap-usart.html
  其中我们所需要的文件如下:

  • common.c,ymodem.c,menu.c,flash_if.c
  • common.h,ymodem.h,menu.h,flash_if.h

2、分区规划

2.1、根据实际的使用需要对Flash进行分区

  在STM32F103RCT6的datasheet的第4章节中主要解析了该芯片的内部存储的映射地址,Flash是从0x08000000 ~ 0x0807FFFF = 512K(下图中为该MCU内存映射表,所以其映射的地址的范围是0x08000000 ~ 0x0807FFFF),即该型号MCU的Flash容量大小。

  根据本次demo开发时所作的一个内存的分区,主要分为三个部分如下表所示。其中IAP domain:大小16K,用于存储IAP升级的执行程序; APP domain: 为用户程序所在;Share domian:大小16K,用户程序与IAP共享区,用于相关标志量等的存储。

2.2、修改启动文件

  IAP程序的启动文件无需修改,因为该程序烧录的位置是默认的位置,即从映射地址0x08000000起大小为16K的内存块。由于用户APP烧录的位置非默认,需根据自定义的内存划分进行修改。ld文件定义程序入口地址,定义Flash、RAM中代码和数据的存放位置十分关键。

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 48K
FLASH (rx)      : ORIGIN = 0x8004000, LENGTH = 256K
}

3、用户程序与IAP之间的切换

3.1、IAP切换用户程序

3.1.1、跳转函数


  Share domain内存块是我额外划分为用于存储一些两个应用程序所共享的一些数据的内存区域。比如:用于存放启动程序的标志Flag之类的数据。开机程序启动后进行程序运行的选择,根据写在该区域地质中的信息进行IAP和APP之间的选择切换,实现从用户程序跳转IAP进行程序更新。

void BootmodeSwitch(void)
{/* close interruption */__set_FAULTMASK(1);/* set the vector table */if(AppBootflagRead()) //read the boot mask in the share zoom{/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000){/* Jump to user application */JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);JumpToApplication = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);JumpToApplication();}}/* enable interruption */__set_FAULTMASK(0);    return;
}

  上述代码还是挺经典的,为何取APPLICATION_ADDRESS地址指向的前四个字节的值与0x2FFE0000呢,那为什么是0x20005000呢?

  首先来看看中断向量表,我们的重点在第一二个DWORD,第一个Initial SP value是栈顶地址的值,第二个是Reset复位,这也是我们接下来实现程序跳转的关键所在。

  下面就来分析一下上面这段代码。

((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000

   (*(__IO uint32_t*)APPLICATION_ADDRESS) 即取0x8004000開始到0x8004003的4个字节的值,由于我们的应用程序APP中设置把中断向量表放置在0x08004000 开始的位置;而中断向量表里第一个放的就是栈顶地址的值,通过判断栈顶地址值是否正确(是否在0x20000000 ~ 0x 20002000之间)来推断是否应用程序已经烧录,也确保程序没有跑飞,若程序没烧录的话该地址的值一定为0xFFFFFFFF(初始化后的值flash一般为0xFF)。这里的0x2FFE0000需要根据不同芯片的SRAM的大小进行修改,假如使用的是STM32F103C8T6, RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K,具有20K的SRAM,所以RAM区地址范围为0x20000000~0x20005000,则应用起始地址与的对象为0x2FFFA000。

JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);

  APPLICATION_ADDRESS+ 4 即为0x08004000起始的第二个DWORD ,参考上面的中断向量表,第二个4字节为复位中断向量的入口地址。

//typedef  void (*pFunction)(void);
JumpToApplication = (pFunction) JumpAddress;

   JumpToApplication 其实质是一个函数指针,指向了复位函数所在的地址。

/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
JumpToApplication();

  最后是设置主函数栈指针和运行复位函数。

3.1.2、用户程序重定向中断向量

void BootReset(void)
{/* close interruption */__set_FAULTMASK(1);/* set the vector table */SCB->VTOR = FLASH_BASE | 0x4000;/* enable interruption */__set_FAULTMASK(0);
}

3.2、用户程序切换IAP

  通过读写标志位app_boot_mask_addr来进行程序切换,app_boot_mask_addr的实质是存储在Share domain区域的值,对该标志位写值后,对系统进行软件复位。复位后,程序一进入main函数便读取app_boot_mask_addr的值,若符合设置的进行IAP的条件便进入IAP程序。

void IAPModeEnter(void)
{uint32_t app_boot_mask_addr, gdata;app_boot_mask_addr = APP_BOOT_FLAG;gdata = 0;if(iap_enable_flag){iap_enable_flag = FALSE;FlashWritedata(app_boot_mask_addr, gdata);/* reset the system */HAL_NVIC_SystemReset();}
}

4、Demo演示

STM32应用IAP进行程序更新详解及实例相关推荐

  1. Hadoop示例程序WordCount详解及实例

    部分参考:http://www.javaeye.com/topic/606962 1.图解MapReduce MapReduce整体流程图 并行读取文本中的内容,然后进行MapReduce操作 Map ...

  2. STM32L4xx基于UART的IAP实现(实验详解)

    STM32L4xx基于UART的IAP实现(实验详解) 最近刚接触到STM32L452RET6(STM32L4xx系列)芯片,使用LL库配置(LL库更接近硬件层,直接操作寄存器.)可以先使用STM32 ...

  3. Android开发入门一之Android应用程序架构详解

    Android应用程序架构详解如下: src/ java源代码存放目录 gen/自动生成目录 gen 目录中存放所有由Android开发工具自动生成的文件.目录中最重要的就是R.java文件.这个文件 ...

  4. [Unity2018.2]ShaderGraph更新详解

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 洪流学堂公众号回复节点,获取ShaderGraph节点详解PDF文件(带目录). ShaderGraph 2018.2 更新详解 在2018.1 ...

  5. 基于STM32的IAP升级程序

    基于STM32的IAP升级程序 IAP介绍 功能设计 硬件设计 软件设计 软件设计流程如下 完整程序 具体实现 设计功能程序 IAP实现程序 主程序 后续 IAP介绍 IAP(In Applicati ...

  6. python的执行过程_在交互式环境中执行Python程序过程详解

    前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...

  7. 侍魂胧月传说服务器维护,侍魂胧月传说手游2021年6月2日停机维护更新详解

    在侍魂胧月传说手游中2021年6月2日更新了哪些有趣的内容呢?想了解2021年6月2日更新情况如何的话,接下来就让我们一起来看一下吧! 侍魂胧月传说手游2021年6月2日停机维护更新详解 <侍魂 ...

  8. fofa自动化爬虫脚本更新+详解

    fofa自动化爬虫脚本更新+详解 起因 最近要用到fofa爬虫,为什么要用爬虫不用api,问就是穷,想起来之前写过一个相关的脚本:Fofa-python-脚本,是很久以前写的了,之前写的时候有点问题, ...

  9. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

最新文章

  1. C语言register关键字—最快的关键字
  2. ionic+angularjs开发hybrid App(环境配置+创建测试项目)
  3. Android View体系(一)视图坐标系
  4. linux常用的makefile模版编写
  5. SpringBoot开发第一个Web入门级应用(超详细)
  6. ICH10R服务器主板是什么芯片,Intel ICH10R 芯片组 RAID配置
  7. 手机主题随手机壳改变_无线充电可以与手机壳一起使用吗?
  8. mac 查看端口并终结
  9. Ubuntu 12.04 更新重启无法进入桌面 -转
  10. h5如何上传文件二进制流_Hadoop如何将TB级大文件的上传性能优化上百倍?
  11. modbus地址扫描_西门子PLC通信编程MODBUS通信举例
  12. 操作系统:哲学家就餐问题
  13. 稳定同位素示踪技术在内源性物质代谢调控中的应用
  14. https://blog.csdn.net/myy629464/article/details/77938431/
  15. 【游戏开发创新】自学Blender建模,自制孔明灯,在Unity中点亮整个星空,愿新年,胜旧年(Unity | 建模 | 粒子系统 | 预设)
  16. Java面试之JVM
  17. 基于JAVA学生会管理系统2021计算机毕业设计源码+系统+数据库+lw文档+部署
  18. oracle对应字符集汇总,Oracle字符集子集与超级的对应关系
  19. excel mysql 财务_excel财务函数
  20. php禁止视频自动播放,分享新浪视频禁止自动播放的方法

热门文章

  1. oracle10g无监听配置文件,Oracle 10g学习笔记(七) tnsnames.ora 监听配置文件详解
  2. SpringBoot整合redis缓存(一)
  3. every和some的区别
  4. C++ 图片完整性校验
  5. 办公软件操作(小技巧1)
  6. SAP维护视图(Maintenance View)和视图簇(View Cluster)用法小结
  7. 一文玩转 Java 日志数据脱敏
  8. 居家隔离没事干?进来秒变算法工程师
  9. 关于java语言继承的说法正确的是_下列关于Java继承的说法中,正确的是( )
  10. 全景图剪切程序Sphere2Cube(一张全景生成六张立方体天空盒图Cubmap)