查阅ST官方资料可以得出,STM32H743VI是有1024KB的RAM空间的,但其实这空间并不连续,被划分成了若干区域:
9 I, _) |/ Z$ K) b' }0 D TCM区 TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于运行指令,也就是程序代码,DTCM用于数据存取,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。 9 g8 v8 p$ W! O0 J9 D3 y* {( | 速度:400MHz。 9 K) }- M! s5 ?" F4 ~% O9 [1 t: r DTCM地址:0x2000 0000,大小128KB。 ITCM地址:0x0000 0000,大小64KB。 AXI SRAM区) k/ _8 e! Z3 T- G, K 位于D1域,数据带宽是64bit,挂在A**线上。除了D3域中的BDMB主控不能访问,其它都可以访问此RAM区。 5 Q$ Z* M2 Q% t6 A" }' c: F, I 速度:200MHz。 & c2 q3 g s" J 地址:0x2400 0000,大小512KB。 ; ]1 o9 E; J6 y 用途:用途不限,可以用于用户应用数据存储或者LCD显存。: G) O7 [5 {. [ 0 G0 ~ U9 e9 G9 y# X( Q SRAM1,SRAM2和SRAM3区 位于D2域,数据带宽是32bit,挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM,其它都可以访问这几个RAM区。 5 ]9 K" |2 W1 Y8 z9 Z7 _* p 2 G7 ]; P% [+ T3 e4 ] 速度:200MHz。 ! H% d; l0 Q8 A, H 3 Q' v# u8 }8 u% y1 ? SRAM1:地址0x3000 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以当D1域断电后用于运行程序代码。- z+ i C+ Y" q! _; ] SRAM2:地址0x3002 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以用于用户数据存取。 + W K* C) U4 d& c4 o& ` SRAM3:地址0x3004 0000,大小32KB,用途不限,主要用于以太网和USB的缓冲。 SRAM4区 位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访这块SRAM区。 9 j2 c) f" k6 X2 E! m& V7 X 速度:200MHz。 4 R4 [3 @- k+ W) c4 w) g , s. P5 O7 |+ m: w; Y2 J; u 地址:0x3800 0000,大小64KB。3 L# Q4 z+ K6 E 5 D' a( k4 Q0 q9 k/ V( v" D ( @% p0 x8 r; ?$ U 而KEIL程序平常默认启用的RAM分区为DTCM的192KB和AXI SRAM区的512KB,剩余的ITCM不用于数据读写,SRAM1,SRAM2和SRAM3区默认上电不会启用,SRAM4区更是一般只用在低功耗数据存储,在KEIL魔术棒配置中其实也可以看出来:, ^" t; m3 b' Z! G
8 \; Y1 E& N' Z& {7 U9 A; o 想要启用SRAM1,SRAM2和SRAM3区,网上给的方法一般是重写sct分区文件并让工程链接:
LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address- d( T% L# D, }/ |8 D1 m' u4 H *.o (RESET, +First)+ J5 z. q; y6 C9 }0 o2 O! y* r: d5 [/ V *(InRoot$$Sections)9 s1 y5 l8 H& ]0 h/ o! L .ANY (+RO) }9 `% l5 h& `# z- j# J+ W+ g 5 Q+ q0 |8 h% a& w7 j) @; ] ; RW data - 128KB DTCM( K" x+ U. P! @1 F! p RW_IRAM1 0x20000000 0x00020000 { .ANY (+RW +ZI) }4 L# E0 ~" ]; B+ P& g/ q0 l5 j ; RW data - 512KB AXI SRAM RW_IRAM2 0x24000000 0x00080000 { ' D1 D% b* I1 M *(.RAM_D1) 4 Y. K+ Z% q1 ~ } ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000) RW_IRAM3 0x30000000 0x0004b000 { , w+ ^9 H0 o; G3 M3 Q *(.RAM_D2) } h! r+ h6 T( k) r ; RW data - 64KB SRAM4(0x38000000)5 H; p0 J& R) s- W) c: n; Q RW_IRAM4 0x38000000 0x0004b000 { *(.RAM_D3) } }- @. @( d4 N8 {% E 在KEIL魔术棒配置中需要把默认分配首选项关掉,这样才可以链接外部sct文件:) A. i% w2 w/ t6 W( J2 I; i% S
% O* j: ^# A5 A/ T& o0 k 链接成功后,以LVGL缓存buf_1_1数组为例进行分配,首先将buf_1_1数组地址强行分配至.RAM_D1区即AXI SRAM区(0x24000000地址),并使用%p打印buf_1_1数组地址:
1 l Y8 c! Q, P4 K2 Q7 o7 ^ _ & }; T& j7 x2 d 可以看出,buf_1_1数组地址强行分配至AXI SRAM区没有任何问题,LVGL程序正常运行。然后是分配到.RAM_D2即SRAM123区:9 d4 Y9 |4 g" f
3 Z# Y7 M8 Q+ {5 n% \ 9 A7 ~- ]& r* {8 Q% n: M+ w 从串口打印上看,buf_1_1数组地址强行分配至SRAM123区(0x30000000区)也是成功的,但是数组作用失效,LVGL程序已经跑不起来了:
2 W/ N8 l8 v" g) o9 D' c, c4 { 在main函数中启用SRAM123的时钟,没有效果:# O6 d% G5 ^, b9 U4 X
0 }0 E! i' L2 B" } 在启用.s文件中添加AHB时钟树的SRAM123时钟标志位,也是不行:
总结:编写并链接外部sct文件确实可以启用STM32H743VI的DTCM的192KB和AXI SRAM区的512KB共计704KB,但是仍然有288KB的空间没法得到利用,这个问题只能后面再研究了。( C# ~- l, c4 C1 ` |
STM32C543RC开发板Stop、Sleep和standby模式测试
【STM32C5教程】(10)LPUART DMA 通信实验
【STM32C5教程】(9)DAC 模拟量信号输出实验
【STM32C5教程】(8)ADC 模拟量数据采集实验
【STM32C5教程】(7)TIM1 互补 PWM 输出实验
【STM32C5教程】(6)定时器 PWM 输出实验
【STM32C5教程】(5)定时器周期中断实验
【STM32C5教程】(4)GPIO 外部中断实验
【STM32C5教程】(3)GPIO 按键输入实验
实战经验 | 如何将全部代码放在SRAM中运行
微信公众号
手机版