基于STM32的高可靠IAP在线烧写设计

IAP在线烧写实现原理

STM32基于Cortex-M内核的微控制器,其内部通过1张“中断向量表”来响应中断,“中断向量表”的起始地址为0x8000000,不同系列微控制器的起始地址可能不同。

当中断来临,STM32的内部硬件机制会自动将程序计数器PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。

STM32启动后,进入上电复位,首先锁存BOOT引脚的值以决定复位后的启动模式,实现在线烧写需将启动模式配置为从主闪存存储器启动,然后从“中断向量表”取出复位中断向量执行复位中断程序进行系统初始化,并引导进入main函数完成启动。

实现在线烧写技术的核心是一段预先烧写在微控制器内部的烧写引导程序。

在这里插入图片描述
首先把STM32片上Flash主闪存存储区划分为3个区,

  • 第1块区域起始地址为0x08000000,这个地址必须是片上Flash的起始地址,专门用来存储烧写引导程序(BootLoader),其包含1张向量表和main函数;
  • 第2块区域起始地址为0x08000000+m,专门用来存储用户应用程序(APP),也包含1张向量表和main函数;
  • 第3块区域起始地址为0x08000000+n,专门用来存储程序的烧写状态。

烧写方式为:

  • 第1个区域的烧写引导程序只能通过传统的JTAG或者ICP烧入。
  • 第2个区域的应用程序通过IAP在线烧写方式烧入。
  • 第3个区域的烧写状态由烧写引导程序和应用程序进行读写访问,以确认是否需要烧写应用程序,共分为待烧写、已烧写和未烧写3个状态。

在分配区域空间大小的时候,一定要结合各区域代码的实际大小,防止区域重叠,即图中的空白区必须大于等于0。

通过修改STM32工程的链接脚本可以修改程序文件写入内存的起始地址,这样可以根据各段程序的实际大小把应用程序烧写到设计好的固定地址中。

微控制器上电后,首先运行烧写引导程序,若有烧写指令,则对应用程序存储区的程序进行升级操作并更改烧写状态。
若没有收到烧写指令,程序指针跳转到应用程序存储区,开始执行存储区的应用程序。
当在应用程序的执行过程中收到烧写指令,则跳转到烧写引导程序进行升级操作。

软件流程

一个完整的在线烧写系统包括上位机发送端和嵌入式终端,两者之间由通信总线连接,嵌入式终端中包含烧写引导程序BootLoader和用户应用程序APP。

在这里插入图片描述
上位机发送端主要完成Hex文件的读入、校验和发送。
首先向嵌入式终端发送烧写指令,若嵌入式终端反馈接收烧写指令成功,则逐帧发送校验过的烧写数据,在发送数据的过程中若接收到错误反馈,则重发出现错误的数据帧。
在这里插入图片描述
BootLoader的主要功能是判定是否需要进行软件更新,若需要更新则进入程序烧写流程,若不需要则引导跳转到用户程序APP执行。

开始运行后,首先写Flag为3,表示未烧写,然后循环检查烧写状态标志Flag。
若Flag为1,表示已收到烧写指令,将进入数据接收,校验和烧写的流程,烧写完成后,将Flag改写为2,并跳转进入APP执行。
若Flag为2表示已完成烧写,将直接跳转到APP执行。
若Flag为3则表示还没有应用程序,将一直运行在BootLoader中等待烧写应用程序。
在这里插入图片描述
APP的主要功能是判定在应用程序的正常执行过程中,是否接收到烧写指令,若接收到将Flag改写为1,并跳转到BootLoader执行,直接进入烧写流程,烧写完成后,将Flag改为2,并跳转进入APP执行,这样就完成了程序的在线升级。

Hex文件生成及单帧消息定义

烧写文件一般有ELF、HEX、BIN和AXF几种格式。
本项目采用KEIL开发环境,默认生成的AXF文件,AXF文件除了包含BIN文件内容外,还附加其他调试信息,可以直接用于调试。
BIN文件是纯粹的二进制代码,AXF文件可以转化为BIN文件,
相比于AXF和BIN文件,HEX文件是记录文本行的ASCII文本文件,包含地址信息和校验信息等,更加可靠,便于在线烧写的开发,在KEIL环境中可以配置相关选项直接生成HEX格式烧写文件。

在这里插入图片描述
其中TT为数据DD…的类型,0x00表示数据,0x01表示文件末尾,0x02表示扩展段地址,0x04表示扩展线性地址,嵌入式终端接收到消息帧时,通过判断TT的值就知道是否烧写完成。

向量表的重定位

在STM32的内部存储空间存在2段独立的代码BootLoader和APP,包含2张不同的中断向量表。
在这里插入图片描述
在APP程序执行的过程中,一个中断请求来临,PC指针仍会回转至地址为0x8000004中断向量表处,而并不是新程序的中断向量表,如⑩,这是由STM32的硬件机制决定的。
所以APP应用程序的中断向量表需要进行偏移,偏移量的大小等于应用程序起始地址相对于0x08000000的偏移,m值的大小必须为0x200的整数倍。

STM32的SCB系统控制块中专门有1个向量表偏移寄存器VTOR

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;

FLASH_BASE表示向量表定位于内部FLASH中,VECT_TAB_OFFSET为偏移地址。

当配置完成后,当1个中断请求来临,会执行4、5、6.

分散加载文件配置

分散加载文件能够将加载文件和运行时存储器中的代码和数据的位置描述在1个文本文件中,在KEIL中通过设置供链接时使用,分散加载区域分为加载区和执行区。

BootLoader和APP拥有各自的分散加载文件,通过配置对应的起始地址start_address和长度max_size就可以将BootLoader和APP2段代码存储到不同的位置。

跳转函数实现

在系统的运行过程中,程序可能会从BootLoader跳转到APP执行,或者从APP跳转到BootLoader执行。

当从1个程序跳转到另外1个程序运行时,首先要检查跳转地址的合法性,然后需要重新初始化栈顶地址,最后再跳转到指定地址执行,注意不能再中断处理函数中进行跳转。

在这里插入图片描述

高可靠设计

在在线烧写过程中,可能出现各种突发情况导致烧写失败,也有可能烧写成功,但却烧入了错误的数据。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Caramel_biscuit/article/details/131902463