ST意法半导体
直播中

那些年儿ing

13年用户 1383经验值
擅长:84784
私信 关注
[问答]

STM32N6使用SDMMC1-eMMC作为外部存储器,地址如何配置?

STM32N6 使用SDMMC1-eMMC作为外部存储器(保存FSBL和app),因为eMMC不支持内存映射,那么使用STM32CubeProgrammer下载bin文件时地址选择哪里?还有External loader需要如何配置?另外eMMC不支持XIP,那么也只能用FSBL+Load&Run的模式是吗?

回帖(1)

李霞

2025-4-25 18:27:34

针对STM32N6使用SDMMC1-eMMC作为外部存储器的配置和烧录问题,以下是分步解答:




1. eMMC地址配置与存储布局




  • eMMC存储结构



    • eMMC分为 Boot Area(1~2个分区)、RPMB(安全分区)和 User Area(主存储区)。

    • FSBL和应用程序通常存储在 User Area,但需根据eMMC初始化时的配置确定起始块地址。

    • 例如:FSBL从块地址 0x0000 开始,应用程序从块地址 0x8000 开始。




  • 地址映射



    • 不直接使用MCU内存地址,而是通过SDMMC控制器以块(Block)或扇区(Sector)为单位访问。

    • 在代码中通过 块号(Block Number)字节偏移量(需转换为块号)操作eMMC。






2. STM32CubeProgrammer下载配置




  • 下载地址选择



    • 在CubeProgrammer中,地址应填写 eMMC存储区域的起始块号或虚拟地址(例如 0x0000),但需配合External Loader实现物理写入。

    • 实际地址由External Loader内部处理,用户只需指定逻辑偏移量(如 0x0 表示从User Area起始写入)。




  • 操作步骤



    1. 连接STM32(通过ST-Link/JTAG等)。

    2. 在CubeProgrammer中选择 External Loader(见下文配置)。

    3. 选择.bin文件,设置目标地址为 块号或虚拟地址(如 0x00000000)。






3. External Loader配置



  • 作用:使CubeProgrammer能够通过SDMMC接口读写eMMC。

  • 配置流程

    • 步骤1 获取或开发适配的External Loader:

    • STM32Cube包中可能提供示例(如 STM32Cube_FW_xxxUtilitiesExternalLoader)。

    • 若需自定义,参考ST提供的模板(如 eMMC_Loader.c)实现以下函数:
      int Init(void);
      int Write(uint32_t Address, uint32_t Size, uint8_t* Buffer);
      int Read(uint32_t Address, uint32_t Size, uint8_t* Buffer);

    • 步骤2 配置SDMMC和eMMC参数:

    • 在Loader中初始化SDMMC1的时钟、总线宽度(4/8 bit)、eMMC时序模式(High Speed/DDR)。

    • 处理eMMC的CID、CSD寄存器,设置块长度(通常为512字节)。

    • 步骤3 将Loader添加到CubeProgrammer:

    • 将编译生成的.stldr文件复制到 C:Program FilesSTMicroelectronicsSTM32CubeSTM32CubeProgrammerbinExternalLoader

    • 重启CubeProgrammer,在外部存储器选项中选择该Loader。





4. 启动模式:FSBL + Load & Run




  • 必要性:由于eMMC不支持XIP,代码必须从eMMC加载到RAM执行。




  • 启动流程



    1. FSBL(First Stage Bootloader)

      • 存储在MCU内部Flash(默认启动地址)。

      • 初始化SDMMC1、eMMC、时钟和RAM。

      • 从eMMC的指定块读取应用程序到RAM(如链接地址 0x20020000)。


    2. 应用程序(APP)

      • 编译时链接脚本需指定VMA(虚拟内存地址)为RAM区域(如 0x20020000)。

      • FSBL通过函数指针跳转到RAM地址执行APP。





  • 链接脚本示例(APP)


    MEMORY { RAM (xrw) : ORIGIN = 0x20020000, LENGTH = 256K }
    SECTIONS {
      .text : { *(.text) } > RAM
      .data : { *(.data) } > RAM
      .bss : { *(.bss) } > RAM
    }





5. 验证与调试建议



  • 检查eMMC初始化:确保FSBL中SDMMC时钟配置正确(如STM32N6的SDMMC1时钟源、分频系数)。

  • 读写测试:在FSBL中添加eMMC读写测试代码,确认数据完整性。

  • 使用调试器:通过JTAG/SWD单步调试FSBL,观察eMMC命令响应(如CMD8、CMD55/ACMD41)。




通过以上步骤,可实现在STM32N6上通过SDMMC1-eMMC存储和启动应用程序,同时利用STM32CubeProgrammer完成固件烧录。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分