ST意法半导体
直播中

悬崖勒马2

9年用户 969经验值
擅长:EMC/EMI设计
私信 关注
[问答]

cubeide的代码怎么编译到内部+外部FLASH里面去?

我有一个项目,准备使用GUI和AI,准备使用STM32U5,但是编译出来的代码很多,STM32U5的内部FLASH不够用,准备使用OSPI扩展外部FLASH。但是遇到一个问题,我不知道怎么将编译出来的代码链接到内部、外部FLASH。
如果是MDK,可以通过选项来设置,如果代码超过了内置FLASH的大小会自动链接到外部FLASH。但是使用CUBEIDE该怎么设置?
如:

回帖(2)

尹星

2025-3-7 15:23:47
根据你目前的情况,是想扩展QSPI做代码存储及运行的空间。

你要注意,程序启动后要及时初始化QSPI,通常在启动文件里的sysinit()里完成。


修改链接文件脚本是必不可少的环节。类似下面的做法:


/* 外部 OSPI FLASH 中的主程序 */
xa0xa0.qspi :
xa0xa0{
xa0 xa0 . = ALIGN(4);
xa0 xa0 *(.qspi)
xa0 xa0 *(.qspi*)
xa0 xa0 . = ALIGN(4);
xa0xa0} >OSPI


另外,你还得准备基于外部QSPI的下载算法驱动文件。ST公司有基于各类现存开发版和常用存储器件准备了一些下载驱动,在STM32cubeProgrammer里可以看到现存的。如果没有就得自己写了。
举报

发财树

2025-3-10 16:21:50

在使用STM32CubeIDE时,将代码编译并链接到内部和外部FLASH的过程需要手动配置链接脚本(Linker Script)和工程设置。以下是详细的步骤:


1. 配置链接脚本(Linker Script)


STM32CubeIDE使用GCC编译器,链接脚本通常是一个.ld文件。你需要修改这个文件来指定代码和数据在内部和外部FLASH中的存储位置。


1.1 修改链接脚本



  1. 打开你的STM32CubeIDE项目。

  2. 在项目导航器中,找到STM32U5xxxx_FLASH.ld文件(文件名可能略有不同,具体取决于你的芯片型号)。

  3. 打开该文件进行编辑。


在链接脚本中,你需要定义两个内存区域:一个用于内部FLASH,另一个用于外部FLASH。例如:


MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K
  EXTMEM (rx)     : ORIGIN = 0x90000000, LENGTH = 8192K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 256K
}

在这个例子中:



  • FLASH 是内部FLASH的起始地址和大小。

  • EXTMEM 是外部FLASH的起始地址和大小。


接下来,你需要定义代码段如何分配到这两个内存区域。例如:


SECTIONS
{
  .text :
  {
    *(.text*)
    *(.rodata*)
    *(.glue_7)
    *(.glue_7t)
    *(.eh_frame)
    KEEP(*(.init))
    KEEP(*(.fini))
  } > FLASH

  .exttext :
  {
    *(.exttext*)
  } > EXTMEM
}

在这个例子中:



  • .text 段被分配到内部FLASH。

  • .exttext 段被分配到外部FLASH。


2. 配置工程设置


2.1 设置编译器选项



  1. 在STM32CubeIDE中,右键点击你的项目,选择Properties

  2. 在左侧导航栏中,选择C/C++ Build -> Settings

  3. Tool Settings选项卡中,找到MCU GCC Linker -> General

  4. 确保Linker script指向你修改过的.ld文件。


2.2 配置外部FLASH的初始化代码


由于外部FLASH需要通过OSPI接口进行访问,你需要在启动代码中初始化OSPI接口。这通常可以在SystemInit()函数或main()函数中完成。


3. 编译和链接


完成上述配置后,编译你的项目。编译器会根据链接脚本的配置将代码分配到内部和外部FLASH中。


4. 调试和验证



  1. 使用STM32CubeIDE的调试功能加载代码到芯片中。

  2. 使用调试器检查代码是否正确加载到内部和外部FLASH中。

  3. 如果一切正常,代码应该能够正常运行。


5. 处理外部FLASH的访问


由于外部FLASH的访问速度可能较慢,建议将频繁访问的代码和数据放在内部FLASH中,而将不常用的代码(如GUI资源、AI模型等)放在外部FLASH中。


6. 使用外部FLASH的注意事项



  • 启动代码:确保启动代码(如Reset_Handler)在内部FLASH中,因为芯片启动时会首先执行内部FLASH中的代码。

  • 访问速度:外部FLASH的访问速度可能较慢,可能需要优化代码以减少对外部FLASH的频繁访问。

  • 数据一致性:如果需要在外部FLASH中存储数据,确保数据的一致性和完整性。


通过以上步骤,你应该能够成功将代码编译并链接到内部和外部FLASH中。

1 举报
  • 苗金成: 请问怎么可以把TouchGFX整个文件夹放入到外部Flash呢?

更多回帖

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