|
STM32电机培训online,大佬带你玩电机) D+ e' \9 k0 y; H6 A4 u/ `' M 2 H* A1 R! c' X6 b& e' p0 h F# S, |/ J f" s q6 o8 E 我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。6 p0 [5 I1 L$ q3 V+ i- F K8 N - P3 N8 ^2 H8 S; Q% |: R6 [
* N6 |- V% F" q' A( X 首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。2 s+ Q: e3 R+ a7 I4 L+ U
我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。 , t1 [/ r1 y) J) D ?; |
/ W' Z' |! v3 m9 x 这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。# ]+ O6 Q5 S2 a8 l2 v( k 于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:$ |6 U. R. Q# ^0 S2 Y& F
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:3 h. |# w8 m0 n% n( g
太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。 z- x+ j" K6 B0 e# _4 z 那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:$ C7 I3 n) A3 H3 f" s2 A
修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。 ! e: S5 o/ x" c* k6 Q5 M' F
5 ^# Q9 Y( e1 i3 E7 R+ l" `# G 然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:# c' I* |! Z4 u# {* V# ^ 4 h- X T7 M" W# r8 f
% E# j8 R5 z- J( S 由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:
然后在链接器中选择我们自己的文件: 4 n% t8 [/ @+ f1 Y/ ?+ \$ c
, `( q/ Y% X% \, p3 E 现在,映像文件变成了这样: Y8 d$ _9 o2 d
) y# ]. h4 P) ?: @ 是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。# i1 U6 E) _- N8 [$ M" ~ / ^/ Q6 c4 F/ \ |
【福利三:雨露均沾·逢7狂欢】之四:用一个定时器同步另外两个定时器输出PWM
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
【逢7发帖赢大礼】全网最简单的Arduino_STM32开发环境搭建教程!
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
SPI 高温读错最后一位?STM32F42xx 官方根治方案
微信公众号
手机版
CCM本质上还是RAM,所以不能放Code
9 V9 m+ B* E: G& l5 N) ~* ]
有屎以来,很有粪量的一篇文章。绝对点赞。。。。