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

STM32 变量加载到flash的过程中

在STM32中,BIN文件内需要加载到RAM的数据由链接脚本(Linker Script)​启动代码(Startup Code)​共同决定,具体机制如下:


一、BIN文件内容结构

STM32的BIN文件包含三类数据:

  1. Code:程序代码段(存储在Flash中直接执行,无需加载到RAM)
  2. RO-data:只读常量(如字符串常量,存储在Flash中)
  3. RW-data:已初始化的全局变量(需从Flash拷贝到RAM)
  4. ZI-data:未初始化或初始化为0的全局变量(仅需在RAM中预留空间并清零)
    • 关键特性:BIN文件中不包含ZI-data,因其内容全为0,仅记录其大小信息。

二、加载逻辑的核心——链接脚本

链接脚本通过定义存储区域划分,明确哪些数据需加载到RAM:

  1. 存储域(Load Region)与执行域(Execution Region)​

    • 存储域定义代码/数据在Flash中的存储位置
    • 执行域定义运行时数据在RAM中的位置
    LR_IROM1 0x08000000 {        ; Flash存储域ER_IROM1 0x08000000 {    ; 代码段执行域(Flash)*.o (RESET, +RO)     ; 代码和只读数据}RW_IRAM1 0x20000000 {    ; RAM执行域*.o (+RW +ZI)        ; 需加载到RAM的读写数据}
    }
  2. 特殊段标记
    使用section属性显式指定函数/变量到RAM区域:

    __attribute__((section("RAMCODE"))) void Fast_ISR(void) {// 高频中断服务函数(需在RAM中运行)
    }

三、启动代码的加载操作

启动代码(如startup_stm32xxx.s)在main()执行前完成RAM数据加载:

  1. 初始化堆栈指针(MSP)​
    从Flash的起始地址(如0x08000000)获取初始栈顶地址(__initial_sp)。

  2. 复制RW-data到RAM

    LDR  R0, =_sidata     ; Flash中RW-data的源地址
    LDR  R1, =_sdata       ; RAM中RW-data的目标地址
    LDR  R2, =_edata
    CopyDataLoop:LDR  R3, [R0], #4STR  R3, [R1], #4CMP  R1, R2BNE  CopyDataLoop
  3. 初始化ZI-data为零

    LDR  R0, =_sbss       ; ZI-data起始地址
    LDR  R1, =_ebss
    ZeroLoop:MOV  R2, #0STR  R2, [R0], #4CMP  R0, R1BNE  ZeroLoop

四、动态加载机制

在Bootloader或自定义加载场景中,可通过以下方式扩展:

  1. 外部存储加载
    从SD卡/SPI Flash读取BIN文件到SDRAM,跳转执行(需配置内存映射)。

  2. 运行时重定位
    使用分散加载文件的FIXED属性强制指定代码在RAM中的固定地址:

    ER_RAMCODE 0x20000000 FIXED { ; 强制代码在RAM中运行*.o (RAMCODE)
    }

五、调试与验证方法

  1. 查看.map文件
    检查符号地址(如_sdata_sbss)确认数据段分配。

  2. 逻辑分析仪抓取时序
    观测Flash到RAM的数据传输过程。


总结流程

STM32通过链接脚本定义数据归属,由启动代码实现物理搬运,最终完成RAM数据加载。

相关文章:

  • python打卡day24
  • 芋道(yudao-cloud)项目,后端接口报401-账号未登录解决方案
  • DELL R770 服务器,更换RAID卡教程!
  • 从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation Promptable Segmentation
  • 智能体的典型应用:自动驾驶、智能客服、智能制造、游戏AI与数字人技术
  • 亚远景-基于ASPICE的汽车供应链质量管控培训
  • centos中JDK_PATH 如何设置
  • xss-labs靶场基础8-10关(记录学习)
  • 2025-05-13 表征学习
  • SWMM模型全解析:排水防涝、海绵城市设计等技术与二次开发
  • 计算机网络网络层(下)
  • Android Exoplayer多路不同时长音视频混合播放
  • 利用Backtrader实现回测策略的可视化与图表绘制
  • 广告推荐算法入门 day1 --项目选型
  • 人工智能_大模型数据标注主要做什么_拉框_人工智能训练师_数据标准师介绍---人工智能工作笔记0244
  • 【技巧】使用UV创建python项目的开发环境
  • 麦肯锡110页PPT企业组织效能提升调研与诊断分析指南
  • LVS+keepalived实战案例
  • aardio - godking.vlistEx.listbar + win.ui.tabs 实现多标签多页面切换
  • element-ui 源码调用接口跨域问题
  • 气候多米诺:厄尔尼诺与东南亚跨境害虫或威胁中国粮食安全
  • 【社论】个人破产探索,要守住“诚实而不幸”的底线
  • 学者的“好运气”:读本尼迪克特·安德森《椰壳碗外的人生》
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式
  • 央行等印发《关于金融支持广州南沙深化面向世界的粤港澳全面合作的意见》
  • 《AI×SCIENCE十大前沿观察》9:合成数据和数据基础设施