点击左上角的
“关注”
,定期更新 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
暂无评论