你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用STM32F4的CCM内存  

[复制链接]
风之力-395256 发布时间:2016-1-8 00:50
STM32电机培训online,大佬带你玩电机
* M0 H7 Y- j4 T: }: K  D* Y" Z1 u3 E/ }
. e( q! R/ Y9 [+ ]2 Q) c
( O. n. Y6 Y6 e1 D+ e7 {9 {0 N" m
' U3 b6 k7 K% m4 z2 c( m$ f
我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给那些还不知道的人,如有错漏,还请指正。
" w) h% h" z4 h$ m$ @. X% s4 s& Y7 V$ e1 c/ h' W5 _+ x
捕获.JPG
& x7 ]2 w* p# a( q
/ v" d& U8 K# \; _5 D- Z首先,我们可以使用Keil的设置选项,将IRAM2打勾,让编译器选择什么时候使用这个内存。显然,我们还可以将这两个地址修改一下,将IRAM1改为0x10000000,这样,编译器就会优先分配CCM内存。
) J: g% t! O. F/ @' q* J8 V0 N* [/ q* j' r2 F  X5 d: h
捕获2.JPG 4 D% d* e& D; i) N% m

9 M: p) _! U  \+ Y$ L我们来看看结果,在MAP文件中,表明确实使用了这段内存,但是因为我们使用的内存较少, 还没有用到CCM。; C7 E* _, r1 r5 J  ~
7 J- V- U. s! ~
捕获3.JPG * W# h* T  B" M  g7 D1 \4 H

$ Y0 i: n, b  L) r- L. y* K# z这种自动分配的方式有什么问题呢?这段内存是内核专有的,除了内核任何其它总线都不能访问,这就意味着,一旦编译器将数据分配到CCM中,而同时使用了DMA访问,显然会出问题。
; ]- N6 E% g0 ]9 F1 U3 n* H# Z
4 {4 ]- n0 h5 S1 R' ]/ ?于是我们就想到了自己分配这段内存,__attribute__((at(address)))这个语句就是专门干这事的,然后我们可以这么做:
; X4 M5 [2 w+ c2 f" i
  1. int vat[10] __attribute__((at(0x10000000))) = {1,2,3,4,5,6,7,8,9,10};
复制代码
/ c. K' [. p  @9 P
再次编译以后,发现确实如我们所愿,我们将一段数据放在在了CCM内存中:
8 u* j5 K# O' Y( N( [
  1.     Execution Region RW_IRAM2 (Base: 0x10000000, Size: 0x00000028, Max: 0x00010000, ABSOLUTE)+ d  i) P9 }2 _

  2. # @, I9 S. A( l# L/ e0 J, ?
  3.     Base Addr    Size         Type   Attr      Idx    E Section Name        Object
    & i, M0 J  c0 W8 |6 ]( t/ P" E

  4. ) q$ S9 \2 B, H$ a: k
  5.     0x10000000   0x00000028   Data   RW            7    .ARM.__AT_0x10000000  main.o
    & U! l0 \! m2 I. C1 T, U/ U
复制代码

* G$ u  m0 ]3 C6 z* S4 h0 m太好了,那么我们能不能将FreeRTOS的数据放进CCM中呢?将FreeRTOS要使用的内存全部移到CCM中,使其成为专有内存,显然会提高FreeRTOS的运行速度。7 {2 @; B9 p3 w, ?+ b
0 E+ x# I6 W3 ]
那么怎么放?首先我们想到了heap4.c这个文件当中有这么一段:
. c0 P: F8 P5 b: t" ?
  1. /* Allocate the memory for the heap. */
    1 J1 H9 U7 f3 n! ]2 n5 b
  2. #if( configAPPLICATION_ALLOCATED_HEAP == 1 )7 @, J3 q6 r  F. @6 M0 Y  W1 ^7 L
  3.         /* The application writer has already defined the array used for the RTOS
    8 g* g8 u  F8 D- }; Y( i; x
  4.         heap - probably so it can be placed in a special segment or address. */% H* D  ]" \" n. P5 Y
  5.         extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    0 g( t% Q0 q2 M( W
  6. #else
    ; |# U: X2 A! ]- O& v
  7.         static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
    $ }& I  d! U8 w' K  p: e; ]
  8. #endif /* configAPPLICATION_ALLOCATED_HEAP */
复制代码
这是FreeRTOS中堆内存的分配,我们可以加入__attribute__将其放进CCM中,这样做没有问题,但是去修改FreeRTOS的源代码显然不是明智之举。事到如今,我们只能自己定义链接器的储存器映射了。
0 T1 T9 @# t8 K' J" S; t! O; m. G  J/ P4 U1 y3 B4 m
修改Keil的Linker选项,我们把Use Memory Layout from Targer Dialog的钩去掉。6 w0 b/ Z! N) ~
1 V2 u* x. U9 d6 e6 G
捕获4.JPG ( _- i$ b' F, X* X

2 I- }5 L' \5 X  i, y7 U然后在Objects的目录中找到一个后缀为sct的文件,打开之后如图所示:6 h& f/ p( E, h  E% W

/ X' M+ q9 h- E9 {1 y: |9 Q$ j/ D 捕获5.JPG
# G& @3 Q0 A- T+ d, k& H
3 p" W5 Q" L. z8 ?9 G: c% F
由于我们只需要将RTOS的数据放入CCM中,于是我们可以这样修改,CCM_IRAM的名字是我自己取的,你可以改成任何你喜欢的,比如什么LOVEYOU之类的:
1 _8 T2 I' i6 i0 f4 ]- {! y5 \* {7 B, `: k
捕获6.JPG
$ x: w7 E) n( a2 B. C
8 t" z4 y$ Q( C. L6 w% E然后在链接器中选择我们自己的文件:% `* I; A% ?. M' I6 j

/ @9 c& F. g9 ]3 u* y8 l 捕获7.JPG
, O5 x' p( M+ n& Q" e6 D% z( V, g7 @/ R. Y4 C; @
现在,映像文件变成了这样:
4 N5 t8 l1 y4 ]) Y7 m" o
4 {! U+ H( r2 V! e; C 捕获8.JPG
0 i6 T+ K7 G  q( j4 w# F* ]( O5 _
是不是很简单呢?系统堆栈仍然在主内存中,而FreeRTOS的堆内存已经移到了CCM中,由于互不影响,这里我分配了50K的空间专门给FreeRTOS使用。我们甚至还可以配置MPU将这段内存配置为特权级,避免一般任务修改等等,怎么使用,那就是你的事了。* G3 p& s2 Q( ~- t+ b9 O, D$ S
) X5 Y# A8 c( p/ r

  v  U  g4 ^$ c5 ?! _) C9 }0 {
收藏 26 评论19 发布时间:2016-1-8 00:50

举报

19个回答
yangwang90 回答时间:2020-11-3 10:18:08
通过查看最新的STM32G4系列芯片,发现CCM现在挂靠在5条主控总线上,不再是直接D-Bus总线上。既然也在总线矩阵内,那么也需要仲裁,请问STM32G4这种CCM怎么提升访问速度呢?还请各位执教,谢谢!
; e+ y8 E6 P: f+ N; Q9 \
Untitled picture.png
yangwang90 回答时间:2020-11-3 10:12:19
Kar98_K 发表于 2020-6-3 11:14. X: ^9 e' \. V* s0 W- n7 m
CCM只有D总线连内核,那是不是就不能把代码放到CCM里了?
3 `$ I/ q9 q% l& {5 l
CCM本质上还是RAM,所以不能放Code
watershade 回答时间:2016-1-8 09:02:56
这绝对是新知呀。之前还不知道CCM内存。那么内核用它一般做什么用?
zhangdaijin 回答时间:2016-1-8 06:09:16
党国特派员 回答时间:2016-1-8 09:36:11
本帖最后由 党国特派员 于 2016-1-8 09:41 编辑 : q5 S& z# T  |' {6 Y8 n% A

9 n+ H: V8 G0 ?3 L4 _4 R, p有屎以来,很有粪量的一篇文章。绝对点赞。。。。
2602082487 回答时间:2016-1-8 10:52:59
好贴,给楼主100个赞,收藏了
风雨酒 回答时间:2016-7-28 11:44:00
厉害厉害
zhangxu56726 回答时间:2016-7-28 13:42:39
谢谢分享,顶顶顶顶顶顶顶顶顶顶顶顶
tjwdlx 回答时间:2016-8-4 23:21:03
学习了~mark~~~
kqh1120 回答时间:2016-11-11 11:54:37
学习了。。。
无帝老三 回答时间:2017-4-7 19:32:35
楼神,修改加载文件后,是不是可以不用勾选IRAM2了?
莫问1990 回答时间:2018-6-9 17:16:53
直接在heap4.c里用动态内存分配也可以吧
tianqi911 回答时间:2019-6-12 13:02:19
搞了半天,注册一个号。就是为了感谢楼主。赞一个。
赛孔明 回答时间:2020-2-8 12:59:05
点赞
andey 回答时间:2020-2-8 13:33:23
提示: 作者被禁止或删除 内容自动屏蔽
wdliming-222461 回答时间:2020-2-27 10:58:15
谢谢分享收藏
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版