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中的位置
    cpp 复制代码
    LR_IROM1 0x08000000 {        ; Flash存储域
        ER_IROM1 0x08000000 {    ; 代码段执行域(Flash)
            *.o (RESET, +RO)     ; 代码和只读数据
        }
        RW_IRAM1 0x20000000 {    ; RAM执行域
            *.o (+RW +ZI)        ; 需加载到RAM的读写数据
        }
    }
  2. 特殊段标记

    使用section属性显式指定函数/变量到RAM区域:

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

三、启动代码的加载操作

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

  1. 初始化堆栈指针(MSP)​

    从Flash的起始地址(如0x08000000)获取初始栈顶地址(__initial_sp)。

  2. 复制RW-data到RAM

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

    cpp 复制代码
    LDR  R0, =_sbss       ; ZI-data起始地址
    LDR  R1, =_ebss
    ZeroLoop:
        MOV  R2, #0
        STR  R2, [R0], #4
        CMP  R0, R1
        BNE  ZeroLoop

四、动态加载机制

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

  1. 外部存储加载

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

  2. 运行时重定位

    使用分散加载文件的FIXED属性强制指定代码在RAM中的固定地址:

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

五、调试与验证方法

  1. 查看.map文件

    检查符号地址(如_sdata_sbss)确认数据段分配。

  2. 逻辑分析仪抓取时序

    观测Flash到RAM的数据传输过程。


总结流程

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

相关推荐
芯岭技术郦8 分钟前
OM6625A芯片 Timer 定时器计数模式使用说明
stm32·单片机·嵌入式硬件
zcmodeltech4 小时前
双碳沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的碳捕集-零碳园区-综合能源全场景联动方案
stm32·嵌入式硬件·能源·嵌入式实时数据库·多分类
LCG米4 小时前
STM32零基础入门教程:从环境搭建到实战项目(点亮LED + 串口打印 + 呼吸灯)
stm32·单片机·嵌入式硬件
云泽8084 小时前
深入浅出 STM32(十一):从寄存器映射到 HAL 库位操作源码详解
stm32·单片机·嵌入式硬件
哥不想学算法4 小时前
STM32零基础教程(六):ADC、I2C、SPI与DMA
stm32·单片机·嵌入式硬件
云泽8085 小时前
深入浅出 STM32(十三):从施密特触发器到四种输入配置的底层逻辑
stm32·单片机·嵌入式硬件
XMAIPC_Robot7 小时前
RK3588+STM32:高性能机器人运动控制解决方案,兼顾实时性与AI算力
人工智能·stm32·嵌入式硬件·算法·fpga开发·机器人·arm+fpga
Rsingstarzengjx8 小时前
STM321MP157 笔记
stm32·嵌入式硬件·stm32mp157
铅笔小新z8 小时前
【stm32】串口轮询模式数据收发
stm32·单片机·嵌入式硬件
单片机杂货铺8 小时前
【单片机毕业设计选题】基于单片机的西瓜大棚控制
stm32·单片机·嵌入式硬件·51单片机·硬件工程