ST H7 BootLoder启动方式+IAP固件程序在线更新升级-综合

406 阅读6分钟

1 CM-7 内核启动文件

image.png image.png image.png image.png image.png image.png image.png image.png

  • 启动文件 image.png image.png
  • Reset_Handler image.png

2 CM-7 内核在离开复位状态后的工作过程如下

  • STM32 的系统存储区自带 bootloader,此程序是 ST 在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部 Flash。支持 USB,SPI,I2C,CAN,UART 等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级。
  • STM32H7 的内部闪存(FLASH)地址起始于 0X0800 0000,一般情况下,程序文件就从此地址开始写入。此外 STM32H743 是基于 Cortex-M7 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是 0x08000004,当中断来临,STM32H743的内部硬件机制亦会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序

2.1 启动文件代码剖析(详细分析启动文件startup_stm32h743xx.s)

image.png

  • 启动文件startup_stm32h743xx.s image.png

2.2 分散加载文件(分散加载文件设置栈顶及首条指令绝对地址

  • 在启动文件startup_stm32h743xx.s中把栈顶及首条指令地址到了最前面的地址空间,但这并没有指定绝对地址,各种内容的绝对地址是由链接器根据分散加载文件(*.sct)分配的, image.png

2.3 设置SRAM 栈顶及首条指令地址

image.png

3 IAP(In Application Programming)即在应用编程

  • IAP 目的是为了在产品发布后可以方便地通过预留的通信口产品中的固件程序进行更新升级
  • 通常实现 IAP 功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如 USB、USART)接收程序或数据,执行对第二部分代码的更新第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在 User Flash 中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作: image.png

3.1 正常的程序运行流程

  • STM32H7 正常的程序运行流程: image.png

3.2 加入 IAP 程序之后,程序运行流程

  • 第一个项目代码称之为 Bootloader 程序,第二个项目代码称之为 APP 程序,他们存放在 STM32H743 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序(注意,如果 FLASH 容量足够,是可以设计很多 APP 程序)
  • STM32H7 的 APP 程序不仅可以放到 FLASH 里面运行,也可以放到 SRAM 里面运行,本实验将制作两个 APP,一个用于FLASH 运行,一个用于内部 SRAM 运行 image.png
    1. STM32H743 复位后,还是从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到 IAP 的 main 函数,如图标号①所示
    1. 在执行完 IAP 以后(即将新的 APP 代码写入STM32H743 的 FLASH,灰底部分,新程序的复位中断向量起始地址为 0X08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数,如图标号②和③所示
    1. 在 main 函数执行过程中,如果 CPU 得到一个中断请求,PC 指针仍然会强制跳转到地址0X08000004中断向量表处,而不是新程序的中断向量表,如图标号④所示
    1. 程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示
    1. 执行完中断服务程序后,程序返回 main 函数继续运行,如图标号⑥所示

3.3 IAP 程序必须满足两个要求

image.png

3.3.1 IAP BOOT引导程序设计

  • 这里的 128K 字节,一般是需要大家根据 Bootloader 程序大小进行选择,比如本次实验的Bootloader 程序为 39K 左右,理论上我们只需要确保 APP 起始地址在 Bootloader 之后,并且偏移量为 0X200 的倍数即可,但是,于 由于 STM32H7 的扇区大小固定为 128KB 一个,最小擦除单位也是以扇区为单位的,因给 此,至少分配一个扇区给 Bootloader ,否则后续擦写 APP 的时候,可能把 Bootloader 也给擦了!所以,我们使用 128K(0X20000)字节来存放 Bootloaderimage.png

3.3.2 IAP Flash APP设计

  • 图中 IROM1 的起始地址(Start)一般为0X08000000,大小(Size)为 0X200000,即从 0X08000000 开始的 2048K 空间为我们的程序存储区。
  • 而图中,我们设置起始地址(Start)为 0X08020000,即偏移量为 0X20000(128K 字节),因而,留给 APP 用的 FLASH 空间(Size)只有0X200000-0X20000=0X1E0000(1920K 字节)大小了。设置好 Start 和 Szie,就完成 APP程序的起始地址设置。 image.png

3.3.3 SRAM APP起始地址设置

  • 将 IROM1 的起始地址(Start)定义为:0X24001000,大小为 0X70800(450K 字节),即从地址 0X24000000 偏移 0X1000 开始,存放 APP 代码。
  • 因为整个 STM32H743IIT6 的AXI SRAM 大小为 512K 字节,所以 IRAM1(SRAM)的起始地址变为 0X24071800,大小只有0XE800(58K 字节)。这样,整个 STM32H743IIT6 的 AXI SRAM 的分配情况为:最开始的 4K给 Bootloader 程序使用,随后的 450K 存放 APP 程序,最后 58K,用作 APP 程序的内存image.png image.png

3.4 IAP 驱动设计

  • iap_write_appbin 函数用于将存放在串口接收 buf 里面的APP 程序写入到 FLASH。
  • iap_load_app函数,则用于跳转到 APP 程序运行,其参数 appxaddr为 APP 程序的起始地址,程序先判断栈顶地址是否合法,在得到合法的栈顶地址后,通过MSR_MSP 函数(该函数在 sys.c 文件)设置栈顶地址,最后通过一个虚拟的函数(jump2app)跳转到 APP 程序执行代码,实现 IAP→APP 的跳转image.png
  • 预留的通信口产品中的固件程序进行更新升级 image.png image.png

4 片外FLASH 程序存储

image.png

4.1 BOOT引导程序

image.png image.png

  • BOOT引导 image.png image.png

4.2 片外FLASH 程序存储算法设计

image.png image.png

  • 设备描述 image.png