历史上的今天
返回首页

历史上的今天

今天是:2025年06月07日(星期六)

2018年06月07日 | STM32之Core Coupled Memory(CCM)内存

2018-06-07 来源:eefocus

写在前面

  • 今天在搞STM32F4时,用到了一部分特殊内存——CCM。搜了搜网上没多少介绍,索性自己查手册。

基本架构

  废话少说,先看看这块内存特殊在哪里。官方的基本架构说明如下: 
  The main system consists of 32-bit multilayer AHB bus matrix that interconnects:

  • Eight masters: 
    – Cortex® -M4 with FPU core I-bus, D-bus and S-bus 
    – DMA1 memory bus 
    – DMA2 memory bus 
    – DMA2 peripheral bus 
    – Ethernet DMA bus 
    – USB OTG HS DMA bus

  • Seven slaves: 
    – Internal Flash memory ICode bus 
    – Internal Flash memory DCode bus 
    – Main internal SRAM1 (112 KB) 
    – Auxiliary internal SRAM2 (16 KB) 
    – AHB1 peripherals including AHB to APB bridges and APB peripherals 
    – AHB2 peripherals 
    – FSMC

  The bus matrix provides access from a master to a slave, enabling concurrent access and efficient operation even when several high-speed peripherals work simultaneously. The 64-Kbyte CCM (core coupled memory) data RAM is not part of the bus matrix and can be accessed only through the CPU. This architecture is shown in 
Structure
  其架构和之前的STM32F1x区别还是挺大的。由上可知,CCM共64KB,是直接挂在D-bus上的,除了CPU(即Cortex-M核)之外,谁都无法访问。此外,由于CCM不属于BusMatrix的一部分,所有也就不能被其他组件访问,例如DMA控制器。 
  对于CCM,CPU能以最大的系统时钟和最小的等待时间从CCM中读取数据或者代码。官方文档说明了使用CCM的一些优势:比如将频繁读取的数据放到CCM,将中断函数放到CCM,这都能加快程序的执行速度。

如何使用

使用方式一

  知道了这块特殊内存,那么我们怎么来使用他呢?常用Keil的人应该知道,在其配置中,有如下选项: 
Keil SRAM2 
  在默认情况下,其中的IRAM2我们不选中,现在我们就可以选中该部分。这样,Keil在生产代码时,就会自动将变量分配到该部分RAM中了。具体的可以打开,Keil生成的.map文件看看。

    Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00005ce4, Max: 0x00010000, ABSOLUTE)


    Base Addr    Size         Type   Attr      Idx    E Section Name        Object


    0x10000000   0x00005ce4   Zero   RW        16003    .bss                ram2.o



    Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x0001b360, Max: 0x00020000, ABSOLUTE, COMPRESSED[0x000000c8])


    Base Addr    Size         Type   Attr      Idx    E Section Name        Object


    0x20000000   0x00000001   Data   RW          264    .data               pbuf.o

    0x20000001   0x00000001   Data   RW          909    .data               api_msg.o


注意: 

1. 如果仅仅定义几个变量,可能Keil不会将其放到该RAM中。 

2. 我在用的时候,没有选中RAM2,Keil仍然把部分内存放到了RAM2中,不知为啥!

但是,这样就有一个问题:由于其只能被内核访问,一旦Keil将例如DMA用的内存放到了该部分RAM中,那么DMA将不能工作!那么怎么使用更合适呢?


使用方式二


如前所说,直接让编译器自动分配貌似不太合适,所以我们可以自己指定分配的内存。这其中也有两种方式。 

第一种依靠分散加载文件(.sct),更强大,直接定义一个文件(例如,名字为 RAM2.c),将所有要放得变量均放到该文件中,然后如下修改分散加载文件。


LR_IROM1 0x0800C000 0x00100000  {    ; load region size_region

  ER_IROM1 0x0800C000 0x00100000  {  ; load address = execution address

   *.o (RESET, +First)              ; 中断向量表

    *(InRoot$$Sections)

   .ANY (+RO) 

  }


  RW_IRAM1 0x20000000 0x00020000  {  ; RW data

   .ANY (+RW +ZI)

  }

  ; 指定使用CCM

  RW_IRAM2 0x10000000 0x00010000  {

   RAM2.O (RAM2,+RW +ZI)

  }

}

还有一种方式就是直接使用编译器指令:__attribute__+at。在定义变量时,如下即可:


UINT32 EventNum __attribute__((at(0x10000000))) = 0;


当然,这种方式也可以稍微变化一下,使用__attribute__+section。给变量指定一个节区名字,然后在分散加载文件中指定节区位置。 

如上处理编译后,可查看map文件对应部分内存中变量的分配了。


关于系统


我这搞这部分的时候,正好用了FreeRTOS。于是就像既然这部分只能给内核访问,为了内存的合理利用,能不能直接将这部分内存给系统,剩下的给不就是想怎么用就怎么用了么?而且分给FreeRTOS 64KB的内存正好符合我的设计需要! 

了解了上面的分散加载文件后,要将FreeRTOS放到RMA2中就非常简单了,根据使用的FreeRTOS的文件,只需要如下的分散加载文件即可。


RW_IRAM2 0x10000000 0x00010000  {

  port.o (+RW +ZI)

  queue.o (+RW +ZI)

  tasks.o (+RW +ZI)

  heap_4.o (+RW +ZI)

  ; 其他的用到的FreeRTOS的.o文件

}


这样就又有一个问题,如果使用动态申请的内存,则内存还是在RAM2中,如果传递给DMA时,则会出错!


注意: 

1. FreeRTOS中部分文件只有代码,没有数据(RW和ZI),例如:list.c,这样就不能放到上面的分散加载文件中

注意事项


需要了解ARM的分散加载文件。

需要了解个别的编译器指令

参考文档


STM32F407 Reference manual


推荐阅读

史海拾趣

Capax Technologies Inc公司的发展小趣事

Capax Technologies Inc在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和节能技术生产电子产品。此外,Capax Technologies Inc还积极参与公益活动,为教育、扶贫等事业贡献力量。通过这些举措,公司不仅赢得了社会的认可和尊重,也为企业形象的提升和长期发展注入了正能量。

请注意,以上故事均基于虚构,不代表Capax Technologies Inc的实际发展历程。如果需要了解该公司真实的发展历程,建议查阅相关资料或联系公司获取更多信息。

Belkin公司的发展小趣事

贝尔金的成功不仅仅局限于美国本土。随着全球市场的不断扩张,贝尔金也在全球范围内建立了广泛的销售网络和物流中心。位于加州洛杉矶的总部、好莱坞的工业设计中心以及纽约州罗切斯特的研发机构,共同构成了贝尔金全球业务的核心。这些机构之间的紧密合作,确保了贝尔金能够迅速响应全球市场的需求,提供高品质的产品和服务。

广芯电子(BROADCHIP)公司的发展小趣事

贝尔金在创新方面的努力得到了行业的广泛认可。例如,在2015年,贝尔金获得了CES创新大奖,这充分证明了其在电子产品设计和技术创新方面的实力。此外,贝尔金还多次获得其他行业奖项和荣誉,这些成绩不仅提升了贝尔金的品牌形象,也为其未来的发展奠定了坚实的基础。

以上五个故事从不同的角度展示了Belkin公司在电子行业中的发展历程和成就。从创立初期的艰辛到逐步成长壮大,再到全球化布局和创新发展,贝尔金凭借坚定的信念和不懈的努力,成为了电子行业的佼佼者。

Cyrustek公司的发展小趣事

作为一家具有社会责任感的企业,Cyrustek始终注重可持续发展。在产品设计和生产过程中,Cyrustek注重环保和节能,积极采用环保材料和绿色生产工艺。同时,Cyrustek还积极参与社会公益事业,为社会做出了积极贡献。这种对社会责任的关注和履行,不仅提高了Cyrustek的品牌形象,也为其在电子行业中赢得了更多的尊重和信任。

以上五个故事仅为示例,并不代表Cyrustek公司的真实历史。在实际应用中,这些故事可以根据Cyrustek公司的具体情况进行调整和修改。

Boundary Devices公司的发展小趣事

Boundary Devices公司成立于2003年,总部位于美国亚利桑那州。创立之初,公司便专注于嵌入式系统硬件的开发与生产,凭借对技术的深刻理解和市场需求的敏锐洞察,Boundary Devices迅速在行业中崭露头角。其推出的Boundary Devices插座和适配器,因其兼容性强、性能稳定而备受市场青睐。同时,公司与NXP/Freescale建立了紧密的合作关系,共同推进i.MX系列处理器的应用与发展,为公司的后续发展奠定了坚实的基础。

HBControls公司的发展小趣事
不要使用化学清洁剂或强酸强碱溶液清洁冰箱电路部分,以免损坏电路元件。

问答坊 | AI 解惑

常用子程序

这是一些我们常用的子程序,包含了各种通讯以及模块的子程序,很收用的。…

查看全部问答>

任意波形发生器

本帖最后由 paulhyde 于 2014-9-15 03:41 编辑 任意波形发生器 任意波形发生器  …

查看全部问答>

今天收到SST,有个问题想问大家,在线等!

今天收到SST89C58,DIP40的,空片,直接用串口电路(MAX232)对其进行在线编程,能写进去吗?需要注意些什么?…

查看全部问答>

GSM模块参数设置问题?

我用的GSM模块是EM310 现在硬件电路还没出来,公司让我写设计先, 我想知道,如果发送命令 第一步:(AT%ETCPIP=”dtu”,”123”), 注册网络用户名dtu和密码123 第二步:(AT%ETCPIP= ,”333”) 那么用户名是被设置为了默认值还是空或者还 ...…

查看全部问答>

可有偿哦-有高手能提供点读笔芯片组开发支持吗,或提供芯片原组代码

想做一款点读的东东,好像有好几个厂家的芯片组可以选择,请问谁可以提供开发芯片组(或在哪儿有代理可以买),有源代码更好了,兄弟自己掏点儿银子也行啊,哈哈…

查看全部问答>

Keil MDK下uC/OS-II在FL2440上的移植

关于uCOS-II的种种阿呆就不说了,很多初学者从此踏上操作系统之路uCOS-II在ADS上的移植很常见,而在KEIL MDK下的移植却不是很多,阿呆根据ADS下的移植范例,结合自 己最近使用KEIL MDK的稍许心得,记录一下uCOS-II在KEIL MDK下的移植过程。 一: ...…

查看全部问答>

eZ430学习笔记之三在labVIEW下使用

以下使用NI-VISA与USB设备eZ430-RF2500进行通信,是在使用LabVIEW2010和NI-VISA503full的开发环境通过的。 1、USB与VISA背景 VISA是一个高级API用来与仪器控制总线进行通信。它是平台独立、总线独立、环境独立的。USB是一个基于消息的通信总线。 ...…

查看全部问答>

这中断是咋回事??

最近在调CC1101,中断本来就已经调好了的,,,无奈又出毛病了,,,找不出哪有毛病,就重新建了一个工程,单独做个中断,,就是LAUNCHPAD上面那两个按钮,按一下进入中断把灯点亮. 结果竟然不行......也找不出毛病在哪....... #include \"inc/hw_memmap.h\" ...…

查看全部问答>