phantomshuttle 博客
Keil CCM RAM使用

(核心耦合内存,是从标准 RAM 偏移的特殊内存区域,CCM 无法通过 DMA 访问,但对于cpu它提供对内存的无等待状态访问。

方法一:

直接在MDK编译器上面设置:

通过MDK的option选项设置Flash和RAM

https://phantomshuttle.com/wp-content/uploads/2024/01/25_58_75589a9b4c0ec9d.jpg

方法二:
直接通过指针变量指向这个空间即可。
uint16_t  *usPtr;
usPtr = (uint16_t *)0x10000000;

方法三:

像使用内部SRAM一样定义使用SDRAM和CCM RAM,可以随意定义到指定的RAM区域且无需具体地址

使用一个脚本文件(分散加载)即可解决,脚本定义如下:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {  ; RW data
   *(.CCM_RAM)
  
  }
  RW_IRAM3 0xC0000000 0x01000000  {  ; RW data
   *(.SDRAM)
  
  }
}

同时配置option的链接选项使用此脚本:

https://phantomshuttle.com/wp-content/uploads/2024/01/010342nj7xe7sspurueyse.png

使用方法:

使用方便很简单,依然是使用attribute,但是不指定具体地址了,指定RAM区,方法如下,仅需加个前缀即可:

/* 定义在CCM RAM里面的变量 */
__attribute__((section (".CCM_RAM"))) uint32_t CCMBuf1[10];
__attribute__((section (".CCM_RAM"))) uint16_t CCMCount;

/* 定义在SDRAM里面的变量 */
__attribute__((section (".SDRAM"))) uint32_t SDRAMBuf1[10];
__attribute__((section (".SDRAM"))) uint32_t SDRAMCount;

然后就可以直接使用变量,不过注意一点,使用SDRAM中的变量前,优先初始化SDRAM

https://phantomshuttle.com/wp-content/uploads/2024/01/010625ylyetw9mzgl12in9.png

发表回复

textsms
account_circle
email

  • https://secure.gravatar.com/avatar/3f597fa57f51c12b379608974edf0822?s=80&d=mm&r=g
    maniac

    good!!!

    9月前回复

phantomshuttle 博客

Keil CCM RAM使用
(核心耦合内存,是从标准 RAM 偏移的特殊内存区域,CCM 无法通过 DMA 访问,但对于cpu它提供对内存的无等待状态访问。 方法一: 直接在MDK编译器上面设置: 通过MDK的option选…
扫描二维码继续阅读
2024-01-14