STM32系列死机问题

STM32F4系列SRAM分布

SRAM被分为两部分:一部分为IRAM1,基地址0x20000000,大小为192K;另一部分为IRAM2,基地址0x10000000,大小为64K。如下图所示:
STM32429地址空间分布

问题背景

在stm324系列芯片中调用读写flash或者emmc函数接口时,出现死循环,导致设备卡死的问题。操作flash或者emmc时均使用DMA。

排查思路

之前在工程中增加业务功能时,也出现过几次类似的问题,所以清楚这个问题原因是:DMA对IRAM2地址(地址空间为0x10)进行读写导致的。

问题原因

IRAM2地址空间不能使用DMA进行读写。。。。。。
按照上述思路,通过Debug确定果然是由于在进行DMA读写过程中涉及有些变量为IRAM2地址空间导致的问题,如下图:
读取错误

解决方法

针对此问题有如下几种解决方式:
1、避免进行DMA读写的变量在IRAM2空间,可以在keil->魔法棒中取消勾选IRAM2(针对整个工程生效),可以将不进行DMA读写的变量置于IRAM2空间;
2、出现这种问题的原因归根结底还是由于RAM空间不够,系统将变量自动分配到IRAM2空间所致,所以可以通过实时性要求不高的变量置于外部的SDRAM空间;
3、节省RAM空间–将只读的全局变量使用const定义,这样RAM空间又能多出一部分空间进行分配;
4、将卡死部分的变量通过__attribute__变量重新指定到IRAM1地址空间即可避免此类问题,但要注意:需要将指定的变量置于最先编译的文件之中,否则到达__attribute__语句时有可能前面文件中变量已经你所指定的地址占用,导致无法指定地址,编译器会报如下错误:“(.data) type RW incompatible with XXX.o(.ARM._AT_0x20000300) type ZI in er RW_IRAM1”
“”
在这里插入图片描述或报“Execution region RW_IRAM1 size(205416 bytes) exceeds limit (196608 bytes). Region contains 208 https://bbs.dji.com/thread-243647-1-1.htmlbytes of padding and 0 bytes of veneers (total 208 bytes of linker generater content).”这样的错误
在这里插入图片描述

总结

出现这样的问题最根本的原因还是由于RAM空间不够导致,所以在使用工程时始终遵循以下两点可以避免卡死问题的出现:
1、整体工程配置不要勾选IRAM2,keil编译时会随机将全局变量分配到IRAM1或者IRAM2中,有可能就会将进行DMA读写的变量分配到IRAM2中导致出现卡死;可以将局部文件–不进行DMA读写的文件单独指定到IRAM2中;
2、内部RAM空间实在不够用的情况下,考虑将一些实时性要求不高的变量置于外部SDRAM空间中,也可以避免此类问题出现。

参考链接

STM32RAM空间知识

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值