datasheet

STM32F4的CCM内存之一

2019-06-14来源: eefocus关键字:STM32F4  CCM内存  内核

我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?



使用STM32F4的CCM内存 


首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。



使用STM32F4的CCM内存 


我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。



使用STM32F4的CCM内存 


这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。

于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:


  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};

复制代码


再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:

  1.     Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)


  2.     Base Addr    Size         Type   Attr      Idx    E Section Name        Object


  3.     0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o

复制代码


太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。

那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:


  1. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )

  2.         

  3.         extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

  4. #else

  5.         static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

  6. #endif

复制代码

这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。

修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。



使用STM32F4的CCM内存 


然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:



使用STM32F4的CCM内存 


由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:



使用STM32F4的CCM内存 


然后在链接器中选择我们自己的文件:



使用STM32F4的CCM内存 


现在,映像文件变成了这样:



使用STM32F4的CCM内存 


是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。


关键字:STM32F4  CCM内存  内核

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic464648.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F4的CCM之二
下一篇:STM32内存之四(CCM)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32F030R8-Nucleo使用PA2、PA3 UART2不能使用的问题

1. 开发环境开发平台:官方开发板STM32F030R8-Nucleo开发软件:Keil uVision5.24开发库:STM32Cube_FW_F0_V1.9.02. 实验现象根据官方例程,将UART1的配置更改为UART2,然后使用杜邦线接到PA2、PA3引脚,可串口就是无法收发数据。之后查看原理图发现,官方的Demo板,默认就没有将PA2、PA3扩展到外部引脚上,而是将这个USART2串口连接到了ST-Link的串口上,这样,ST-Link既可以下载程序,也可以当做开发板的USART2使用。截取部分具体电路图如下:其中SB14、SB13、SB63和SB62都是零欧姆电阻,问题就在这里了,SB14、SB13焊接了,但是SB63
发表于 2019-06-14
STM32F030R8-Nucleo使用PA2、PA3 UART2不能使用的问题

基于Ymodem协议的STM32F407的串口IAP

发送数据。成功接收的不会被确认。有错误的块被确认(NAK),并重发。Ymodem类似于Xmodem-1K,不同之处是提供批处理模式(batch mode)。在批处理模式下,可以使用一个命令发送一些文件。Ymodem使用循环冗余码校验作为错误校验方式。——摘自百度百科基于Ymodem协议的IAP引导程序硬件平台原子探索者STM32F407开发板通信接口串口实现流程按住复位键时按下KEY1键,在松开复位键之前按住KEY1不放,松开复位键,红色LED灯常亮,这时便进入固件升级程序,不断向上位机发送字符’C’请求上位机发送应用程序固件。这时打开上位机查询请求,上位机接收到请求后,通过串口发送第一个数据包,这个数据包主要包含了传输的文件的文件名和文
发表于 2019-06-14
基于Ymodem协议的STM32F407的串口IAP

STM32F10xxx支持三种复位

STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。一、系统复位除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器(见图4)以外,系统复位将复位所有寄存器至它们的复位状态。当发生以下任一事件时,产生一个系统复位:1. NRST引脚上的低电平(外部复位) 2.  窗口看门狗计数终止(WWDG复位) 3.  独立看门狗计数终止(IWDG复位) 4.  软件复位(SW复位) 5.  低功耗管理复位可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。软件复位通过将Cortex™-M3中断应用
发表于 2019-06-14
STM32F10xxx支持三种复位

一则STM32f103莫名反复复位的经验记录

最近在调试STM32F103RBT6时,发现只要一打开AD就会反复复位,将断点设置到启动代码处,发现复位是非常有规律的,总是执行过断点后就又回到断点了。找原理,查硬件,一切均没有问题。最后怀疑到代码上来,因为AD采样是另外一个产品中正常使用移植过来的,分为三大部分:对AD涉及到的外设和存储等的初始化,对AD的采集与存储(主要是中断),对AD的数据进行计算分析。将三大模块全部注释后再逐一开放,发现是对AD的初始化会导致复位。对AD的初始化代码再全部注释后逐一开放,发现是启动定时器TIM4的代码会导致复位。后来将与定时器有关的代码全部审查了一遍,也没有发现问题,同样的相似代码在TIM1上工作的很好。查网上的相似问题,也没有改善
发表于 2019-06-14

STM32F4的CCM之二

前言有客户用STM32F427芯片,程序将CSTACK放在CCM RAM中,结果测试过一段时间的板子都出现了不能正常运行的情况。这个现象一度让我们怀疑是否是CCM RAM在测试过程中遭到了破坏,导致我们在解决问题的道路上浪费了不少时间。事实证明STM32的CCM RAM并没有那么脆弱,而解决问题时尽力从多个角度进行验证,不放过所有可能出问题的环节之心态更为重要。在具体讨论问题的原因之前,不妨先介绍一下STM32F4/STM32F3系列芯片上的CCM RAM。CCM RAM介绍ST的STM32F303, STM32F358, STM32F328, STM32F334系列和STM32F4的Advanced line系列芯片里都有CCM
发表于 2019-06-13
STM32F4的CCM之二

使用STM32F4的CCM内存

我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢? 首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。 我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。 这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA
发表于 2017-11-07
使用STM32F4的CCM内存

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved