stm32的RAM自检,在读写RAM中的数据时,程序总是进入HardFault,检查没有溢出。

2019-07-21 01:28发布

最近项目增加单片机的RAM ROM自检功能。在坐第一个RAM自检的功能时就遇到问题。stm32的RAM起始地址,和空间大小如下图所示
截图未命名.jpg 因此在编写Test_RAM时,按照先将RAM空间中的写满0x00,在读回空间中的数据和0x00做对比,判断读回的数据是否都是0x00。如果都是0X00在向空间中写入0XFF,同样再读回RAM空间中的数据,和0XFF做对比,判断读回的数据是否都是0XFF,如果两次对比都没有问题,则认为RAM是OK的。现在编写如下伪代码: 截图未命名.jpg ,程序在读写数据时,特别容易进入HardFault,硬件错误中断函数,不知道为什么?是溢出了?不应该溢出,求大神指点。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
zc123
1楼-- · 2019-07-21 07:11
zhangxiaolin 发表于 2019-5-14 14:56
先写入0X00,读出0X00的代码截图如下:这这部分代码只测试向RAM指定区域写入0X00,然后读出数据。不执行 ...

单纯看代码,没有问题,不过这样情况就复杂了
(1)编译器生成的汇编结果不正确(这个只能结合汇编一起调试,找出错误的汇编语句,再具体分析)
(2)芯片RAM本身存在问题,这个概率极低,但也不是不可能
只能靠你自己了
zc123
2楼-- · 2019-07-21 10:53
因为你根本不能这么写,你定义的栈也在这个0x20000000范围内,你相当于修改了栈内的数据,出现hardfault很正常,不出现才是运气好,你这种自检,代码里面不能覆盖栈的空间,看你.s文件分配多大,起始地址不要包含栈空间,如果实在要求包含栈的全覆盖,修改ResetHandler函数,在调用SystemInit之前用汇编实现
zhangxiaolin
3楼-- · 2019-07-21 12:46
 精彩回答 2  元偷偷看……
zc123
4楼-- · 2019-07-21 13:17
zhangxiaolin 发表于 2019-5-14 13:31
启动文件中栈的大小定义为:Stack_Size      EQU     0x00000800  ; 从新定义起始地址,即:unsigned cha ...

把改过的代码截图看下,理论没什么其他问题
warship
5楼-- · 2019-07-21 18:15
 精彩回答 2  元偷偷看……
zhangxiaolin
6楼-- · 2019-07-21 20:06
本帖最后由 zhangxiaolin 于 2019-5-14 15:11 编辑
zc123 发表于 2019-5-14 14:19
把改过的代码截图看下,理论没什么其他问题

先写入0X00,读出0X00的代码截图如下: 截图未命名2.jpg 这这部分代码只测试向RAM指定区域写入0X00,然后读出数据。不执行读写0XFF,在debug模式下非常容易进入HardFault,直接download到主板,显示测试OK。debug模式下,Memory中的数据如下: 截图未命名1.jpg 从RAM测试区域的起始地址:0x20000800    到   结束地址:0x2000FFFF中的数据全是0x00,即整个待测RAM区域数据写入读取OK。同样的方法流程:添加向RAM中写入0XFF,然后读取0XFF的测试代码,代码截图如下: 截图未命3.jpg ,测试不过,终端打印显示error1,同样是DOWNLOAD至主板,程序没有崩溃,测试结果均有打印输出。但是如果进入debug模式后,容易进入hardfault。在debug模式下的memory截图如下: 截图未命名5.jpg ,说明向待测区域写入0XFF是不成功的,再读取的时候不符合条件肯定报错。为什么会有这些数据写入,写入的数据明明是0xFF.求大神指点。

一周热门 更多>