查阅ST官方资料可以得出,STM32H743VI是有1024KB的RAM空间的,但其实这空间并不连续,被划分成了若干区域:
! q9 p7 P- y5 u0 R TCM区4 O4 d/ {- j% H' ] TCM : Tightly-Coupled Memory 紧密耦合内存 。ITCM用于运行指令,也就是程序代码,DTCM用于数据存取,特点是跟内核速度一样,而片上RAM的速度基本都达不到这个速度,所以有降频处理。( b. U( Q( e% L+ o3 ]3 V& G2 A& j 0 v- z9 G* Q8 X & e7 J+ |" N" o! g' X 速度:400MHz。; H( T& p" [# w" U6 C7 P+ j7 T 2 H4 H4 Q* Y4 q6 r& E# R$ f. e DTCM地址:0x2000 0000,大小128KB。 % h$ C0 a1 c) H# l8 t J) Y 5 t- z' X; s) o) @ ITCM地址:0x0000 0000,大小64KB。 l0 L& Z, W* ^; N6 a AXI SRAM区 位于D1域,数据带宽是64bit,挂在A**线上。除了D3域中的BDMB主控不能访问,其它都可以访问此RAM区。 8 c. G! g! q: ~0 M3 ^ 5 u2 T) l3 V6 u- o: p1 H 速度:200MHz。. ^# R0 a* g/ b+ G: R) G g7 e 9 j+ Z/ M- M4 ^* c$ r+ k 0 Y* @; V! u' ]* g6 p2 {6 ]6 ~' z3 f 地址:0x2400 0000,大小512KB。 8 u; q6 S( J% V! w/ }: |+ W$ e 用途:用途不限,可以用于用户应用数据存储或者LCD显存。 : B+ R1 E! A# c SRAM1,SRAM2和SRAM3区4 `. t6 t- K' k# [ 位于D2域,数据带宽是32bit,挂在AHB总线上。除了D3域中的BDMB主控不能访问这三块SRAM,其它都可以访问这几个RAM区。: _ y: K4 y3 \5 F$ a" Y/ \ 7 H7 }0 K! d& D. J 速度:200MHz。1 n/ [4 O3 E1 g ! j- D. |, U( |, K4 U, d, [9 m SRAM1:地址0x3000 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以当D1域断电后用于运行程序代码。% o# o0 _2 \4 ^: h7 J " L, ?/ K' Z Z4 Z2 } 5 F( O+ {7 V' X/ ]) r7 s8 G SRAM2:地址0x3002 0000,大小128KB,用途不限,可用于D2域中的DMA缓冲,也可以用于用户数据存取。" _7 [# V% U. A2 G I % |' f( c% K0 t* E SRAM3:地址0x3004 0000,大小32KB,用途不限,主要用于以太网和USB的缓冲。 0 r" Y. n+ e& H/ f SRAM4区 位于D3域,数据带宽是32bit,挂在AHB总线上,大部分主控都能访这块SRAM区。* L$ e b- c d$ X8 v. I ( E* M" K4 s M5 E 速度:200MHz。 地址:0x3800 0000,大小64KB。 6 a$ M2 N5 d( L; p1 s5 J$ L 而KEIL程序平常默认启用的RAM分区为DTCM的192KB和AXI SRAM区的512KB,剩余的ITCM不用于数据读写,SRAM1,SRAM2和SRAM3区默认上电不会启用,SRAM4区更是一般只用在低功耗数据存储,在KEIL魔术棒配置中其实也可以看出来:' U) P$ ~* [! g
, {5 y+ k2 t5 q3 W3 G 想要启用SRAM1,SRAM2和SRAM3区,网上给的方法一般是重写sct分区文件并让工程链接:: O; V, I+ g1 C. P6 K
LR_IROM1 0x08000000 0x00200000 { ; load region size_region! O4 O! ~1 \9 F4 \2 R# |- D ER_IROM1 0x08000000 0x00200000 { ; load address = execution address m8 _0 _9 E) ?* k! K *.o (RESET, +First) *(InRoot$$Sections)! ~- F: T& t( r" c# t .ANY (+RO) }9 G$ I2 y# f. [, D8 A" [ # S# t3 e: W D. ~ ; RW data - 128KB DTCM RW_IRAM1 0x20000000 0x00020000 { ; B. }5 i) G1 \7 _- ~. ^ A .ANY (+RW +ZI) } , g6 [7 F4 v& C) U/ p: h1 ~ ; RW data - 512KB AXI SRAM$ p, q" e& u6 @/ A/ u+ X RW_IRAM2 0x24000000 0x00080000 { 0 f7 ]( g) A% t6 K *(.RAM_D1) } , s4 f; @- k4 z# m D ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000) RW_IRAM3 0x30000000 0x0004b000 { & F+ I" ?8 i t# g1 Q; Y *(.RAM_D2) }& [2 @' ~9 G: L* Z0 r3 ` 8 E8 H. Y$ i/ S0 x8 Z) t; d5 x3 t ; RW data - 64KB SRAM4(0x38000000)( L6 Q# j' {* q RW_IRAM4 0x38000000 0x0004b000 { ) T* v- J% V2 x" x6 k0 ^ *(.RAM_D3)3 d; e1 X4 L8 f! E9 \" \ } } 在KEIL魔术棒配置中需要把默认分配首选项关掉,这样才可以链接外部sct文件:
. s4 m5 u) j6 j2 F 链接成功后,以LVGL缓存buf_1_1数组为例进行分配,首先将buf_1_1数组地址强行分配至.RAM_D1区即AXI SRAM区(0x24000000地址),并使用%p打印buf_1_1数组地址:
; c d! v5 b* V# f + Z1 z( d1 X } 可以看出,buf_1_1数组地址强行分配至AXI SRAM区没有任何问题,LVGL程序正常运行。然后是分配到.RAM_D2即SRAM123区:) q/ D6 w2 O* t8 e! I' A
9 s( Z" a$ t, n9 n: O8 y8 J. F 从串口打印上看,buf_1_1数组地址强行分配至SRAM123区(0x30000000区)也是成功的,但是数组作用失效,LVGL程序已经跑不起来了:. ]/ [ s1 [" j# @$ M
在main函数中启用SRAM123的时钟,没有效果:7 y. e: X+ A' V+ M$ N. v5 m
在启用.s文件中添加AHB时钟树的SRAM123时钟标志位,也是不行:. n1 u4 M& @5 u
总结:编写并链接外部sct文件确实可以启用STM32H743VI的DTCM的192KB和AXI SRAM区的512KB共计704KB,但是仍然有288KB的空间没法得到利用,这个问题只能后面再研究了。 ; j' }/ n7 `6 {3 g |
【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 驱动
微信公众号
手机版