IAP,全称是“In-Application-Programming”,中文解释为“在程序中编程”。不同于ISP通过设置MCU内部的BootLoader程序引导烧写或者是ICP通过SWD、JTAG在线仿真烧写。IAP是一种对通过微控制器的对外接口如:USART,IIC,CAN,USB,以太网接口甚至是无线射频通道等对正在运行程序的微控制器进行内部程序的更新的技术。

如何实现?

1、实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程序主要负责与外部的上位机软件进行握手同步,然后将通过外设通信接口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。

2、在STM32微控制器上实现IAP程序之前首先了解STM32的内部闪存组织架构和其启动过程。关于启动过程:

【FreeRTOS】读书笔记,嵌入式微操作系统

3、STM32的内部闪存地址起始于0x8000000,一般情况下,程序文件就从此地址开始写入。程序启动后,将首先从“中断向量表”(“中断向量表”来响应中断)取出复位中断向量执行复位中断程序完成启动。“中断向量表”的起始地址是0x8000004,当中断来临,STM32的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。最后还需要知道关键的一点,通过修改STM32工程的链接脚本可以修改程序文件写入闪存的起始地址。

①、 STM32复位后,从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,随后跳转至IAP程序的main函数。

②、 执行完IAP过程后(STM32内部多出了新写入的程序,地址0x8000004+N+M)跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数,注意在STM32的内部存储空间在不同的位置上出现了2个中断向量表。

③、 在新程序main函数执行的过程中,一个中断请求来临,PC指针仍会回转至地址为0x8000004中断向量表处,由于中断向量表地址强制偏移而跳转新程序的中断向量表。⑤⑥⑦过程(内部存在两个中断向量表)

④、 根据中断源跳转至对应的中断服务,注意此时是跳转至了新程序的中断服务程序中。

⑤、 中断服务执行完毕后,返回main函数。

void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset);

参数NVIC_VectTab为中断向量表起始位置,而参数Offset则为地址偏移量,如将中断向量表移至0x8002000处,则应调用该函数如下:(这个地方应该是固件库里面的,HAL库应该没有)

void NVIC_SetVectorTable(0x8000000, 0x2000);

注意:函数只会修改STM32程序中用于存储中断向量的结构体变量,而不会实质地改变中断向量表在闪存中的物理位置。

设计IAP方案:

1、STM32复位后,利用一个按键的状态进行同步,当按键按下时表示将要进行IAP过程。

2、IAP过程中,通过上位机软件向STM32的USART设备发送所要更新的程序文件,(程序在flash存储中起始地址由自己在BootLoader中设定好,每次复位检测是否有新程序)

3、STM32借助定时器来判断数据是否完全接收,完全接收后IAP过程结束。

4、再次复位后,跳转0x8000004+N+M地址开始运行新写入的程序。

注意事项:

  • 利用IAP写入的程序文件最好是.bin格式的文件。
  • 向STM32发送程序文件时尽量慢一些,因为STM32对FLASH的写入速度往往跟不上通讯外设接口的速度。
  • 防错机制。

【IAP】IAP在线升级流程相关推荐

  1. HC32L130基于Xmodem协议实现IAP串口在线升级

    在开始写文章之前,要先吐槽一下国产单片机,不对是国产单片机厂家,他们的技术支持实在太烂了,烂的让你怀疑等技术支持还不如自己啃手册,尤其是那种中间有代理商的厂家,技术支持更是良莠不齐,时效性也不行,问个 ...

  2. STM32 IAP 串口在线升级源码详解

    本博文基于本人修改的代码进行编写如需代码, 请到[代码下载](https://download.csdn.net/download/qq_36257571/10695681)自行下载. 详细内容不做过 ...

  3. CRC校验原理及STM32 IAP在线升级程序

    CRC校验原理: 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据 ...

  4. STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

    IAP 是啥   IAP( In Application Programming)即在应用编程,也就是用户可以使用自己的程序对MCU的中的运行程序进行更新,而无需借助于外部烧写器.其实ST官网也给出了 ...

  5. iap如何初始化_IAP在线升级模块详细设计说明

    目  录 1 编写目的5 2 术语.定义和缩略语5 2.1 术语.定义 5 2.2 缩略语 5 3 模块描述5 3.1 Flash的特性 5 3.2 Flash的资源划分 5 3.3 MCU中断的使用 ...

  6. STM32F4单片机bootloader及在线升级IAP基本原理

    STM32F407基础总结系列(三) STM32F4bootloader及在线升级IAP基本原理 一 .前言 二.背景知识补充 2.1 系统启动过程 2.2 内存映射分布 三.bootloader 3 ...

  7. iap升级问题 stm32f103r8_STM32在线升级OTA,看这一篇就够啦~

    EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x 本帖最后由 Ber_thaw99 于 2020-12-3 13:33 编辑 " \; [( t3 j4 {&qu ...

  8. STM32在线升级 (IAP)

    来自QQ群 Linux && 技术分享 311078264 打开链接加入QQ群:https://jq.qq.com/?_wv=1027&k=5Gr3bAx 此文档由elikan ...

  9. 51单片机IAP在线升级

    51单片机IAP在线升级 爱矽半导体E85F3325单片机IAP在线升级教程,此处可查看更新及demo下载 文章目录 前言 一.ROM资源 二.KEIL有关知识 1.BL51连接器: 2.LX51连接 ...

最新文章

  1. 一个基于Python2.7的智慧校园系统
  2. ActFrameWork集成Beetlsql的Mapper功能
  3. RocketMQ源码解析:Filtersrv
  4. 一款 APK 是怎么诞生的?
  5. 提取多个字段_【博客翻译】建筑物轮廓线提取以及损坏分类
  6. 性能优化(8):使用javascript缓存查询结果
  7. 面试精讲之面试考点及大厂真题 - 分布式专栏 09 缓存必问:Reids持久化,高可用集群
  8. Android内存、性能是程序永恒的话题
  9. 基于SURF特征的图像与视频拼接技术的研究和实现(一)
  10. 暴走恭亲王:Jed McCaleb才是中本聪大魔王?
  11. AIML框架 初探
  12. 流量用起来不要钱 | 立即打卡潮人好物,免流量再送2年网易云音乐黑胶VIP
  13. swift 的水波动画或雷达动画效果
  14. python实现素数判断
  15. grub4dos linux iso,Grub4Dos仿真ISO启动CDlinux省可用内存的方法
  16. mysql中将数字转化成汉字 基础
  17. python--DataFrame随机抽样
  18. jsp免费虚拟空间 jhost邀请码
  19. 编写一个 SQL 查询来实现分数排名
  20. Linux查看文件行数

热门文章

  1. Postgresql学习笔记-高级语法篇
  2. 程序员技术怀旧_晒晒那些过去的经典
  3. Angular 服务端渲染(SSR) 学习笔记
  4. Echarts地图制作介绍
  5. tradingview 修改K线的颜色,边框色,线条色
  6. 2017物流数据报告
  7. BAV99W 器件的作用
  8. oracle 连接 双网卡,Oracle Linux 6.4(BOND)双网卡绑定实战—附加说明
  9. DFS+DP搜索斗地主玩家手牌最少出牌次数
  10. Ubuntu18.04 双屏显示 双显卡设置