硬汉嵌入式论坛

 找回密码
 立即注册
查看: 569|回复: 6
收起左侧

[STM32H7] RAM分配求教

[复制链接]

4

主题

90

回帖

102

积分

初级会员

积分
102
发表于 2025-5-2 11:06:41 | 显示全部楼层 |阅读模式
本帖最后由 Penguins 于 2025-5-2 11:08 编辑

各位大神,笔者为H7新手玩家,移植G4串口+DMA程序时可直接跑通,CubeMX中未使能Cache,未配置MPU,使用通用DMA(未配置MDMA)。

后续在手册发现H7分为
D1/2/3 Domain,了解到通用DMA1/2无法访问DTCM区域(0x20000000+128KB),经检查map文件发现确实只使用了AXI SRAM区域(0x24000000+512KB)。

[C] 纯文本查看 复制代码
 [b]Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08006b50, Size: 0x00000000, Max: 0x00020000, ABSOLUTE)[/b]

[u]**** No section assigned to this execution region ****[/u]

[b]Execution Region RW_IRAM2 (Exec base: 0x24000000, Load base: 0x08006b50, Size: 0x00001268, Max: 0x00080000, ABSOLUTE)[/b]

Exec Addr Load Addr Size Type Attr Idx E Section Name Object

0x24000000 0x08006b50 0x00000008 Data RW 711 .data..L_MergedGlobals stm32h7xx_hal.o
0x24000008 0x08006b58 0x00000008 Data RW 1113 .data..L_MergedGlobals system_stm32h7xx.o
[u]0x24000010 0x08006b60 0x000000d0 Data RW 17 .data.myUART main.o[/u]
0x240000e0 - 0x00000078 Zero RW 57 .bss.hdma_usart1_rx usart.o
0x24000158 - 0x00000078 Zero RW 56 .bss.hdma_usart1_tx usart.o
0x240001d0 - 0x00000094 Zero RW 55 .bss.huart1 usart.o
0x24000264 - 0x00000004 Zero RW 710 .bss.uwTick stm32h7xx_hal.o
0x24000268 - 0x00001000 Zero RW 1 STACK startup_stm32h743xx.o


对此有若干问题:
  • 后续计划使用Cache,应当如何决定将何数据分配至DTCM,何数据分配至AXI SRAM及其他SRAM1/2/3/4
  • Keil魔术棒中IRAM仅有2个区域,对应DTCM和AXI SRAM,那么其他SRAM1/2/3/4是如何被使用的
  • 对于将被DMA读写的数据,推荐使用mpu禁用此区域cache的方法,还是在dma收发前CleanInvalidate的方法

无标题.png


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-5-2 15:36:39 | 显示全部楼层
1、问题1和问题2,可以看教程第26章。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=86980

2、都可以,串口速度比较低
回复

使用道具 举报

4

主题

90

回帖

102

积分

初级会员

积分
102
 楼主| 发表于 2025-5-2 16:36:10 | 显示全部楼层
感谢坛主,对问题3,如果是其他高速应用,更推荐哪种呢?有没有统一的建议
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-5-3 09:34:45 | 显示全部楼层
Penguins 发表于 2025-5-2 16:36
感谢坛主,对问题3,如果是其他高速应用,更推荐哪种呢?有没有统一的建议

这个得以实测为准来修改,不同场景,效率不同。
回复

使用道具 举报

4

主题

90

回帖

102

积分

初级会员

积分
102
 楼主| 发表于 2025-5-3 10:47:53 | 显示全部楼层
MPU的缺省配置对0x20000000+512MB的SRAM均为WBWA,但是其中DTCM区域已可达到与CPU同频读写,那是不是这块区域没有必要Cache了?但是也看到您说不要自行配置TCM区域的MPU,以发挥最大性能,求教
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2025-5-3 11:18:00 | 显示全部楼层
1、MDK的target对话框仅提供两项片上内存自动分配,若是要用其他SRAM,可以手动分散加载的,手动分散加载参考硬汉哥上面提及教程文件。

2、关键分散加载:
[C] 纯文本查看 复制代码
	; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)
	RW_IRAM3 0x30000000 0x00048000 {
	*(.bss.RAM_D2)
	*(.RAM_D2)
	}


3、指定DMA缓冲区定义到你期望的内存位置:

__attribute__((section(".bss.RW_IRAM3"))) static lv_color_t buf_2_1[MY_DISP_HOR_RES * 128];

这里是AC6编译器哈,指定内存位置0初始化变量的时候,需要加上bss标识才会被分配到ZI段,没有bss表示则会分配到ZW段

回复

使用道具 举报

4

主题

90

回帖

102

积分

初级会员

积分
102
 楼主| 发表于 2025-5-4 12:29:13 | 显示全部楼层
clinebe 发表于 2025-5-3 11:18
1、MDK的target对话框仅提供两项片上内存自动分配,若是要用其他SRAM,可以手动分散加载的,手动分散加载参 ...

非常感谢指出AC6的注意事项,这部分验证成功了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:56 , Processed in 0.045305 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表