[STM32H7] 在 STM32H743 中使用 DTCMRAM

[复制链接]
49|16
Treasure101 发表于 2026-5-13 16:05 | 显示全部楼层 |阅读模式
我想在 STM32CubeIDE 中使用 DTCMRAM,单片机型号是 STM32H743。之前我使用的是 RAM_D2。现在可以从 RAM_D2 切换到 DTCMRAM,但无法同时使用两者。
请教高手指点。
我在链接脚本中添加了如下代码:

/DISCARD/ :
{
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
}

.RAMD2buffers(NOLOAD) : {
    . = ALIGN(4);
    *(.buffers*)
} > DTCMRAM

.bssDTCMRAM(NOLOAD) : {
    . = ALIGN(4);
    *(.buffersDT*)
} > RAM_D2

.ARM.attributes 0 : { *(.ARM.attributes) }


在主文件中添加了如下代码:

//__attribute__ ((section(".buffers"), used))
char rData[BUF_SIZE];// Read data

__attribute__ ((section(".buffers"), used))
uint32_t DMA_ADC1[ADC1_Size];

__attribute__ ((section(".buffers"), used))
uint32_t DMA_ADC2[ADC2_Size];

__attribute__ ((section(".buffers"), used))
uint32_t DMA_ADC3[ADC3_Size];

__attribute__ ((section(".buffersDT")))
uint32_t DMA_ADC3_dummy[ADC3_Size];

七毛钱 发表于 2026-5-13 16:13 | 显示全部楼层
DTCMRAM只能被内核访问,DMA根本够不到这块内存,你把DMA缓冲区放进去肯定不行。
classroom 发表于 2026-5-13 17:13 | 显示全部楼层
链接脚本里你把.RAMD2buffers这个段强行塞到DTCMRAM区域,但段名还叫RAMD2,这不混淆吗?
cr315 发表于 2026-5-13 18:14 | 显示全部楼层
检查一下MPU配置,DTCMRAM和RAM_D2的属性不同,同时用的话MPU要分开配置。
duo点 发表于 2026-5-13 19:14 | 显示全部楼层
STM32H7的DTCMRAM地址是0x20000000,RAM_D2是0x30000000,你映射对了没有?
duo点 发表于 2026-5-13 16:14 | 显示全部楼层
把DMA用的数组放回RAM_D2,把CPU频繁读写的变量放DTCMRAM,这样分工明确。
flycamelaaa 发表于 2026-5-13 20:15 | 显示全部楼层
你代码里DMA_ADC3_dummy放在.buffersDT段里但是指定到了RAM_D2区域,搞反了吧。
jcky001 发表于 2026-5-13 21:15 | 显示全部楼层
用__attribute__((section(".dtcmram")))定义变量,然后在链接脚本里专门开一个.dtcmram段。
onlycook 发表于 2026-5-13 21:16 | 显示全部楼层
检查下DTCMRAM的大小,默认只有128KB,你是不是放超了。
powerantone 发表于 2026-5-13 22:16 | 显示全部楼层
两个内存区域同时用不需要在链接脚本里互相搬运,各自定义各自的段即可。
probedog 发表于 2026-5-13 16:47 | 显示全部楼层
用CubeMX重新生成一下链接脚本,勾上DTCMRAM和RAM_D2同时使能的选项。
solty 发表于 2026-5-13 17:47 | 显示全部楼层
把.bssDTCMRAM段放到DTCMRAM区域,然后把.buffers段放到RAM_D2,你现在写的完全反了。
spicy 发表于 2026-5-13 18:48 | 显示全部楼层
看下在启动文件里,两个内存区域的清零和初始化是否都执行了,不要只初始化DTCMRAM。
stormwind123 发表于 2026-5-13 19:48 | 显示全部楼层
DTCMRAM不支持DMA寻址,但可以用来存放任务堆栈和RTOS关键数据结构。
七毛钱 发表于 2026-5-13 20:49 | 显示全部楼层
你那个DISCARD段把libc和libm全丢了,小心printf和浮点运算直接崩溃。
内政奇才 发表于 2026-5-13 21:39 | 显示全部楼层
用__attribute__((section(".ram_d2")))和__attribute__((section(".dtcmram")))分开标注变量,比纠结.buffers命名清晰得多。
才没有脸红 发表于 2026-5-13 22:50 | 显示全部楼层
先别管DMA,写个最简单的测试,在两个区域各定义一个数组,分别读写看谁失败。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

201

主题

201

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0