STM32之Core Coupled Memory(CCM)内存

发布者:温柔的爱情最新更新时间:2018-06-07 来源: eefocus关键字:STM32  CCM  内存 手机看文章 扫描二维码
随时随地手机看文章

写在前面

  • 今天在搞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


关键字:STM32  CCM  内存 引用地址:STM32之Core Coupled Memory(CCM)内存

上一篇:STM32之内存分布与总线
下一篇:STM32 CAN总线说明

推荐阅读最新更新时间:2024-03-16 16:04

STM32的独立开门狗怎么启用和停止
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) 。 在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_
[单片机]
STM32 进阶教程 8 - 位带操作
前言 有过51单片机开发经历的朋友应该都对51的IO口或一些特殊寄存器可以直接按位操作的方式不陌生吧,那么在stm32中有没有类似的操作呢,答案是肯定的,本节将给大家介绍如何在STM32中实现位带操作。 在《ARM Cortex-M3权为指南》中的第87页对位带操作如下描述: 位带操作 支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在 CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过
[单片机]
<font color='red'>STM32</font> 进阶教程 8 - 位带操作
stm32(二) stm32中断优先级的设置
stm32优先级 1.优先级等级: STM32用户能分配的优先级有16级,也就是用优先级寄存器NVIC- IP 的高四位来表示莫个中断的优先级。 2.优先级组: 在STM32中将一个中断的优先级分为:抢占优先级和子优先级。 在进行优先级判断的时候先是比较抢占优先级然后比较子优先级。 在固件库中用变量分别表示抢占优先级和子优先级: NVIC_InitTypeDef.NVIC_IRQChannelPreemptionPriority;(抢占优先级) NVIC_InitTypeDef.NVIC_IRQChannelSubPriority;(子优先级) 优先级组就是对抢占优先级和
[单片机]
stm32的swd接口的烧写协议是否公开的呢?
需要用一台好的示波器来抓才能有足够的存储深度,保证你能够过滤掉那个该死的50clock。 按照Arm的手册,每次转换发送方都需要一个TNR---但是我观察JLINK的波形却没有那个该死的TNR。 手册中说异步SWD需要,同步不需要----或者相反,但是我没有找到关于同步异步的描述。 姑且不管他,反正目前忽略掉TNR就能够读到该死IDR。 另外JLINK的复位时序很奇怪,大致是 70clk High,0xe79e(注意,SWD是LSB First), 70clk High,0xedb6(这里很奇怪,找不到描述), 70clkHigh,16clk Low,0xa5, 注意这里按照协议应该是TNR位-但是没有实际观测到这个位, 0b10
[单片机]
外媒:中国对东芝出售内存芯片业务展开反垄断调查
凤凰科技讯 据路透社北京时间12月15日报道,《日经亚洲评论》星期五刊文称,中国监管机构已经启动对东芝出售内存芯片业务的交易展开调查,可能会推迟这一交易的完成时间。东芝与由贝恩资本(Bain Capital)牵头的财团达成价值180亿美元的内存芯片业务出售交易,并计划明年3月完成这一交易。 《日经亚洲评论》表示,中国监管机构本月早些时候启动了对东芝出售内存芯片业务交易的审批工作。在9月份与贝恩资本及其合作伙伴达成交易后,东芝就向中国监管机构提交了审批材料。 中国监管机构对这类并购交易的审批通常需要约4个月,有时会延长至6个月,这给东芝能否按计划在明年3月完成交易增添了变数。 东芝美国分部发言人未就此置评。 东芝必须尽快完成出售内存
[半导体设计/制造]
stm32专题五:时钟树(四)自定义配置HSI时钟
内部时钟HSI的配置方式和HSE基本一致,唯一的一个区别在于,没有等待HSI就绪的函数,因此需要操作RCC_CR寄存器的HSIRDY位来判断时钟就绪,其他直接按流程即可。 bsp_rccclkconfig.c /* RCC时钟配置函数 */ #include bsp_rccclkconfig.h // 自定义时钟配置函数 void HSI_SetSysClk(uint32_t RCC_PLLMul_x) { // 因为操作的是寄存器,所以加上__IO,每次去地址读 __IO uint32_t HSIStatus; // 把RCC时钟复位成复位值 RCC_DeInit(); //
[单片机]
智能家居控制系统设计方案
一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 云平台: 采用中国移动OneNet. 也可以采用腾讯、阿里云、华为云、百度天工物接入、机智云等等。 前面文章有讲解。 协议: 采用MQTT协议 开发软件:keil5 二、包含的硬件与实物图介绍 1. 一个光敏电阻传感器 2. 一个DHT11温湿度传感器 3. 一个MQ-5 液化气/天然气/煤气监测传感器 4. 一个MQ-2 烟雾传感器 5. 3盏LED灯表示窗帘开关、空调开关、电视开关 6. 联网WIFI采用: ESP8266 7. 最小系统板: STM32F1
[单片机]
智能家居控制系统设计方案
STM32 SysTick定时器讲解
STM32 SysTick定时器讲解 本文将介绍SysTick定时器、其工作原理与寄存器、及对应的应用实例 SysTick定时器简介 首先、我们先解释下定时器,“定时器”:能够定时、计数的器件 SysTick称为系统滴答定时器,它位于Cortex 内核中是一个定时器,可以对输入的时钟进行计数、若输入的时钟具有周期性的变化,则计数也相当于计时。 系统滴答定时器一般用于操作系统,为操作系统提供时基、维持操作系统的心跳; 系统滴答定时器每过一段时间会产生一个中断,根据这个特性、操作系统就可以实现时间片的任务调度。 工作原理分析 从上述两张图我们可以看出: 系统滴答定时器的时钟源是从SYSCLK处经过分频得到的,另外它处于内核中
[单片机]
<font color='red'>STM32</font> SysTick定时器讲解
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved