STM32 如何生成升级固件

点击左上角的“关注”,定期更新 STM32 最新资讯,总有你想要的信息!

STM32 如何生成升级固件

项目信息

  • 处理芯片:STM32F407VET6(512KB Flash,192KB RAM)
  • 升级接口:串口
  • 升级通信协议:Ymodem
  • 程序存储器:芯片内部 Flash
  • Bootload 程序大小:31396 byte
  • 升级固件大小:83452 byte

1. STM32 的程序运行流程

  • 无 IAP 程序时的运行流程
    在这里插入图片描述

图1 无 IAP 程序时 STM32 的运行流程

  stm32 的内部 flash 地址起始于 0x08000000,通常状况下,程序文件就从此地址开始写入。另外 stm32 内部有一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是 0x08000004,当中断来临,stm32 的内部硬件机制会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。
  由图 1 我们可以得知,stm32 在复位后会先从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号 ① 所示;在复位中断服务程序执行完以后,会跳转到 main 函数,如图标号 ② 所示;而 main 函数通常都是一个死循环,在 main 函数执行过程当中,若是收到中断请求(发生中断),此时 STM32 会强制将 PC 指针指回“中断向量表”处,如图标号 ③ 所示;然后根据中断源进入相应的中断服务程序,如图标号 ④ 所示;在执行完中断服务程序之后,程序再次返回 main 函数执行,如图标号 ⑤ 所示。

  • 有 IAP 程序时的运行流程
    在这里插入图片描述

图2 有 IAP 程序时 STM32 的运行流程

  由图 2 我们可以得知,在 stm32 复位后仍是从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序以后跳转到 IAP 的 main 函数,如图标号 ① 所示,这部分和图 1 所示流程一样;在执行完 IAP 过程后,程序跳转到应用程序的复位向量表,取出应用程序复位中断向量的地址,并跳转执行应用程序的复位中断服务程序,随后跳转至应用程序的 main 函数,如图标号 ② 和 ③ 所示;应用程序的 main 函数一样是一个死循环,而我们注意到此时 stm32 的 flash 在不一样位置上,共有两个中断向量表。在应用程序的 main 函数执行过程中,若 cpu 获得一个中断请求, PC 指针仍强制跳转到地址 0X08000004 中断向量表处,而不是应用程序的中断向量表处,如图标号 ④ 所示;程序再根据设置的“中断向量表偏移量”,跳转到对应中断源新的中断服务程序中,如图标号 ⑤ 所示;在执行完中断服务程序后,程序返回应用程序的 main 函数中继续运行,如图标号 ⑥ 所示。
  经过以上两个过程的分析,我们知道了 IAP 程序必须满足两个要求:
  (1) 应用程序的起始地址必须在 IAP 程序以后的某个偏移量为 x 的地址开始。
  (2) 必须将应用程序的中断向量表相应的移动,移动的偏移量也为 x。

2. 修改应用程序的 Flash 起始地址

在这里插入图片描述

图3 STM32F40x 和STM32F41x Flash 模块构成

  首先我们先来看看“图3 STM32F40x 和STM32F41x Flash 模块构成”,我们的芯片是 STM32F407VET6,flash 是512kb 的,所以我们主存储器的扇区只有 8 个,而不是 12 个。我的 bootload 程序大小是 31396 byte,所以 bootload 程序是只烧录在了扇区 0 和扇区 1 的位置。
  那么我们应用程序的 flash 起始地址应该设置在哪里呢?
  答案是除了扇区 0 和扇区 1 以外的地址。因为 stm32 的 flash 写数据只能将 1 写成 0,所以在升级固件前需要把应用程序区的 flash 区域进行擦除操作(将 flash 数据擦除成 0xff),而 STM32F407VET6 的 flash 擦除操作只能以扇区为基础单位来擦除,扇区 0 和扇区 1 存放着 bootload 程序,不能擦除,所以我们只能把应用程序的 flash 起始地址设置在除扇区 0 和扇区 1 以外的地址。
  那么我们如何设置应用程序的 flash 起始地址呢?
  在 keil 中,我们可以打开“Options”操作框,在“Target”栏找到“IROM1”的设置框,勾选并填写上本程序的 flash 起始地址(Start)和大小(Size)。因为我们把应用程序从 flash 的扇区 2 开始存储,所以我们把 flash 的起始地址设置为扇区 2 的起始地址 0x08008000,而且我们是把扇区 2 到扇区 7 都作为应用程序的 flash 区,所以我们的 falsh 大小设置为 0x78000。

在这里插入图片描述

图4 设置 flash 起始地址

3. 修改应用程序向量列表的地址

  • 在 main 函数的开头处偏移向量列表
    在这里插入图片描述
  • 通过预定义偏移向量列表
    在这里插入图片描述
    然后在“system_stm32f4xx.c”文件处找到“VECT_TAB_OFFSET”定义,将其改为相应的偏移量。
    在这里插入图片描述

4. 如何生成 bin 文件

  打开“Options”操作框,点击“User”栏,将“Run#1”打勾,并在后面的方框中填入生成 bin 文件的指令。我的指令为:

  • fromelf(一个空格) --bin(一个空格) --output(一个空格) .\Output\Template.bin(一个空格) .\Output\Template.axf
    在这里插入图片描述
      此指令的作用是将 axf 文件转换为 bin 文件。其中的“fromelf(一个空格) --bin(一个空格) --output(一个空格) .\”为固定格式不需要做修改,同时需要注意路径共有四个空格。“Output\Template.bin”为要生成的bin文件名和bin文件存储的路径;“Output\Template.axf”为要转换的 axf 文件名和 axf 文件所在的路径,axf 是已经生成了的,可以在存放“Listing”数据的文件夹中找到。
      添加完成指令后按下“编译”即可生成 bin 文件。

在这里插入图片描述

大家的支持就是我分享技术的动力,希望大家需转载时能附上原作者的博客:https://blog.csdn.net/u012993936,谢谢。

--- End ---

你可能还想看:

> STM32 IAP 在线升级项目实例剖析
> 免费的Zigbee抓包神器!比Ubiqua还好用!

文章都看完了,随手点个赞吧~
在这里插入图片描述
↓↓↓ ↓↓↓

版权声明:本文为CSDN博主「Jesse_嘉伟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012993936/article/details/123113921

生成海报
点赞 0

Jesse_嘉伟

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32 如何生成升级固件

点击左上角的“关注”,定期更新 STM32 最新资讯,总有你想要的信息! STM32 如何生成升级固件项目信息 处理芯片:STM32F407VET6(512KB Flash

STM32 IAP 在线升级项目实例剖析

点击左上角的“关注”,定期更新 STM32 最新资讯,总有你想要的信息! STM32 IAP 在线升级项目实例剖析项目信息 处理芯片:STM32F407VET6(512KB

使用STM32G030进行IAP远程升级

网上有一篇F系列的远程升级,移植过来的时候可以用,但是缺芯得换成G系列的,使用的方法也不一样,所以移植的时候难免有些坑,所以来记录一下 不同之处 1.对于flash的操作