(核心耦合内存,是从标准 RAM 偏移的特殊内存区域,CCM 无法通过 DMA 访问,但对于cpu它提供对内存的无等待状态访问。
方法一:
直接在MDK编译器上面设置:
通过MDK的option选项设置Flash和RAM
方法二:
直接通过指针变量指向这个空间即可。
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的链接选项使用此脚本:
使用方法:
使用方便很简单,依然是使用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
发表回复