STMCU小助手
发布时间:2022-12-28 17:00
|
Stm32H7XX GCC下分散加载实现- A7 d: u, Z+ b2 C( o: i' y STM32H750XBHT这块单片机,里面有五块内存区: TCM 区! M$ c6 S/ K7 q8 D 速度: 400MHz。 DTCM 地址: 0x2000 0000, 大小 128KB。 t# M7 N }4 u: ~9 t0 ~ ITCM 地址: 0x0000 0000, 大小 64KB。5 p$ s- m% z3 c# I% |3 ^/ d4 p/ c a ; N3 h. L6 }0 o, X AXI SRAM 区 位于 D1 域, 数据带宽是 64bit, 挂在 AXI 总线上。 除了 D3 域中的 BDMB 主控不能访问,其它都可以访问此 RAM 区。( e2 R9 ?1 g$ ~3 U; l; D 速度: 200MHz。0 R/ j5 \' o. O; k" c5 L) E! `6 k 地址: 0x2400 0000, 大小 512KB。 用途:用途不限,可以用于用户应用数据存储或者 LCD 显存。 SRAM1, SRAM2 和 SRAM3 区,这三块都位于D2区 位于 D2 域, 数据带宽是 32bit, 挂在 AHB 总线上。 除了 D3 域中的 BDMB1 P4 t- }0 ^8 u+ z: P 主控不能访问这三块 SRAM,其它都可以访问这几个 RAM 区。: L& Z& A! u$ H5 z- w& D' Q& ]3 O 速度: 200MHz。 SRAM1: 地址 0x3000 0000, 大小 128KB, 用途不限,可用于 D2 域中的 DMA5 H; F6 N$ u$ F/ V: e, x 缓冲, 也可以当D1 域断电后用于运行程序代码。, t; B' s6 ~8 R+ S SRAM2:地址 0x3002 0000, 大小 128KB, 用途不限,可用于 D2 域中的 DMA4 v2 [1 L1 J# l3 s2 [ 缓冲,也可以用于用户数据存取。- B3 w" E: E3 J- Z4 w SRAM3:地址 0x3004 0000, 大小 32KB, 用途不限, 主要用于以太网和 USB 的缓冲。+ I& V$ ^$ U7 f" E' ^* J6 [6 y 8 a* g; P9 |; k6 o% Y* D# { SRAM4 区6 k3 G1 C% [7 W9 z% K8 n 位于 D3 域, 数据带宽是 32bit,挂在 AHB 总线上,大部分主控都能访这块 SRAM 区。4 s& i# A+ T0 J: t+ U S' J 速度: 200MHz。* W" o! w0 e( c3 p' O$ n 地址: 0x3800 0000, 大小 64KB。 用途:用途不限,可以用于 D3 域中的 DMA 缓冲,也可以当 D1 和 D2 域进入 DStandby 待机方式后, 继续保存用户数据。 9 m7 y" g2 _+ x- L( G Backup SRAM 区 备份 RAM 区, 位于 D3 域, 数据带宽是 32bit,挂在 AHB 总线上,大部分主控都能 访问这块 SRAM区。 速度: 200MHz。# D" w: t7 ^) d, B7 U4 X) G2 W. e 地址: 0x3880 0000, 大小 4KB。6 d; g2 ? I7 N4 x4 N1 w 用途:用途不限, 主要用于系统进入低功耗模式后, 继续保存数据(Vbat 引脚外接电池)。7 ~6 n' \: Z% I* L5 G: [4 A+ y! ? 1 B% k2 V( w/ G' `! t1 U 既然有这么多快内存区域,那么我们在使用gnu环境下应该怎么使用各块区域的内存呢?4 x; K9 {$ h2 a 这里就要使用“分散加载法”。; X! |3 w- A; A4 _/ h2 s 7 @1 V8 p+ m, |4 j9 ]- j; S' @( | 打开STM32H7的链接脚本:( E4 @3 c& @3 `. h H
链接脚本中已经给我们定义好了各个内存区块,可以看到跟我们前面介绍的是一样的。 那么怎么使用呢?+ P E3 ~1 P( U. q6 A 先抛出一个问题,我们之前在写stm32代码的时候,定义的全局变量会保存在哪里?' D& M" o: C+ \. p 答案是全局区,那这个全局区到底在哪?( R% @ q- s6 O0 b 链接脚本会告诉我们:
可以看到我们定义的全局变量会保存在RAM_D1区域。% a D1 |% G' v; v7 \/ F 所以我们要将这些内存区域定义成相关的sectin。加到ld文件中! d ?' y9 n6 E5 c; Z( A+ I 写法如下:/ @/ S3 i) [- b- [/ ]/ {
加好之后,我们就可以指定全局变量定义在哪一块ram中了。
可以打印一下该数组的地址,位于DTCMRAM 区。定义到其他几个区也是一样的写法。7 i, s6 i, O+ q" Z0 T$ S 所谓分散加载法,其实就是用Ld文件指定数据到目标存储区域。 ————————————————8 {6 [& j9 U! Z+ z4 t 版权声明:tony++/ ^) w9 e% g% C; ]; x |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版
不错,正好需要这个