[信息] 编译器随机分配RAM地址导致DMA错误的问题解析

[复制链接]
223|0
STM新闻官 发表于 2025-11-1 19:35 | 显示全部楼层 |阅读模式
1. 引言
由于STM32有丰富的产品线,它可以适应于各种各样的应用。也正是为了各种各样的应用和成本的考虑,ST MCU的产品需要各种外设配置,比如,FLASH、RAM 、各种外设、SMPS、 等等,可以供客户根据自己的实际项目的需求,灵活地进行选择。由于这些不同的配置存在,如果在应用软件中,不正确的配置差异,可能造成不同的问题,如:中断不能产生、DMA不能进入、有的甚至导致进入hardfault。

2. 问题描述
客户在开发自己的产品的过程中,使用STM32F429IGT6,需要用到Ethernet 和USB等相关外设,所以客户使用FreeRTOS 作为任务管理。但是当客户增加分配给FreeRTOS的内存大小(Total_Heap_Size)的时候,会导致Ethernet的DMA出错。具体表现为:MCU不能够被PC ping通。当减小这个内存时,又可以被PC ping 通,客户百思不得其解,他们增加这个内存,也没有超出芯片的最大RAM的大小(还剩余几十K RAM),这个跟Ethernet也没有关系,为什么就会出问题呢?

2.1. 问题分析
客户提供一个STM32CubeMX的.ioc文件,基于客户的.ioc文件,分析客户的外设配置,并没有发现明显的错误,然后试着去生成了一个IAR的工程,编译后,查看的map文件,也没有发现任何RAM或者FLASH超出的问题。又没有客户的板子(因为没有客户的Ethernet 的PHY),似乎问题没有办法进行查找下去了。查看客户提供的调试信息,如下图:

341886905ef8ae7f1a.png

在图中可以看到Ethernet中断产生了错误中断 Fatal Bus error。查看芯片的参考手册
648066905efa479b0c.png
这里直观地可以看到位 24和25为1时 ,那就是说明在传输时读取出错,也就是说从内存中读取数据出错了。 再次查看生成的map文件,查找这个DMA分配相关的地址如下:并没有发现任何问题,都在正常的地址范围。
890596905efbc3d665.png
似乎问题进入了死结,一切都没有问题,但就是不能正常运行,我们要求客户提供客户的正常运行和错误运行的map文件。当拿到文件的时候,发现他们使用的Keil编译器,这也应该不是问题的原因。我们先对比了一下这个文件如下:
952986905efd3dc919.png
我们发觉这个NG的map 文件DMA地址是分配到了CCRAM空间,我们查看参考手册可以知道CCRAM只是供 MCU内核访问的。如下图:
869586905efef69552.png
那为啥IAR 不会出现这种问题呢?

3. 问题解决
在上面的分析来看,我们可以得出下面的结论: 第一,在IAR中,不论怎么修改都是正常的,但是在Keil中有时候是正常,有时候不正常。 第二,同在Keil的工程中,由于DMA访问的地址错误,而导致问题的发生。 接着分析IAR 和 Keil的 RAM分配机制: 在Keil 中,如果不做修改的时候,他是由系统配置决定,我打开Keil的工程配置可以看到, 它包含了两个部分的RAM 定义(SRAM 和 CCRAM)  

328676905f00a64bc2.png

而IAR一般都是STM32CubeMX的生成时使用的template生成的,它并没有利用

764456905f01c8b7d7.png

这个CCRAM 如下图,没有任何字段放在这个范围。


所以,当我们使用IAR时,他始终不会产生问题,而当使用Keil时,由于调整不同的配置,Keil在分配地址的时候,可能将一些DMA的访问地址放到了不能访问的地方(如CCRAM)。 解决办法: 第一: 像IAR一样,不利用CCRAM空间。仅保留SRAM

522816905f04185dca.png

第二;将DMA需要访问的地址空间,定义到SRAM范围。如下面方法,或者你可以在网上搜索其他的定义方式;

121706905f056ee1f7.png


4. 小结
其实STM32其它系列也有类似的地址访问问题(比如STM32H7的DMA 不能访问DTCMRAM),当出现这问题的时候大家可以用上面相同的思路进行分析。

337466905f06ee667d.png

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

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1428

主题

1758

帖子

25

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