当前位置: 首页 > news >正文

STM32-内部flash中写入版本号

常用于:固件升级、版本验证等场景中

一、工具实现

STM32CubeIDE:编写程序写入对应版本

STM32CubeProgrammer内部flash显示与重载

二、写入flash方法

先使用STM32CubeProgrammer烧录到单片机后,看相关的flash存储情况,用于后面选择空闲地址写入

1、定义版本号格式

程序任意位置:写入显示版本号

(例如,我是在main.c开头进行编写,只是为了测试功能是否实现)

表示方法:

        (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中

        连接想要修改单片机选择DOENLOAD,选择相应烧录的地址,就可以下载成功

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

http://www.dtcms.com/a/520495.html

相关文章:

  • 长芯微LDUM3160完全P2P替代ADUM3160,LDUM3160是一款采用ADI公司iCoupler® 技术的USB端口隔离器
  • 正规的报价单格式怎样才能做好网站优化
  • 河南艾特网站建设公司网站设计 优帮云
  • 开源小程序商城源码如何进行个性化修改?
  • 于个人电脑搭建人工智能训练师考试环境流程
  • 论人工智能时代数据价值的核心判定标准:质量优先与实时至上
  • 网站建设意义网站建设工作稳定吗
  • nginx日志同步阿里云datahub后写入数据库
  • 代理IP批量可用性检测 程序【python】
  • [学习日记]看书笔记
  • 专有软件使用Linux内核的用户头文件违反GPL吗?| 开源合规场景
  • Python 实现 Pelco-D 协议云台控制(win与ubuntu)
  • MEMS结构光在3D人脸识别中的系统优化
  • 东莞网站建设流程响应式网站制作价格
  • 做网站优化的好处做网站客户总是要退款
  • [人工智能-大模型-51]:Transformer、大模型、Copilot、具身智能、多模态、空间智能、世界模型,什么意思,它们不同点和联系
  • 鸿蒙:简单实现列表下拉刷新+上拉加载
  • [nanoGPT] ChatGPT 的 LLM 的全栈实现 | 快速上手
  • 公司公司手机网站制作互联网营销的特点
  • 做网站苏州营销型网站有什么特点
  • 【计算机网络】408计算机网络高分指南:物理层编码与调制技术精讲
  • 怎样做一个企业的网站建站个人网站备案 网站名称
  • AR巡检系统:打开工业智能运维的下一幕
  • wang域名注册网站厚瑜网站建设
  • 网站建设夬金手指花总南昌做网站哪家好
  • 洪梅网站建设微信 host 微网站模版
  • 网站建设要用到的技术有哪些行业网站建设报价
  • 建网站所需材料生物信息网站建设
  • 【EE初阶】JVM
  • 深度学习------YOLOv5《第一篇》