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

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

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

推荐阅读

关于STM32f103 SPI时钟速度的问题

STM32f103 中APB1的最高频率是36MHz,APB2的最高频率是72MHz,而PCLK1和PCLK2一般也默认配置为其最高工作频率36M和72M。如下图(STM32F10xx_参考手册(第7版) 第46页)时钟树所示:SPI1时钟由APB2时钟分频而来,可以选择2、4、8、16、32、64、128、256这几个分频系数。而手册规定STM32的SPI时钟最快是18MHz。对于STM32F103的SPI1接口时钟,由72M的PCLK2分频得到,所以分配系数大于等于4(72M/4 = 18M)。对于STM32F103的SPI2/SPI3接口时钟,由36M的PCLK1分频得到,所以分配系数大于等于2(36M/2 = 18M
发表于 2019-09-12
关于STM32f103 SPI时钟速度的问题

STM32F4 HAL库DMA学习

;            对DMA的个别寄存器的参数进行填充,比如调用 HAL_DMA_Start()函数就会调用DMA_SetConfig()函数配置数据个数、源地址、目的地址等。而hdmatx 和第二步的DMA句柄是一模一样的,感觉最后转了一圈又转回会来了。。。  (4)  外设初始化、DMA初始化、外设和DMA进行关联、外设使能DMA发送或者接收、DMA调用函数开始发送或者接收。 个人感觉有时候HAL库的确有些冗余了,这时候可能就需要部分进行寄存器操作了。二、使用过程总结1、传输数据数目设置 注意传输数据的个数的设置:如果源
发表于 2019-09-11

STM32F103C8T6使用普通IO口模拟串口收发

在单片机用基本定时器来完成这样的事情。。。。即完成非阻塞式通讯!(1)定时器开启如下:(2)调用发送函数:UART4_Send_Buf(...);//注意STM32F103C8t6是没有串口4的!!!这是虚拟串口!!(3)调用的发送函数里面开启了定时器,所以接下来将在定时期中断中进行发送操作发送函数模拟了串口的时序:开始-发送-结束发送完一个字节,然后从缓冲区callback(),调用下一个字节进行传输!代码段如下:static void send_remain_byte(void){ if(VirtualUart.send_cnt>=VirtualUart.send_max) { VirtualUart.send_flag
发表于 2019-09-11
STM32F103C8T6使用普通IO口模拟串口收发

STM32F103的W25Q64的DMA高效数据访问实现

** Descriptions:            none**------------------------------------------------------------------------------** HW_CMU:                  STM32F103ZET6** Libraries:               STM32F10x_St
发表于 2019-09-11

STM32F103C8T6 Standby低功耗模式

1. 开发环境:winXPMDK4.45STM32 3.5固件库2. 低功耗模式简介刚接触PWR的内容,使用手册说的不太能让我好理解。其实当你弄懂了以后再回去看使用手册还是能找到的,只是写的过于简略,对于初学者很多地方理解不到位。 这个小总结完全从初学者角度,目的只有一个:进入/唤醒 PWR的standby模式。其实更多的是如何配置进入,唤醒基本上是配置好了后自动完成或硬件出发的,我们需要做的退出后的设计。这块内容暂不作为本次讨论内容。NVIC  和 PWR 各寄存器状态决定三种低功耗模式:低功耗模式一览表 PS: STM32F的NRST是异步复位脚。当NRST输入低电平的时候,MCU处于
发表于 2019-09-11
STM32F103C8T6 Standby低功耗模式

关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现

主函数中代码如下:#include "stm32f10x.h"void GPIO_Config(void);void USART_Config(void);void DMA_Config(void);void NVIC_Config(void);void LED1_ON(void);void LED2_ON(void);void LED3_ON(void);void LED4_ON(void);void LED_ALL_OFF(void);void delay(void);uint8_t DMA_BUFFER[1]; int main(){       
发表于 2019-09-10
关于STM32F107VCT6串口DMA接收数字控制LED亮灭的功能实现

小广播

何立民专栏

单片机及嵌入式宝典

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

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