没志青年
发布于 2025-09-17 / 38 阅读
0

Cortex-M MCU - CCMSRAM

首先 STM32 要支持,F4 以上部分型号支持。

CCM-SRAM 通过专用的总线与 Cortex-M4 内核直接相连,绕过了 AHB 总线矩阵。这意味着它可以实现零等待周期的访问,提供最高的访问速度和确定性。

因此 DMA 无法访CCM-SRAM 只能被 Cortex-M4 内核访问,不能被 DMA 外设访问。

STM32 中叫做 CCMRAM,GD32 中叫做TCMSRAM

判断有没有这些区域

看SRAM内存的组成

所以TCMSRAM是64KB

修改SCT脚本

SCT分散链接脚本


LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }

  RW_CCMRAM 0x10000000  0x00004000 {    ; CCM RAM, 16KB, 用于 CPU-only 的高频变量
  *.o (ccmsram)     ; 只放带 __attribute__((section("ccmsram"))) 的变量
  }

}

在默认的脚本文件中添加了以下内容:

 RW_CCMRAM 0x10000000  0x00004000 {
  *.o (ccmsram)
 }

这个起始地址和范围要根据手册来。

宏定义

要放入CCRAM,需要在变量和函数前添加 __attribute__((section("ccmsram"))),这个很长,因此使用宏定义:

例如:

验证是否成功

一、对比运行速度

二、查看map文件

编译的那一堆文件中有个 .map 文件

三、编译后反汇编

fromelf --text -c -o "$L@L.asm" "#L"