查阅ST官方资料可以得出,STM32H743VI是有1024KB的RAM空间的,但其实这空间并不连续,被划分成了若干区域:" ~" N3 r+ n( a9 |) Z
# P* [/ N' I- b1 ?. y ' p1 D4 `7 y8 x9 V TCM区 TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于运行指令,也就是程序代码,DTCM用于数据存取,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。8 Q. q" Z' o5 z; J0 n " |5 }% n3 Z) K5 o) u e 速度:400MHz。) g9 @$ Z" `+ l 1 R/ L; \6 K6 r & I9 o. T7 b, V2 i; Y6 r9 d- E C' v DTCM地址:0x2000 0000,大小128KB。% l1 p* h1 E/ G ITCM地址:0x0000 0000,大小64KB。 5 T& `* a" e G6 K' F * O( s4 B) c6 ?- ? AXI SRAM区 位于D1域,数据带宽是64bit,挂在A**线上。除了D3域中的BDMB主控不能访问,其它都可以访问此RAM区。 5 G' U- {7 F6 H1 M 7 ]# I: y. i' z& p" _+ i- T3 R" b 速度:200MHz。 " V5 B7 O+ v5 L2 D 地址:0x2400 0000,大小512KB。 用途:用途不限,可以用于用户应用数据存储或者LCD显存。 # {- P( G6 b" @5 Q, `: P SRAM1,SRAM2和SRAM3区 位于D2域,数据带宽是32bit,挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM,其它都可以访问这几个RAM区。8 Y8 b" |! \# e$ @( g 2 O0 ^# O& |/ z- e6 X1 `1 B 9 d8 u Y ` ^0 D" s+ B% x/ `9 E 速度:200MHz。7 } C3 U) b% ~3 F 3 j$ U4 N9 k2 \, w- }6 g* W SRAM1:地址0x3000 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以当D1域断电后用于运行程序代码。 SRAM2:地址0x3002 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以用于用户数据存取。 : S5 N! I, b# u1 G2 c0 f2 o SRAM3:地址0x3004 0000,大小32KB,用途不限,主要用于以太网和USB的缓冲。( t/ Z. y7 p' \* f) ~' r6 L# P. w" F . t0 v$ n E1 E5 h; t+ F6 I6 R' m$ O SRAM4区 位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访这块SRAM区。 / `; V7 N w1 f3 B 速度:200MHz。 . H; [5 j1 Z2 E; K8 }' R4 o 地址:0x3800 0000,大小64KB。 & k$ M' F' R. M/ ^' M0 X p# ?$ `9 R5 o3 b 而KEIL程序平常默认启用的RAM分区为DTCM的192KB和AXI SRAM区的512KB,剩余的ITCM不用于数据读写,SRAM1,SRAM2和SRAM3区默认上电不会启用,SRAM4区更是一般只用在低功耗数据存储,在KEIL魔术棒配置中其实也可以看出来:
想要启用SRAM1,SRAM2和SRAM3区,网上给的方法一般是重写sct分区文件并让工程链接:# d% r# q1 p# f0 I, n7 v. X
LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections)8 U1 q7 C3 F7 J; z" e .ANY (+RO)+ X* _$ k0 w7 Z } / a4 D8 s( ~ C; V( z! ] ; RW data - 128KB DTCM# k i; l" A2 x- Q RW_IRAM1 0x20000000 0x00020000 { .ANY (+RW +ZI) } ; RW data - 512KB AXI SRAM; h# g: A* L" X+ l' D) W RW_IRAM2 0x24000000 0x00080000 { *(.RAM_D1) ( i! M4 {" y3 n6 m% V! T$ w } ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)6 s' M4 k/ s" m: b& }2 F. ] RW_IRAM3 0x30000000 0x0004b000 { *(.RAM_D2) } ; E' x7 n( ]4 r' a ; RW data - 64KB SRAM4(0x38000000)9 l3 B* l4 H: B! c% w! E RW_IRAM4 0x38000000 0x0004b000 { % ^4 S1 d' f4 N3 v2 F8 ^ *(.RAM_D3)# f! P2 {+ ]% W* A- P2 Q4 X( f }4 @( \1 K. H& ^" g6 d# J } 在KEIL魔术棒配置中需要把默认分配首选项关掉,这样才可以链接外部sct文件:5 J( C6 r5 r! L4 W
链接成功后,以LVGL缓存buf_1_1数组为例进行分配,首先将buf_1_1数组地址强行分配至.RAM_D1区即AXI SRAM区(0x24000000地址),并使用%p打印buf_1_1数组地址:
$ _6 O, J9 L6 Z. R 6 d* G% I) G* d4 J# h, z 可以看出,buf_1_1数组地址强行分配至AXI SRAM区没有任何问题,LVGL程序正常运行。然后是分配到.RAM_D2即SRAM123区: y& y) q3 r2 p2 U
- b8 d$ o! b7 d, r9 S 从串口打印上看,buf_1_1数组地址强行分配至SRAM123区(0x30000000区)也是成功的,但是数组作用失效,LVGL程序已经跑不起来了:
( Z- W' F) [8 `- _3 @ 在main函数中启用SRAM123的时钟,没有效果:# O* M9 a8 N& `" i( \" Q& c0 f
6 L6 G m) i( D" ` 在启用.s文件中添加AHB时钟树的SRAM123时钟标志位,也是不行:" i3 ~) C! ~, P8 H+ Z0 P# {) v1 }. T
总结:编写并链接外部sct文件确实可以启用STM32H743VI的DTCM的192KB和AXI SRAM区的512KB共计704KB,但是仍然有288KB的空间没法得到利用,这个问题只能后面再研究了。 |
【STM32C5教程】(8)ADC 模拟量数据采集实验
【STM32C5教程】(7)TIM1 互补 PWM 输出实验
【STM32C5教程】(6)定时器 PWM 输出实验
【STM32C5教程】(5)定时器周期中断实验
【STM32C5教程】(4)GPIO 外部中断实验
【STM32C5教程】(3)GPIO 按键输入实验
实战经验 | 如何将全部代码放在SRAM中运行
STM32C542RC开发板PWM呼吸灯及多功能按键实验
NUCLEO-H5E5ZJ 移植 LVGL
NUCLEO-H5E5ZJ 移植 ST7735 SPI LCD 驱动
微信公众号
手机版