查阅ST官方资料可以得出,STM32H743VI是有1024KB的RAM空间的,但其实这空间并不连续,被划分成了若干区域:
% {& a6 m; I8 G : A1 F' c& ?" x TCM区3 W# ^' l" t. G p' `, V# ]6 {5 j TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于运行指令,也就是程序代码,DTCM用于数据存取,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。' D% ~# @3 B3 u5 ?2 ] 8 S. Z9 v) M% e7 S" ?; H3 v, ` 7 `/ }2 I* v* l" [ 速度:400MHz。 \/ i3 I# U' |* C+ T, f# j 4 g9 L$ _$ Q2 |; w DTCM地址:0x2000 0000,大小128KB。6 h) a% \4 \9 C$ ` ' Z' o+ ], I( l0 Z9 \ ITCM地址:0x0000 0000,大小64KB。 3 i6 m( P) t [, A5 _ AXI SRAM区 位于D1域,数据带宽是64bit,挂在A**线上。除了D3域中的BDMB主控不能访问,其它都可以访问此RAM区。2 S* d( v+ ?& e- i( m7 X 速度:200MHz。 地址:0x2400 0000,大小512KB。( i; Y3 u0 R& J" J 用途:用途不限,可以用于用户应用数据存储或者LCD显存。 . S. J' r. F- Y K# ^8 `3 w3 J SRAM1,SRAM2和SRAM3区 位于D2域,数据带宽是32bit,挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM,其它都可以访问这几个RAM区。. b2 h8 ?. B, s3 O 速度:200MHz。, H6 D1 j* g4 c1 X5 J _ 6 p9 M+ | n. I& u3 |$ G4 V" J SRAM1:地址0x3000 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以当D1域断电后用于运行程序代码。 : _+ H6 K/ v+ l9 R * f' S$ ^; x, D$ ^3 Q SRAM2:地址0x3002 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以用于用户数据存取。' A: [6 S+ X( I0 y; d- P& v5 T SRAM3:地址0x3004 0000,大小32KB,用途不限,主要用于以太网和USB的缓冲。 0 p3 A) J9 e7 C) L# M5 b, i 8 _% l; R) u) N' ? SRAM4区 位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访这块SRAM区。 / K$ k$ f6 b# A( a 速度:200MHz。6 F1 Z) r4 n" ` $ _& B8 f# S! d! j# ^ 地址:0x3800 0000,大小64KB。. I4 ?) A( l6 m* O5 J: } f 而KEIL程序平常默认启用的RAM分区为DTCM的192KB和AXI SRAM区的512KB,剩余的ITCM不用于数据读写,SRAM1,SRAM2和SRAM3区默认上电不会启用,SRAM4区更是一般只用在低功耗数据存储,在KEIL魔术棒配置中其实也可以看出来:
- M/ z' \& ]; p, Q 想要启用SRAM1,SRAM2和SRAM3区,网上给的方法一般是重写sct分区文件并让工程链接:/ P. x; \: }9 h) m" r8 y" L5 `5 D
LR_IROM1 0x08000000 0x00200000 { ; load region size_region/ ]9 A ~% T! [7 a ER_IROM1 0x08000000 0x00200000 { ; load address = execution address' }! P1 M. n2 p *.o (RESET, +First). G4 w% v2 e( C# l3 `. i *(InRoot$$Sections)# a+ d! H7 l' |: M" O .ANY (+RO)' r* x6 r9 b V& Z5 F }0 r5 e" l$ b" E+ _4 H/ X8 o& O9 S ; RW data - 128KB DTCM- B3 X" e7 U B1 y& ]5 a7 Q RW_IRAM1 0x20000000 0x00020000 { $ v, t" I, {' [) S, ^6 B( p .ANY (+RW +ZI)0 K& @ O3 Q+ s, _3 z4 ` } ; RW data - 512KB AXI SRAM RW_IRAM2 0x24000000 0x00080000 { ! N" @" B) \7 r4 p4 I9 ^* R0 y, T& s *(.RAM_D1) } 5 o, u8 u1 N& J! l; `: o ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)+ [$ a, X, G: | RW_IRAM3 0x30000000 0x0004b000 { 8 w# z) B! @( }) T, i *(.RAM_D2) 0 H7 `- v- K4 g9 j: B0 Z. {4 \: X+ t; g }8 `; A8 x: t4 m+ u ; RW data - 64KB SRAM4(0x38000000): j* ^3 R9 z& H: }- q6 f6 E9 ^; d4 | RW_IRAM4 0x38000000 0x0004b000 { ( Q* {2 T5 j* d- h+ q *(.RAM_D3) } } 在KEIL魔术棒配置中需要把默认分配首选项关掉,这样才可以链接外部sct文件:6 J$ C2 v( Q3 Z; T, ]0 \- a& ]$ B
| `( Z/ X4 H4 ~8 t, m, x 链接成功后,以LVGL缓存buf_1_1数组为例进行分配,首先将buf_1_1数组地址强行分配至.RAM_D1区即AXI SRAM区(0x24000000地址),并使用%p打印buf_1_1数组地址:
5 ~3 U, q2 Q0 B; k7 q 可以看出,buf_1_1数组地址强行分配至AXI SRAM区没有任何问题,LVGL程序正常运行。然后是分配到.RAM_D2即SRAM123区:$ ~2 B" ?4 z6 e' L+ J' {
从串口打印上看,buf_1_1数组地址强行分配至SRAM123区(0x30000000区)也是成功的,但是数组作用失效,LVGL程序已经跑不起来了:
" j2 b3 f7 G' I5 H6 C7 w/ K ( E8 Z: [4 J0 I: p 在main函数中启用SRAM123的时钟,没有效果:
/ q& d: w( o7 U5 b: s/ n s 在启用.s文件中添加AHB时钟树的SRAM123时钟标志位,也是不行:
, S/ q- o3 }" |" p( I: R3 G 总结:编写并链接外部sct文件确实可以启用STM32H743VI的DTCM的192KB和AXI SRAM区的512KB共计704KB,但是仍然有288KB的空间没法得到利用,这个问题只能后面再研究了。+ i& [" |" s% n# a' ^- d |
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中运行
微信公众号
手机版