查阅ST官方资料可以得出,STM32H743VI是有1024KB的RAM空间的,但其实这空间并不连续,被划分成了若干区域:+ ?# s" L6 Q1 g- Q
$ g2 v! g z% s( }# F3 | TCM区 TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于运行指令,也就是程序代码,DTCM用于数据存取,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。 % s6 b4 J% S) N+ u5 v; [1 \5 x6 Z 速度:400MHz。 DTCM地址:0x2000 0000,大小128KB。 $ a; q) l: v. L3 V ITCM地址:0x0000 0000,大小64KB。0 n5 ]8 W; n4 k! u, R: M- D6 b * b3 z; z8 n3 K/ ~( f g AXI SRAM区! I( j& z! A! }1 T; [% T. c5 _+ ~0 p% _ 位于D1域,数据带宽是64bit,挂在A**线上。除了D3域中的BDMB主控不能访问,其它都可以访问此RAM区。5 ^+ c; @! `1 K$ a0 P- u; x0 I. | 速度:200MHz。 " ?- p8 b" Q* H1 `# Q) f 地址:0x2400 0000,大小512KB。 8 I |' ~; [$ [% j; M 用途:用途不限,可以用于用户应用数据存储或者LCD显存。 K) ^ A( K& m) A% R 6 L8 m( C! y/ ^; o% l6 S& K8 c SRAM1,SRAM2和SRAM3区/ J! q/ E0 Y4 z* f' j 位于D2域,数据带宽是32bit,挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM,其它都可以访问这几个RAM区。! w: E b- C, t/ |" ^ , V. h& w/ A2 Y' R2 u3 _2 I 3 ?7 w+ @6 t) N \" q 速度:200MHz。 SRAM1:地址0x3000 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以当D1域断电后用于运行程序代码。 / l3 |2 l, e& f j5 w: x $ K! K. ]& ` Q$ Y& I% ~8 K SRAM2:地址0x3002 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以用于用户数据存取。/ I; }; ^* W3 d7 P 6 r- |. A, t7 y3 W; o" Z2 A 3 \- ?( l# v: w |- U SRAM3:地址0x3004 0000,大小32KB,用途不限,主要用于以太网和USB的缓冲。 : L: f* s' P0 Z L+ P SRAM4区 位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访这块SRAM区。 速度:200MHz。 2 I! K3 A: p$ R; p; r8 b4 r 地址:0x3800 0000,大小64KB。 . B# s9 ]" J w0 u/ D/ n4 g 而KEIL程序平常默认启用的RAM分区为DTCM的192KB和AXI SRAM区的512KB,剩余的ITCM不用于数据读写,SRAM1,SRAM2和SRAM3区默认上电不会启用,SRAM4区更是一般只用在低功耗数据存储,在KEIL魔术棒配置中其实也可以看出来:: K( K0 A8 ~% N6 y% S* f
想要启用SRAM1,SRAM2和SRAM3区,网上给的方法一般是重写sct分区文件并让工程链接:8 q, I2 V9 R3 @* u8 K- m- J3 C5 z+ G
LR_IROM1 0x08000000 0x00200000 { ; load region size_region- {6 r& _9 ]9 ?- [) N% y ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First)9 [# t R( J1 ? *(InRoot$$Sections)- F) \. | s( j1 q4 E .ANY (+RO) }% i8 W) W/ h2 Q: h- ` ' ?0 R3 A9 p$ S ; RW data - 128KB DTCM6 p; `8 }) a/ l& ? RW_IRAM1 0x20000000 0x00020000 { # O4 `7 Z( _3 {: j6 `9 V .ANY (+RW +ZI) }# Y. p ]% w: R0 u 8 s/ @7 C- |) ^" Y7 u ; RW data - 512KB AXI SRAM RW_IRAM2 0x24000000 0x00080000 { *(.RAM_D1) } # ~& O/ w, }% g3 C$ x+ j T ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000) RW_IRAM3 0x30000000 0x0004b000 { *(.RAM_D2) & T, l6 V7 o) p' R } % ?7 u% k1 W* j$ Z) X ; RW data - 64KB SRAM4(0x38000000) RW_IRAM4 0x38000000 0x0004b000 { *(.RAM_D3)) x: u6 {' b2 F% b( e/ x% c. u }9 ^% u6 _+ P' [9 C5 y# d9 ]$ a } " Z: g0 N2 R0 g, S" A % z8 b# b3 h6 v# t# o% n 在KEIL魔术棒配置中需要把默认分配首选项关掉,这样才可以链接外部sct文件:2 J9 M V: O9 }: K7 Y( `! G3 H
链接成功后,以LVGL缓存buf_1_1数组为例进行分配,首先将buf_1_1数组地址强行分配至.RAM_D1区即AXI SRAM区(0x24000000地址),并使用%p打印buf_1_1数组地址:
% O U3 t( e* o4 R 可以看出,buf_1_1数组地址强行分配至AXI SRAM区没有任何问题,LVGL程序正常运行。然后是分配到.RAM_D2即SRAM123区:
从串口打印上看,buf_1_1数组地址强行分配至SRAM123区(0x30000000区)也是成功的,但是数组作用失效,LVGL程序已经跑不起来了:
3 U" l* \( }+ P- q0 H) b( a 在main函数中启用SRAM123的时钟,没有效果:: X8 n5 a* q3 k9 K9 C
' W4 s5 f1 [( X 在启用.s文件中添加AHB时钟树的SRAM123时钟标志位,也是不行:0 k) |: @+ j8 V9 Z! L+ w: j8 g
" f/ [ H1 k$ u% O4 B4 d# y 总结:编写并链接外部sct文件确实可以启用STM32H743VI的DTCM的192KB和AXI SRAM区的512KB共计704KB,但是仍然有288KB的空间没法得到利用,这个问题只能后面再研究了。 |
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
M24LR-discovery测试小结
Keil-MDK 在线调试设置断点的高级用法
STM32L562DK探索板——串口通讯的再测试
STM32L562DK探索板——串口通讯的测试
STM32L562DK探索板——运动传感器测试
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
微信公众号
手机版