STM32 内存 walkpat 测试

神引 2023-09-24 11:11:20

最近在做一些软件标准认证工作,需要对单片机非易失性内存(RAM)做内存测试,使用的方法是IEC 60730-1 H.2.19.7(walkpat memory test)。

基本原理是对每个地址内存写0x00000000,再读取出来,与数据0x00000000,做对比,如果不相等代表内存故障,进入报警模式。

对该地址写入0x00000001,再读取出来,与数据0x00000001,做对比,如果不相等代表内存故障,进入报警模式。

对该地址写入0x00000002,再读取出来,与数据0x00000002,做对比,如果不相等代表内存故障,进入报警模式。

对该地址写入0x00000004,再读取出来,与数据0x00000004,做对比,如果不相等代表内存故障,进入报警模式。

...

对每一位单独写1后,再读取判断,全部完成后,再反过来进行判断,即

对该地址写入0xffffffff,再读取出来,与数据0xffffffff,做对比,如果不相等代表内存故障,进入报警模式。

对该地址写入0xfffffffe,再读取出来,与数据0xfffffffe,做对比,如果不相等代表内存故障,进入报警模式。

对该地址写入0xfffffffd,再读取出来,与数据0xfffffffd,做对比,如果不相等代表内存故障,进入报警模式。

...

 

每一个32位的内存需要处理66次,考虑到该测试过程中对内存是具有破坏性的,所有把该测试工作放在中断等级最高的函数中执行。该函数的完成由汇编代码实现,这样可以防止使用C语言测试过程对本身内存的破坏(防止程序跑飞)。

汇编函数声明:

ErrorStatus STL_RAM_WALKPAT_32Bit(u32 *);

汇编函数的实现:

STL_RAM_WALKPAT_32Bit PROC
      EXPORT STL_RAM_WALKPAT_32Bit
    ;数据备份保存
    LDR R1,[R0]
    
    ; 
    MOV R2, #0x00000000
    STR R2,[R0]
    LDR R3,[R0]
    CMP R2, R3
    BNE.W FailSafePOR
    MOV R2, #0x00000001
    
RAMLoopStart1
    STR R2,[R0]
    LDR R3,[R0]
    CMP R2,R3
    BNE.W FailSafePOR
    LSL R2,#1
    CMP R2,#0
    BNE RAMLoopStart1

    MOV R2, #0xFFFFFFFF
    STR R2,[R0]
    LDR R3,[R0]
    CMP R2, R3
    BNE.W FailSafePOR
    MOV R2, #0x00000001
    
RAMLoopStart2
    MVN R3,R2
    STR R3,[R0]
    LDR R3,[R0]
    MVN R3,R3
    CMP R2,R3
    BNE.W FailSafePOR
    LSL R2,#1
    CMP R2,#0
    BNE RAMLoopStart2

    ;数据恢复
    STR R1,[R0]
    
    MOVS R0, #0x1       ; CPUTEST_SUCCESS
    BX LR               ; return to the caller
    ENDP

  END

该函数实现对一个32位内存的测试,全部内存测试的实现,需要根据需求自行设计。

以上内容为本人个人对标准的理解,如果有不对的和不足的地方欢迎大家指正。

 

 

 

...全文
1111 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

11,258

社区成员

发帖
与我相关
我的任务
社区描述
CSDN全站用户和CSDN产品经理、运营人员集中交流讨论CSDN各产品问题的通道,欢迎大家提供建设性的建议,让CSDN变得更好。也请大家不要在这里发布招聘、技术问题等无关CSDN产品的内容,谢谢。
其他 其他
社区管理员
  • 社区公告社区
  • ZK645945
  • CSDN官方博客
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧