电子说
IEC(国际电工委员会)是由所有国家电工委员会组成的世界性标准化组织,IEC针对家用电器的正常安全运行制定了安全标准。
IEC60335安全标准里面定义了多种测试和诊断方法,确保面向家用电器的嵌入式控制硬件和软件的安全运行。IEC60730安全标准主要针对安全和性能、环境、电能效率及其可再生能力,其标准为硬件及软件解决方案提供建议。
为此,华芯微特开发出多款安全特性和软件开发包(包括IEC60335安全库),可帮助大型电器市场的自动化控制制造商满足IEC60335 CLASSB规范。
在这里我们以SWM341为例给大家简单介绍一下在IEC_60335_CLASSB软件库。
整体流程
ClassB软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,MCU在上电的时候会进行复位启动,在启动完成以后会进行运行自检。
启动时检测
CPU寄存器进行自检操作,如果检测没有故障则进行看门狗的自检,如果有故障则进行故障的处理。看门狗自检流程与CPU寄存器自检的流程一致,后面依次会进行FLASH,RAM以及时钟自检,启动自检完成以后会进入程序的主循环函数中。
启动自检流程如下图:
CPU启动时检测
进行CPU寄存器的相关检测,主要检查内核标志、寄存器和堆栈指针等是否正确。如果发生错误,就会调用故障安全处理函数Selftest_fail_handle()。
看门狗启动时检测
验证看门狗复位功能是否正常,保证后续运行中如果因为程序计数器出现非预期异常情况导致程序跑飞时可以通过看门狗复位恢复。测试通过判断复位状态寄存器的复位标识来判断是否测试成功。
时钟启动时检测
启动阶段的时钟检测通过内部低速时钟源(LICK)和系统时钟的交叉测量结果来判断。系统时钟频率作为基准频率,采用外部高速时钟源(HEXT)或者内部高速时钟源(HICK)。将定时器的时钟源设置为LICK,systick设置为系统时钟,运行systick相同时间,两次timer当前值之间的差值作为测量值与LICK预期的范围值进行比较。如果测量值超出了LICK预期范围值,则测试失败。
FLASH启动时检测
FLASH自检是存储器检测的一部分, 程序中将FLASH数据用CRC算法计算, 将结果值跟编译时已存储在FLASH指定位置的预先计算好的CRC值进行比较。
RAM启动时检测
RAM自检是存储器检测的一部分,对于支持硬件SRAM奇偶校验功能的型号,可以开启RAM校验功能并且可以跳过该步骤,而对于不支持硬件SRAM奇偶校验功能的型号,则采用March C算法,用值0x00和0xFF逐字交替填充整个RAM并检查,填充时可以选择加扰模式(scramble)或者标准模式(standard),加扰模式基本物理单元是4字,下图单元格内的编号代表测试填充的顺序。
RAM采用March C算法测试时分6个步骤,前3个循环按照地址递增执行,后3个循环按照地址递减执行。测试步骤如下,如果采用March X算法则省略步骤3和4:
· 全部范围写0x00,按照地址递增顺序执行
· 检测是否全部范围为0x00,然后全部范围写0xFF,按照地址递增顺序执行
· 检测是否全部范围为0xFF,然后全部范围写0x00,按照地址递增顺序执行
· 检测是否全部范围为0x00,然后全部范围写0xFF,按照地址递减顺序执行
· 检测是否全部范围为0xFF,然后全部范围写0x00,按照地址递减顺序执行
· 检测是否全部范围为0x00,按照地址递减顺序执行
控制流启动时检测
控制流检测也属于程序计数器检测的一部分,启动阶段控制流检测主要分为了两个节点,其中一个检测节点是在RAM检测之前,通过控制流变量值判断是否前面所有测试项都正确完成,另外一个节点是在RAM检测后,主要是运行阶段检测必须操作的流程的配置,比如CRC参考变量初始化、栈溢出pattern设置。
运行时周期检测
在主循环中会定期的进行自检操作,在进行自检操作的时候会依次进行如下操作:CPU寄存器的自检、栈自检、时钟自检、FLASH自检、并设置定时器定时进行RAM自检,如果在自检的过程中出现故障则会进行故障的处理。
CPU运行时检测
CPU运行时周期自检跟启动时的自检类似,只是不检测内核标志和堆栈指针。
看门狗运行时检测
运行时需要定期喂狗保证系统正常运行, 看门狗的刷新部分放置在每次检测最后部分。
时钟运行时检测
启动阶段的时钟检测通过内部低速时钟源(LICK)和系统时钟的交叉测量结果来判断。系统时钟频率作为基准频率,采用外部高速时钟源(HEXT)或者内部高速时钟源(HICK)。将定时器的时钟源设置为LICK,systick设置为系统时钟,运行systick相同时间,两次timer当前值之间的差值作为测量值与LICK预期的范围值进行比较。如果测量值超出了LICK预期范围值,则测试失败。
FLASH CRC运行时检测
运行时进行Flash CRC的自检,因为检测范围不同耗时不同,如果一次计算检测全部范围CRC可能耗时过长,影响正常应用部分的执行,所以可以根据用户应用程序大小配置分段CRC计算,当计算到最后一段范围时,再进行CRC值比较,如果不一致则测试失败。
栈边界运行时检测
可验证寻址和数据路径测试相关,定义特殊固定值的Magic Pattern数组,放置在栈区域最底部地址,通过运行中检测Magic Pattern数组完整性来判断栈是否溢出。如果原始Pattern被破坏,则表明栈溢出测试失败,调用故障安全程序。
这一区域根据设备及应用有不同的配置。用户必须为堆栈定义足够的区域,并保证pattern正确放置。下图是程序中RAM的简要分配图,其中灰色部分是相比较于常规应用,支持自检需要额外添加的部分。
局部RAM运行时检测
运行时的RAM自检是在systick中断函数中进行的。因为运行中不允许破坏应用部分RAM,所以测试只覆盖分配给CLASS B变量的那部分内存。测试流程方法概要描述如下:
· 测试根据systick时基分批次进行,每次测试按照CLASS B部分4个字的区域偏移,为保障耦合故障覆盖率,每次测试的实际内存块还包括测试区域前后各1个相邻字,总共6个字。
· 首先将待测试内存块(RAM block)的数据存储到专门用于测试过程中临时保存数据的缓冲块(buffer block)
· 然后跟启动时检测RAM类似, 对测试内存块(RAM block)采用March C算法测试,同样可以选择加扰模式(scramble)或者标准模式(standard)
· 测试完成后将缓冲块(buffer block)中保存的数据恢复至测试内存块(RAM block)。
工程配置
Keil中添加bat文件
添加ini文件
分散加载文件配置
编译结果
运行结果
以上是本次介绍的IEC_60335_CLASSB软件库,如需更多了解SWM芯片信息请联系华芯微特技术人员。
来源:华芯微特32位MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !