查阅ST官方资料可以得出,STM32H743VI是有1024KB的RAM空间的,但其实这空间并不连续,被划分成了若干区域:
TCM区 TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于运行指令,也就是程序代码,DTCM用于数据存取,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。" `; T2 ?1 H0 }1 o6 z' K 速度:400MHz。# S/ F+ p5 ?% o' a( p% } ) R6 W4 d0 Q5 x/ |3 k" T2 u DTCM地址:0x2000 0000,大小128KB。 / H4 C+ M4 E! X. d) K, } ) U7 k* z/ J. Y2 a) t+ r" A ITCM地址:0x0000 0000,大小64KB。- U9 o/ @0 @: S S AXI SRAM区 位于D1域,数据带宽是64bit,挂在A**线上。除了D3域中的BDMB主控不能访问,其它都可以访问此RAM区。 " r' w. k. y4 C% P 4 `' ~* H$ ]. C' E# _ 速度:200MHz。4 d5 [' Z( q9 ?4 V 地址:0x2400 0000,大小512KB。 用途:用途不限,可以用于用户应用数据存储或者LCD显存。 ) S u m7 N8 `( e7 F: F" n % z! E$ r6 A3 l9 M# d, g SRAM1,SRAM2和SRAM3区9 E5 {) T/ p4 Y3 ~ 位于D2域,数据带宽是32bit,挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM,其它都可以访问这几个RAM区。# |. E' j, _ y - u# i, g5 ~1 q8 K: z/ _ 6 P+ m& J- ~# d# b( i 速度:200MHz。 % O8 h8 }, f0 s7 g2 ?$ x6 o 6 I! j) Y N6 x( \! w4 S$ M SRAM1:地址0x3000 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以当D1域断电后用于运行程序代码。 1 q6 R+ o% d5 } 4 P3 y g5 Q6 U" v+ | SRAM2:地址0x3002 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以用于用户数据存取。 9 W! H! H9 H! K# [) \7 l( C6 d SRAM3:地址0x3004 0000,大小32KB,用途不限,主要用于以太网和USB的缓冲。: W5 B ~' x$ ?0 \- J- k" m SRAM4区: ^' W2 V* G1 z, F$ n& D* A& t* z 位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访这块SRAM区。9 S1 j+ @* D" r: S3 k/ G5 p + R4 w9 h' r v! x- k h 速度:200MHz。! @; t# j+ M- ^( [' }: I9 R7 W- E# u7 p 0 C0 \; ]' U4 }. B3 E' W! F% A 地址:0x3800 0000,大小64KB。2 q; v# c" P3 ~$ g* M, q0 a$ Z' N) v0 S7 v 3 s: w* U+ R% Q% { 而KEIL程序平常默认启用的RAM分区为DTCM的192KB和AXI SRAM区的512KB,剩余的ITCM不用于数据读写,SRAM1,SRAM2和SRAM3区默认上电不会启用,SRAM4区更是一般只用在低功耗数据存储,在KEIL魔术棒配置中其实也可以看出来:9 K% H6 _* q# F7 l# }' U# f
1 ~) m% l7 N0 w; L' e9 B 6 U: J, ?8 i& b; u1 A t/ R+ R 想要启用SRAM1,SRAM2和SRAM3区,网上给的方法一般是重写sct分区文件并让工程链接:
LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address* J$ _* \; H4 a6 D& b) v1 H *.o (RESET, +First), c1 s4 e( K( |# t: E3 ~, E% a *(InRoot$$Sections) .ANY (+RO)6 P) h4 Z2 r8 A: `5 m' i- z }2 }0 K9 c" I& d$ H8 [ % r, B) m. k: K% V+ A$ W& k1 A ; RW data - 128KB DTCM RW_IRAM1 0x20000000 0x00020000 { .ANY (+RW +ZI) } - r" \! k; d5 ?1 N3 o/ H ; RW data - 512KB AXI SRAM: J; d: I) `& C' s RW_IRAM2 0x24000000 0x00080000 { . W2 E# I4 Z0 F2 x- d4 ` *(.RAM_D1) } ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000) RW_IRAM3 0x30000000 0x0004b000 { 1 {; j( n* L& y: k1 Z P *(.RAM_D2) }7 D3 w* A) Z5 L0 f D. X ; RW data - 64KB SRAM4(0x38000000) RW_IRAM4 0x38000000 0x0004b000 { *(.RAM_D3): S9 S$ c4 u( s" a; P } } : m# Q9 ]4 L2 w9 ] 在KEIL魔术棒配置中需要把默认分配首选项关掉,这样才可以链接外部sct文件:
链接成功后,以LVGL缓存buf_1_1数组为例进行分配,首先将buf_1_1数组地址强行分配至.RAM_D1区即AXI SRAM区(0x24000000地址),并使用%p打印buf_1_1数组地址:
可以看出,buf_1_1数组地址强行分配至AXI SRAM区没有任何问题,LVGL程序正常运行。然后是分配到.RAM_D2即SRAM123区:( N5 X" O1 c8 Z0 c! I
; ]+ o8 T( ?/ ~5 \5 u) r 从串口打印上看,buf_1_1数组地址强行分配至SRAM123区(0x30000000区)也是成功的,但是数组作用失效,LVGL程序已经跑不起来了:
4 I6 E V' V8 f! J2 } 在main函数中启用SRAM123的时钟,没有效果:, I3 |( ^, e: i( P
/ A: U, \3 w! k0 S& Z* ? 在启用.s文件中添加AHB时钟树的SRAM123时钟标志位,也是不行:
总结:编写并链接外部sct文件确实可以启用STM32H743VI的DTCM的192KB和AXI SRAM区的512KB共计704KB,但是仍然有288KB的空间没法得到利用,这个问题只能后面再研究了。) m% J5 k6 g4 \3 b 7 d7 }1 z4 [0 X' q( ` |" Q |
STM32C542RC开发板的串口不定长数据接收实验
《STM32CubeMX2 实战课程》学习笔记——STM32C562RE开发测试
STM32C542RC开发板的串口DMA发送及接收实验
终于完成了STM32C542RC开发板的串口发送实验
【新品测评】STM32WL3R芯片测评,从点亮第一个LED到subGhz启动
STM32C542RC开发板的按键控制LED闪烁实验
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
《STM32CubeMX2 实战课程》学习笔记--课程1:STM32CubeMX2安装
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
微信公众号
手机版