STM32-内部flash中写入版本号
常用于:固件升级、版本验证等场景中
一、工具实现
STM32CubeIDE:编写程序写入对应版本号
STM32CubeProgrammer:内部flash显示与重载
二、写入flash方法
先使用STM32CubeProgrammer烧录到单片机后,看相关的flash存储情况,用于后面选择空闲地址写入
1、定义版本号格式
程序任意位置:写入显示版本号
表示方法:
(1)const char Software_Ver[] __attribute__((section(".ver_info"))) = "01000000";
定义一个常量字符数组,用于存储我的版本号“字符串”;
__attribute__((section(".ver_info")))是利用GCC的编译器的特性,将该变量强制放在名为.ver_info的特定内存段中
tip:特定内存段后续进行指定;
(2)__attribute__((section(".vers_info"))) const uint32_t Boot_Version = 0x010000000;
跟(1)类似,两种顺序都可以,其中const uint32_t、0x010000000是为了在后续特定内存扇区中
能显示表现,而不是在ASCII显示区中能看到相关固件版本号;
2、指定写入的存储地址
找到每个工程project中会包含的链接脚本.ld文件,这里面定义了相关flash等内存地址以及大小
一般是形如这样:
![]()
在flash.ld中找到
/* Memories definition */
MEMORY
{CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64KRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128KFLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
}/* Sections */
SECTIONS
{.......
}
内存映射关系:

这段就是对flash、ram等定义的起始位置、长度等,从这段开始我们就知道flash的起始位置从0x8000000开始,在后续我们选定的固定地址就要选择0x8000000之后;
接着就是确认内部flash要写入部分空白部分(全是0xFF),是防止覆盖程序代码

确定固件版本地址后:

section中的.ARM.attributes 0 : { *(.ARM.attributes) }后,写入相应的地址:格式如上
其中0x080FFF00、0x080FFF0C是这次要写入的地址;
0x080FFF00、0x080FFF0C的区别就是,0x080FFF00的C扇区指定从这开始写入,这里是用十六进制表示
__attribute__((section(".vers_info"))) const uint32_t Boot_Version = 0x01000000;

如果是字符串:
const char Software_Ver[] __attribute__((section(".ver_info"))) = "01000000";

烧写方法看:STM常见烧录方法
三、含有固件版本信息.bin文件烧录到单片机中
1、导出含有固件版本信息.bin文件
首先将修改好内部flash显示版本号的文件通过STM32CubeProgrammer保存成bin文件

2、将固件信息烧录到MCU中

tips:这里的地址要和你导出成.bin左上角的地址需要一样,因为bin文件打开后会默认从0x0000000地址显示,否则会出现烧录后,程序无法使用的情况

