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

2023-11-11

IAP 是啥

  IAP( In Application Programming)即在应用编程,也就是用户可以使用自己的程序对MCU的中的运行程序进行更新,而无需借助于外部烧写器。其实ST官网也给出了IAP的示例程序,感兴趣的可以直接去官网搜索。
  这里有一点需要特殊注意,就是在MCU中,有一个特殊区域被称为 System memory。在这块区域中存放了ST公司自己的 bootloader 程序,它是在MCU出厂时,有ST固化到芯片中的,后续不能再更改。其中的 bootloader 程序也可以对MCU进行升级(DFU对芯片的编程应该就是用的这个Bootloader)。而且,芯片不同,BootLoader的功能也是有区别的。ST官网对于这些也是有详细文档的,后续再写篇文章介绍这一块。下图为部分芯片BootLoader版本及功能
在这里插入图片描述

STM32 MCU启动配置

  要实现IAP,首先要了解一下MCU是如何启动的。这一点在芯片的参考手册中都有详细的说明,不同的芯片手册所在位置可能不同,但是一般在第二章会有单独一节叫Boot configuration。如下图:
BootConfig
主要就是说,启动是通过管脚BOOT0和BOOT1的连接方式来控制的。这个是在硬件设计阶段设计好的。不同的配置决定了,MCU将何处映射到0x00000000。从这里又可以看到一点,MCU眼里只有0x00000000。至于为啥可以从Flash(0x08000000)启动,就是因为MCU内部做了映射。从其他位置启动时同理。

IAP 实现

  要实现IAP,则整个程序实现分为大程序(APP)和小程序(IAP)两部分。其中,APP主要接收升级数据并存储,IAP处理擦除APP,并重新写入升级数据。此外,IAP还应该可以独立接收升级数据的情况。但是,由于Cortex-M0核是没有中断向量表偏移寄存器的,这就导致了在Cortex-M0核的MCU上实现在线升级比较麻烦。在实际产品中,整个程序的基本组成结构:
FlashUsage
实际的IAP流程如下:
在这里插入图片描述
就是这么简单!

注意:
(1)与 Cortex-M3 和 Cortex-M4 不同,Cortex-M0 没有中断向量表偏移寄存器(VTOR寄存器)
(2)Cortex-M3 r2p0 及其之前版本,中断向量表只能位于SRAM或者CODE区域,但是Cortex-M3 r2p1及之后,Cortex-M4 没有该限制!
(3)MCU根据Boot引脚配置将指定地址映射为0x地址!

IAP 启动

  启动网上有很多文章介绍,但是或多或少不是很完善,我只做了一张相对来说比较详细的图,如下:
Startup
  Cortex-M内核规定,中断向量表开始的4个字节存放的是堆栈栈顶的地址,其后是中断向量表各中断服务程序的地址。当发生中断后程序通过查找该表得到相应的中断服务程序入口地址,然后再跳到相应的中断服务程序中执行,中断服务程序中最终调用用户实现的各函数。例如:main函数就是复位中断服务函数中调用的!
  在没有IAP时,上电后从0x08000004处取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号①所示),执行结束后跳转到main函数中(标号②所示)。通常main函数是个死循环,不会退出。在执行main函数的过程中发生中断,则STM32强制将PC指针指回中断向量表处(标号④所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。
  在添加IAP后,上电后仍然从0x08000004处取出复位中断向量的地址,然后跳转到复位中断程序的入口(标号①所示),执行结束后跳转到小程序的main函数中(标号②所示)。在执行小程序main函数的过程中发生中断,则STM32强制将PC指针指回中断向量表处(标号④所示),从中断向量表中找到相应的中断函数入口地址,跳转到相应的中断服务函数(标号⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。而想要大程序执行,则必须在小程序中显示强制跳转(标号⑦)。
  在大程序的main函数的执行过程中,如果CPU得到一个中断请求,由于我们设置了中断向量表偏移量为N+M,因此PC指针被强制跳转到0x08000004+N+M处的中断向量表中得到相应的中断函数地址,再跳转到相应新的中断服务函数,执行结束后返回到main函数中来。
  需要注意的是,复位中断比较特殊。产生复位后,PC的值会被硬件强制置为0x08000004。因为,在发生复位后,负责中断向量偏移的寄存器VTOR变为了0,因此,复位后的中断就变为了0x08000004。而其他中断发生时,VTOR为已经设置好的终端向量表偏移。

程序实现

  有了上面的介绍,实现就比较简单了!其实我有设计了一套适用于全部STM32芯片的IAP模板,但是属于公司产品,不方便对外公布!简单说几个重点:

  1. 使用 分散加载文件 实现起来会比较方便
  2. 对于没有中断向量表偏移寄存器的MCU(主要是Cortex-M0核),一般采用将中断向量表复制到指定位置的内存中的方式实现:
    1. 使用分散加载文件在内存中指定一块区域:
    	#if   (defined ( __CC_ARM ))
    	  __IO uint32_t VectorTable[48] __attribute__((section("SECTION_APP_VECTOR")));
    	#elif (defined (__ICCARM__))
    	#pragma location = 0x20000000
    	  __no_init __IO uint32_t VectorTable[48];
    	#elif defined   (  __GNUC__  )
    	  __IO uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));
    	#elif defined ( __TASKING__ )
    	  __IO uint32_t VectorTable[48] __at(0x20000000);
    	#endif
    
    1. 将APP的终端向量表复制到以上位置,设置中断向量表重映射
    static void SetVectorTable(void)
    {
    	int i;
    
    	/*!< At this stage the microcontroller clock setting is already configured, 
    	this is done through SystemInit() function which is called from startup
    	file (startup_stm32f0xx.s) before to branch to application main.
    	To reconfigure the default setting of SystemInit() function, refer to
    	system_stm32f0xx.c file
    	*/ 
    
    	/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  
    	/* Copy the vector table from the Flash (mapped at the base of the application load address 0x08003000) to the base address of the SRAM at 0x20000000. */
    	for(i = 0; i < 48; i++)
    	{
    		VectorTable[i] = *(__IO uint32_t*)(APP_SPACE_ADDR + (i<<2));
    	}
    
    	/* Enable the SYSCFG peripheral clock */
    	RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);	/* 注意:ST官方例程使用 RCC_APB2PeriphResetCmd是不对的 */
    	/* Remap SRAM at 0x00000000 */
    	SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
    }
    
  3. 在由 IAP 跳转到 APP 时,一定注意把 IAP 中开启的外设全部关闭,否则在刚进入 APP中时,如果产生中断将导致死机等问题。 包括 SysTic 中断!!!包括 SysTic 中断!!!包括 SysTic 中断!!!这里可以做测试:
    1. 测试一:IAP 中开启串口,然后用上位机不停的发送数据,在发送数据过程中执行 IAP 跳转 APP
    2. 将 SysTick 中断 配置时间很短(微秒级别),当程序跳转到 APP 后,会出现 先产生 SysTick 中断,然后才会到 main 函数。此时如果 SysTick 中断中有相关代码,将导致出现错误!
  4. STM32 的 back SRAM 在 IAP 中和 APP 中都初始化时,将导致 APP中的初始化不起作用。如果 IAP 中有使用,则在跳转 APP前必须反初始化。

(2条消息) STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决_EXP-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 【STM32】IAP下载程序分析

    IAP下载程序分析 IAP基本原理STM32启动流程程序跳转代码实现总结 IAP基本原理 要实现STM32的IAP xff08 在应用编程 xff09 xff0c 需要分别建立bootloader和app工程 这里的bootloader程序
  • STM32F407-用TB6600驱动器驱动57步进电机(代码+连线)

    一 硬件 1 硬件准备 57步进电机 xff08 型号57CM18 xff09 xff0c 驱动器TB6600 xff0c 开发板STM32F407ZGT6 2 电气特性 3 连线 驱动器右边分有两个区域 Signal xff1a 用于驱动
  • STM32F407-ADC(模数转换)

    一 硬件 STM32F407开发板 xff0c 杜邦线 通过通道获取板载电压的模拟输入信号转变为数字信号 xff0c 并通过转换变成电压 STM32F407有3个ADC xff0c 每个ADC有16个通道 xff0c 下表为ADC通道对应的
  • STM32F407-SPI通信接口

    1 SPI概念 SPI xff0c 是一种高速的 xff0c 全双工 xff0c 同步的通信总线 xff0c 并且在芯片的管脚上只占用四根线 xff0c 节约了芯片的管脚 xff0c 同时为PCB的布局上节省空间 xff0c 提供方便 xf
  • STM32F407控制42,57两个步进电机用传感器限制位置

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • STM32F407用wk2124芯片编写SPI转四路串口驱动

    目录 引言 一 SPI通信配置 1 GPIO初始化设置 2 SPI参数配置 3 读写函数 4 速度设置 二 WK2124逻辑代码编写 1 片选初始化 2 写寄存器函数 3 读寄存器函数 4 写FIFO函数 5 读FIFO函数 6 WK212
  • 基于STM32F407的WIFI通信(使用的是ESP8266模块)

    基于STM32F407的WIFI通信 xff08 使用的是ESP8266模块 xff09 本次做的是WIFI通信所实现的功能是 xff1a 由单片机端向客户端发送数据 模式 xff1a STA模式 xff08 及连接路由器的方式 xff09
  • 基于STM32F407时钟配置学习

    STM32F4x系列时钟树如下 xff1a 1 系统时钟SYSCLK 在STM32F407中 xff0c 除了一些特定的时钟 xff08 例如 xff0c USB OTG FS时钟 xff0c I2S时钟 xff09 外 xff0c 系统所
  • 【STM32---IAP】基于CAN总线的BootLoader上下位机设计

    IAP开发 下位机STM32 43 上位机Linux 一 准备工作二 IAP系统开发2 1 IAP简介2 2 IAP下位机开发2 2 1 刷写文件选择2 2 2 Bootloader程序框架2 2 3 Bootloader程序开发2 2 3
  • 亲测+STM32F407+freertos+cumax+串口空闲中断和can接收发送

    STM32F407 freertos cumax 串口空闲中断和can接收发送 本人最近再学习使用cumax软件搭建stm32f4的freertos系统 废话不多说 首先介绍一下主要的硬件和软件配置 Cumax 采用Version6 1 1
  • STM32F407 串口编程USART1,USART2,USART3,UART4

    串口设置的一般步骤可以总结为如下几个步骤 xff1a 1 串口时钟使能 xff0c GPIO时钟使能 2 设置引脚复用器映射 xff1a 调用GPIO PinAFConfig函数 3 GPIO初始化设置 xff1a 要设置模式为复用功能 4
  • STM32 IAP Ymodem

    STM32 IAP采用Ymodem协议升级固件 公司最近软件需要通过IAP来升级所有板卡的固件 其中板卡有2块 一块主控板卡 一块子控板卡 其中 主控板卡与子控板卡之间采用RS485通信 PC与主控板卡采用RS232通信 具体框架 一 PC
  • STM32F407+ESP8266连接机智云过程详解

    工程创建 代码调试过程参见 STM32F407 ESP8266 程序源码下载 STM32F407 ESP8266连接机智云程序源码
  • IAP 程序 跳转问题

    问题 STM32F407 未加下面 清除所有中断标志位 IAP无法跳转到APP 原因 开了定时器 配置了中断 在执行时为清除中断 导致程序无法跳转 void flash load application uint32 t applicati
  • PID算法与PID自整定算法

    PID算法与PID自整定算法 本文是由于研发恒温槽项目故需要了解PID控制算法和PID自整定算法 为方便本人日后需要故作此记录 直接粘贴代码吧 这是PID位置式控温算法 函数名 void Pid positional float speed
  • MS5607使用中的问题,温度低于20℃,数值不对

    MS5607使用中的问题 温度低于20 马后炮 因为是网上找的代码 懒得看手册 导致后面低于20摄氏度还会有问题 只好认真的看了手册 发现我的代码是ms5611的 照着手册重新改写后就木有问题了 不能省的地方就别省了 公司使用MS5607设
  • USR-WIFI232-B2(WIFI)模块没有和服务器TCP连接成功时,单片机读取USR-WIFI232-B2(WIFI)模块的MAC地址

    您想要实现什么功能 1 单片机上电后先读取WIFI模块的MAC地址 2 读取完WIFI模块的MAC地址的后 WIFI模块和上位机进行TCP通信 WIFI模块作为服务器 需要发送 a 进入AT指令配置状态 读取MAC 读取之后 发送AT EN
  • STM32F407移植FATFS文件系统(版本 R0.09b)支持长文件名和中文名称

    FatFs文件系统 默认是不支持长文件名和中文名称的 要想支持长文件名和中文名称 需要打开ffconf h文件进行配置 一 支持长文件名 FatFs文件系统 默认是不支持长文件名的 要想支持长文件名 需要打开ffconf h文件进行配置 找
  • 单片机串口实现字符串命令解析---使用函数指针(类似哈希表)

    通常情况下串口通信用的大多数都是用十六进制数据来传输指令 比如最常见的modbus的通信 如读保持寄存器指令 01 03 00 00 00 01 84 0A 这种十六进制的指令在这里就不讨论了 想要详细了解可以看往期的文章 串口相关文章链接
  • Micropython开发篇三--基于F411 CE的移植编译

    Micropython开发篇三 基于F411 CE的移植编译 最近在学操作系统 RTOS与Linux 对Micropython有些新的认知 回头又复习了一下Micropython 简直要不要这么优秀 希望通过这篇文章能带给大家不一样的Mic

随机推荐

  • 云备份和标准数据中心的备份有所不同

    云备份和标准数据中心的备份有所不同 当您需要实施某种基于云的系统恢复技术时 您有两种路线可以选择 但费用和风险各不相同 备份通常都是个很好的策略 您需要有能力在某个地方备份数据和应用程序 以便在某些自然或人为灾难的情况下依旧可以保持业务的运
  • verilog 01 基本概念

    语言整体介绍 硬件描述语言 用来描述组合电路和时序电路 代码分为 目标代码 和 验证代码 一般叫TB testbench 都需要用编译器仿真器编译 iverilog 源码 提供 编译器 iverilog 和 仿真器 vvp 目标代码 和 验
  • 解决Element中点开Dialog 对话框灰布在最上层的方法

    解决Element中点开Dialog 对话框灰布在最上层的方法 解决Element中点开Dialog 对话框灰布在最上层的方法 append to body Dialog 自身是否插入至 body 元素上 嵌套的 Dialog 必须指定该属
  • TCP如何保证可靠性传输

    校验和 在数据传输的过程中 将发送的数据段都当做一个16位的整数 将这些整数加起来 并且前面的进位不能丢弃 补在后面继续相加 最后取反 得到校验和 发送方 在发送数据之前计算检验和 并进行校验和的填充 接收方 收到数据后 对数据以同样的方式
  • 基于WebSocket和Android的多人实时聊天系统(Demo)的实现

    实现效果 服务端实现 服务端参考之前的这篇文件Android初学 使用WebSocket与服务器进行通信 这里做了一些修改 就是再服务端收到消息后 将消息群发给所有在线的客户端 服务端的Bean实体类 Data AllArgsConstru
  • 项目开发中的一些小配置,随时更新(springboot版本)

    这里是目录哦 1 appication properties 2 log4j properties 3 MySwaggerConfig java 4 MybatisplusConfig java 1 appication propertie
  • 如何使用Python 操作PDF?总结用Python操作PDF的几种方法

    本篇文章小编给大家分享一个用python来操作pdf图像的几种方法 如果有需求的小伙伴一定要耐心阅读完这篇文章 小编希望能够通过这篇文章来给大家的学习带来一定的帮助 Python操作PDF有以下几种方法 1 基本操作 PyPDF2 导入模块
  • C++进制转换的两种方法

    进制的转换 stoi函数
  • 离线升级openssh 从7.4升至9.0

    离线升级openssh 从7 4升至9 0 难点 无法使用联网下载的命令yum等 前提 需要先更新openssl 到1 11 1 链接 https blog csdn net weixin 42235875 article details
  • 内核杂谈——页表项存放的是物理地址还是虚拟地址?

    目录 L0 L1 L2 表项 L3 表项 总结 pgd t 不只是物理地址 谈谈对映射的理解 思考 当你不去细细读代码的话 这个问题可能会困扰着你 我们以ARM64四级页表为例 谈谈页表项里藏得是什么 本文讨论的是内核线性映射过程时建立的临
  • 从Jaccard到BERT:语义检索的度量手段

    原文标题 Semantic Search Measuring Meaning From Jaccard to Bert 作者 James Briggs 原文地址 https towardsdatascience com semantic s
  • 用一个海龟(turtle) 来写 “张”

    1 import turtle as t 2 3 t pen pencolor cyan pensize 10 4 5 t speed fast 6 for in range 3 7 t fd 20 8 t rt 90 9 t backwa
  • JS语法之:require

    JS中 一个模块加载另一个模块有两套规范 CommonJS规范和AMD规范 CommonJS规范加载模块是同步的 也就是说 只有加载完成 才能执行后面的操作 AMD规范则是非同步加载模块 允许指定回调函数 由于Node js主要用于服务器编
  • 接口测试工具soapUI

    1 soapUI安装及破解 参考 http blog csdn net liuchangxin1982 article details 47614625 1 安装方法 先下载SOAPUI 我这里用的是5 1 2 PRO 版 下载路径 htt
  • Git下载、安装及环境配置(超详细)

    本文首发自个人自有博客 FaxMiao个人博客 一个关注Web前端开发技术 关注用户体验 记录前端点滴 坚持更多原创 为大家提供高质量技术博文 本文主要介绍下Git的下载 安装及基本配置 予以初学者朋友帮助 更快的了解Git基础知识和快速使
  • Mysql5.7.41windows安装

    Mysql5 7 41windows安装 Mysql5 7 41windows安装 Mysql5 7 41官方下载 mysql安装 配置PATH路径 任意位置打开cmd都可以连接Mysql 环境验证 并登录 友情链接 Mysql5 7 41
  • 利用Fastjson进行泛型的序列化和反序列化

    public class SerialClass
  • qt下QString转换为const char*字符串

    概述 本文直在说明将QString类型的变量转换为const char 类型 实现 可以采用下面的方式来实现 QString toStdString c str 示例 下面是一个示例 const QString msg nis你好 cons
  • 10个Python爬虫入门实例,建议收藏!!

    1 爬取强大的BD页面 打印页面信息 第一个爬虫示例 爬取百度页面 import requests 导入爬虫的库 不然调用不了爬虫的函数 response requests get http www baidu com 生成一个respon
  • STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

    IAP 是啥 IAP In Application Programming 即在应用编程 也就是用户可以使用自己的程序对MCU的中的运行程序进行更新 而无需借助于外部烧写器 其实ST官网也给出了IAP的示例程序 感兴趣的可以直接去官网搜索