[LKS32 硬件]

【LKS32AT085评测】02.IEC60730 ClassB简介及实现FLASH自检部分

[复制链接]
225|1
手机看帖
扫描二维码
随时随地手机跟帖
GrandLine|  楼主 | 2022-9-17 19:26 | 显示全部楼层 |阅读模式
本帖最后由 GrandLine 于 2022-9-17 19:31 编辑

ClassB介绍
随着对产品稳定性、安全性等诸多性能日趋的关注,在做某些项目时,需要通过一些认证,以此来保证产品安全可靠的运行。在IEC颁布的IEC60730安全标准中将软件分为ABC三类,其中B类软件定义为软件的设计要防止电子设备的不安全操作。本文主要也是针对其中B类软件而实现的ClassB软件功能。

ClassB软件需要检测的故障/错误如下表所示:
  
需要检测的组件
  
故障/错误
MCU相关故障
应用相关故障
1.CPU
1.1.寄存器
滞位
1.3.程序计数器
滞位
2.中断
没有中断或者中断太频繁
3.时钟
错误的频率
4.存储
4.1.非易失性存储
所有的单比特错误
4.2.易失性存储
DC Fault
4.3.寻址(与非易失性和易失性相关的)
滞位
5.内部数据路径
5.1.数据
滞位
5.2.寻址
错误的地址
6.外部通信
6.1.数据
汉明距离3
6.2.寻址
错误的地址
6.3.时序
错误的时序
7.输入输出
7.1.数字I/O
H27中定义的错误
7.2.模拟输入输出(AD,DA,模拟复用器)
H27中定义的错误—错误的寻址
一般MCU厂家在针对ClassB软件测试项时只提供上表中的1/3/4/5项,其余项目则是由应用功能结合实际情况进行添加进行自检测。

ClassB软件功能检测主要也就划分为两部分,分别是启动时的自检和运行时的周期自检。其中启动时的自检大多包含看门狗自检、CPU寄存器自检、FLASH完整性自检、RAM功能自检、系统时钟自检和控制流自检;而运行时的周期自检大多包含局部CPU寄存器自检、堆栈边界检测、系统时钟检测、FLASH自检、控制流自检和局部RAM自检(在中断服务程序中进行,就是我们上一章节提到的SysTick中断服务程序)。本文先从ClassB中FLASH自检功能进行实现和验证。

我们知道我们经过编译后的烧录程序最终是存储在MCU内部非易性的FLASH存储空间中的,MCU上电后自动从FLASH起始地址开始取指、译码、执行。而存储在FLASH空间中的程序实际上也是一包数据,保证执行程序的正确性,实际上就是确保存储在FLASH空间中的数据的正确性。对于数据包的完整性,我们结合MCU配备的硬件CRC功能来进行校验,具体的实现方法是在程序编译完生成HEX烧录文件后,在HEX烧录文件的末尾插入刚刚HEX文件中所有数据的CRC计算结果,这样在程序运行时,通过读取存储在FLASH中的程序数据进行CRC运算,将CRC运算结果再与处于末尾处插入的CRC计算结果进行比较,如果两个CRC结果值相等,说明当前FLASH中的程序是完整的,否则FLASH中的程序就有可能已经被破坏了。


LKS32AT085 CRC
LKS32AT085芯片自带了硬件CRC计算单元,通过寄存器的配置支持位翻转、输出翻转、数据位宽设置、自定义多项式和配置初始计算值,能够实现众多应用中常见的CRC运算过程。通过硬件CRC的计计算对比软件编码方式实现的CRC计算相比,运算时间会大幅度的提升,随着了运算数据量的增加,硬件CRC的计算时间短的优点尤为明显。对于在ClassB中对存储在FLASH空间中的代码进行CRC运算,其数据会随着应用代码的增加,CRC的算力也会随着增加,在启动自检和运行周期性自检中,能CRC的实现过程也会不一样。在启动自检时,ClassB会对整个应用代码一次性做完整的CRC计算,对计算的结果进行判断比较;而在运行周期性自检时,为了减少ClassB自检程序所占用的时间对应用程序的影响,对于CRC部分会分扇区进行CRC运算,一般一次只计算FLASH中的一个SECTOR或者更小的PAGE,在计算完所有的SECTOR或者PAGE后,再将此时的计算结果进行判断比较。

需要注意的是在实际项目应用中,很多客户为了存储应用配置参数,减少外部硬件存储芯片,将这些配置参数存储在了MCU内部应用程序未占用的FLASH空间,而出现上电自检时FLASH CRC自检正确,但一运行应用程序,在后面的运行自检时,FLASH CRC自检却一直不通过,这时候需要检查一下用于存放配置参数的FLASH空间是否与应用程序空间重叠了,在应用程序和存储配置参数的FLASH区域之间最好留有一定的间隔,确保不会相互干扰到!


实现过程
请按照如下步骤进行配置和操作:
1. 在凌鸥提供的底层驱动库程序startup_lks32mc08x.s中,添加__Check_Sum变量,如下所示:
2.jpg

2. 点击Keil工具栏上的Options for Target…魔术棒按钮,在弹出的窗口中选择Linker选项卡进行配置,使用自定义的分散加载文件,并将刚刚定义的__Check_Sum变量添加到应用程序末尾,具体配置如下所示:
1.jpg 3.jpg

3. 下一步就是在我编译完成应用程序之后对生成烧录HEX文件,调用第三方执行软件运算CRC结果,并将这个结果插入到HEX文件末尾,这个带有CRC校验的HEX文件我们会新建一个文件存储,在Keil中的配置就是在点击魔术棒按钮后弹出的窗口中选择User选项卡,配置如下所示:
4.jpg

4. 在生成新的带有CRC的HEX文件后,我们接着对KEIL工程进行配置,我们需要将KEIL在调试和下载的程序更换为带CRC的HEX文件,点击魔术棒在弹出的窗口中我们分别为Debug和Utilities选项卡进行配置,如下图所示:
5.jpg 6.jpg 7.jpg

5. 然后就是对第三方生成CRC软件进行配置了,我们使用srecord-1.64-win32这个软件,大家可以到官网上进行下载(http://srecord.sourceforge.net),然后直接解压到C盘的SREC文件夹下,如下图所示:
8.jpg

6. 在3步骤时,我们配置了一个crc_gen_keil.bat批处理文件,这个文件就是对调用srecord这个软件来生成带CRC校验结果HEX文件的配置和处理过程,具体的配置可以参考文件配置,如下:
9.jpg

7. 接下来我们就可以在我们代码中添加FLASH CRC的校验程序啦,具体实现如下所示:
10.jpg

8. 然后对我们的工程进行编译,在完成编译后,就会调用crc_gen_keil.bat批处理文件来生成一个带CRC结果的HEX文件,如下图所示:
11.jpg

9. 最后我们点击KEIL的下载程序按钮,将带CRC的HEX文件下载到MCU运行,查看运行结果如下所示:
12.png

最后原理HEX文件和带CRC结果的HEX文件直接比较是不直观的,我们需要借助另外一个Hex2Bin的小工具,将HEX文件转换成BIN文件,然后再用Compare软件进行比较,这时比较结果就会很直观了,如下图所示:
13.jpg


附件
软件工程源代码: ClassB_FlashCRC_Base.zip (1.96 MB)

使用特权

评论回复
GrandLine|  楼主 | 2022-9-17 19:33 | 显示全部楼层
CRC参数模型为CRC-32/MPEG-2,如下所示: 14.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则