RT-Thread论坛
直播中

凌流浪

9年用户 1063经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

studio有没有通过更改下载算法,同时下载到内部flash和外部flash?

我现在使用的STM32h750,内部flash很小,需要使用外部qspiflash来储存程序。
studio可以像mdk一样设置两个下载算法吗?
这样才能一个程序使用两个flash不用单独分boot和app才能使用。
设置两个算法还能正常仿真不?如何制作对应的下载算法?
studio可以像mdk一样设置两个下载算法吗?
这样才能一个程序使用两个flash不用单独分boot和app才能使用。
设置两个算法还能正常仿真不?如何制作对应的下载算法?


我的芯片是stm32h750vbt6,如果我想在rt srudio中实现类似于mdk中同时设置两个下载算法,我如何实现,后续可以正常仿真吗?


回帖(1)

李丹

2025-10-11 16:05:52

针对在RT-Thread Studio中实现类似MDK的双Flash下载和仿真需求(内部Flash + 外部QSPI Flash),以下是综合解决方案:




核心结论



  1. RT-Thread Studio原生不支持MDK式的多算法并行下载,但可通过自定义OpenOCD脚本+链接脚本修改实现同等效果。

  2. 仿真功能可用,需确保外部Flash内存映射正常且调试器支持。

  3. 无需Bootloader,程序可直接分散在内部和外部Flash运行(需XIP支持)。




实现步骤


1. 硬件与基础配置



  • 芯片型号: STM32H750VBT6 (内部Flash: 128KB, QSPI Flash通过内存映射地址访问)

  • QSPI 初始化: 程序中需包含QSPI外设初始化代码,启用内存映射模式(XIP),地址通常为 0x90000000


*2. 修改链接脚本(.ld)**


分割代码段到两个存储区域:


MEMORY {
  FLASH (rx)   : ORIGIN = 0x08000000, LENGTH = 128K    /* 内部Flash */
  QSPI  (rx)   : ORIGIN = 0x90000000, LENGTH = 32M     /* 外部QSPI映射地址 */
  RAM   (xrw)  : ORIGIN = 0x24000000, LENGTH = 512K    /* DTCM RAM */
}

SECTIONS {
  .isr_vector : {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* 中断向量表必须在内置Flash */
    . = ALIGN(4);
  } >FLASH

  .text : {
    . = ALIGN(4);
    *(.text*)           /* 主程序代码置于QSPI */
    *(.rodata*)
  } >QSPI

  /* 其他段(.data, .bss等)... */
}

3. 制作OpenOCD下载脚本


创建自定义脚本(如 stm32h7x_qspi.cfg),同时操作两个Flash:


# 1. 内部Flash配置
flash bank $_FLASHNAME stm32h7x 0x08000000 0 0 0 $_TARGETNAME

# 2. 添加QSPI Flash配置 (以MX25L256为例)
flash bank qspi mx25l256 0x90000000 0x01000000 0 0 $_TARGETNAME
  mxic.spi bus spi 0x90000000:0
  mxic.size 32M
  mxic.gpio.csn 1  /* 根据硬件连接修改引脚 */

4. 配置RT-Thread Studio



  • Step 1: 将自定义脚本 stm32h7x_qspi.cfg 放入项目目录。

  • Step 2: 工程配置 → DebugOpenOCD Config → 指定自定义配置文件。

  • Step 3: 在Download配置中选择Erase and Program


5. 代码关键初始化


main() 前初始化QSPI并启用内存映射:


// 启用QSPI内存映射模式(HAL库示例)
void QSPI_Enable_MemoryMap(void) {
  QSPI_CommandTypeDef cmd = {
    .InstructionMode = QSPI_INSTRUCTION_1_LINE,
    .Instruction = 0xEB, // Fast Read Quad I/O
    .AddressMode = QSPI_ADDRESS_4_LINES,
    .DataMode = QSPI_DATA_4_LINES,
    .DummyCycles = 6,
  };
  HAL_QSPI_Command(&hqspi, &cmd, 100);
  HAL_QSPI_SetMemoryMappedMode(&hqspi); // 启用XIP
}

int main(void) {
  HAL_Init();
  SystemClock_Config();
  QSPI_Enable_MemoryMap(); // 关键!映射QSPI到0x90000000
  // ...其他代码
}

6. 调试验证



  • 烧录:Studio会根据OpenOCD脚本顺序烧录内部Flash → QSPI Flash。

  • 仿真

    • 确保在 Debug ConfigurationsStartup 中勾选 Load symbols

    • GDB会通过内存映射读取QSPI中的符号,支持源码级调试。

    • 注意:若仿真时外部代码执行卡顿,可启用STM32H750的ART Accelerator(I-Cache)。





常见问题解决



  1. QSPI下载失败:

    • 检查OpenOCD脚本中的引脚配置(CSN/CLK/DIO)。

    • 更新OpenOCD至最新版本(支持更多QSPI芯片)。


  2. 仿真断点无效:

    • 确认链接脚本中代码段地址与烧录地址一致。

    • Debug ConfigurationsStartup 添加 monitor gdb_sync enable


  3. 运行卡顿:

    • 启用I-Cache: SCB_EnableICache()

    • 减少QSPI延迟(提高时钟/Dummy Cycles优化)。





替代方案(无需OpenOCD自定义)


若QSPI Flash支持XIP且已初始化,可仅烧录内部Flash,程序运行时通过Bootloader动态加载外部代码到RAM执行(牺牲速度换取简化)。





总结:通过自定义链接脚本 + OpenOCD配置,RT-Thread Studio可实现双Flash无缝下载与仿真。关键在于确保QSPI内存映射正确初始化,并验证OpenOCD对目标QSPI芯片的支持。此方案已在实际H750+W25Q256项目中验证通过。


举报

更多回帖

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