打印
[应用相关]

AN0041 AT32_IEC 60730_CLASSB软件库使用指南

[复制链接]
1387|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 ArterySW 于 2022-5-10 19:41 编辑

AN0041 AT32_IEC 60730_CLASSB软件库使用指南
前言
这篇应用笔记描述了AT32系列的MCU如何执行IEC 60730中所要求的软件安全性相关的操作。


支持型号列表:
AT32F403xx
AT32F413xx
AT32F415xx
AT32F403Axx
AT32F407xx


1 概述
IEC60730的附录H(H.2.22)中对软件进行了分类
    ● A类软件:软件仅实现产品的功能,不涉及产品的安全控制。
    ● B类软件:软件的设计要防止电子设备的不安全操作。
    ● C类软件:软件的设计为了避免某些特殊的危险。
本文主要介绍针对其中B类软件而开发的CLASSB软件包,因为安全库相关代码操作基本不涉及到具体外设IP,所以软件包中的example只以AT-START-F403A开发板为例。

2 程序结构说明
Class B软件包程序检测内容分为两个主要部分:启动时的自检和运行时的周期自检,总体流程框图如下


理论上,当自检模块集成添加到应用程序中时,用户需要提供以下步骤:
    ● 在用户程序启动之前执行启动前的初始检测
    ● 在用户程序执行过程中,进行周期性的检测
    ● 程序运行时,设置看门狗并及时喂狗防止复位
    ● 对RAM和FLASH在初始阶段和运行阶段的测试,设置合适的测试区域
    ● 对于self_test测试发生的错误,以及其他hardfault等错误,需要进行合理的安全处理
当在启动时的测试期间,如果程序启用了调试信息,因为一些外设接口驱动程序可能会用到一些变量,在进行完内存测试后,内存中的内容可能会丢失,所以需要用户保证恢复这些变量。
当程序运行时,在程序中由变量TimeBaseFlag决定何时进行检测,周期性的检测时间间隔用户可以根据自己应用进行调整。
为了初始化周期性检测设置,用户必须在主循环之前调用SelfTest_StartUp(),然后在进入主循环后调用SelfTest_DoRunTimeChecks()进行周期自检。周期时基是采用1mssystick中断,每10ms执行一次自检,具体时间间隔用户可根据应用修改。
注意:因为运行时如果自检程序耗时太长,会影响正常应用程序的进行,所以可以将自检流程进行拆分,用systick中断进行周期性的自检。
2.1 启动时检测流程
启动时检测包括:
     CPU检测
     看门狗检测
     Flash完整性检测
     RAM功能检测
     系统时钟检测
     控制流检测
下图是执行启动时自检的流程框图。



2.1.1 CPU 启动时检测
CPU自检主要检查内核标志、寄存器和堆栈指针等是否正确。如果发生错误,就会调用故障安全处理函数FailSafeHandle ()。该部分检测源代码是用汇编所写,在KEILIAP环境有差异。流程框图如


2.1.2 看门狗启动时检测
测试通过判断复位状态寄存器的标识来判断是否执行成功,测试完后清除所有标志位,框图如下


2.1.3 FLASH 启动时检测
FLASH自检是程序中将flash数据用CRC算法计算,将结果值跟编译时已存储在FLASH指定位置的预先计算好的CRC值进行比较,框图如下


其中CRC计算的FLASH范围根据整个程序的实际情况进行配置,方法在KEIL和IAR上有所不同。
KEIL:
ARM官方对于ROM Self-Test in MDK-ARM有推荐使用第三方软件SRecord进行CRC测试。
工程中脚本文件srecord_crc32.bat调用srec_cat.exe,将KEIL编译生成的AT32F403A_SelfTest.hex文件中的数据进行CRC计算,生成CRC chec_sum,合并到新的AT32F403A_SelfTest_checked.hex文件中。
注意:计算CRC值的范围根据应用程序的实际大小确定,生成的CRC chec_sum存储地址需位于FLASH空白区。

图keil 选项中添加 bat

脚本文件内容


不论是在下载还是调试中,都需要用最终生成的AT32F403A_SelfTest_checked.hex代替原来的AT32F403A_SelfTest.hex,所以在KEIL配置选项中需添加ini文件用于加载新的HEX文件。如图keil 选项加载 ini 文件


IAR
IAR配置选项中支持CRC计算,只需要配置好参数,编译生成的文件就会自动将CRC check_sum值添加到选定FLASH计算范围后面,如图IAP 配置 CRC

2.1.4 RAM 启动时检测
测试时分6个循环,用值0x00和0xFF逐字交替检查和填充整个RAM,前3个循环按照地址递增执行,3个循环按照地址递减执行。整个RAM检测算法流程如下图所示:

2.1.5 时钟启动时检测
先启动内部低速时钟源(LSI),然后启动外部高速时钟源(HSE),通过PLL设置为系统时钟。初始化一个专用的定时器,用于交叉测量由预先定义的LSI周期数控制的HSE频率。该定时器的两个最终捕获值之间的差值给出了LSIHSE频率的比例。捕获值的处理在定时器中断中处理。将该比例值与预期的范围值进行比较:如果超过25%,则测试失败。预期范围值由用户自己根据应用调整,宏定义HSE_LimitHigh()HSE_LimitLow()时钟启动时检测流程图如下

2.1.6 控制流启动时检测
开机自检部分以控制流检测指针程序结束。
2.2 运行时周期检测流程
如果启动时的自检成功通过,并且标准初始化也完成了,运行时的周期自检必须在进入主循环之前进行初始化。
运行时的检测是以systick作为时基,进行周期性的检测。
运行时周期检测包括:
     局部CPU内核寄存器检测
     堆栈边界溢出检测
     系统时钟运行检测
     Flash CRC分段检测
     看门狗检测
     局部RAM自检(在中断服务程序中进行)
运行时周期自检及中断服务流程结构图如下所示


2.2.1 CPU 运行时检测
CPU运行时周期自检跟启动时的自检类似,只是不检测内核标志和堆栈指针。流程图如下

2.2.2 堆栈边界运行时溢出检测
该测试通过存储在为堆栈保留的空间顶部的Magic pattern完整性来检测堆栈是否溢出。如果原始pattern被破坏,则测试失败,调用故障安全程序。
Pattern放置在为堆栈区域保留的最低地址。这一区域根据设备可以有不同的配置。用户必须为堆栈定义足够的区域,并保证pattern正确放置。流程图如下

2.2.3 系统时钟运行时检测
运行时系统时钟的检测跟启动时时钟检测类似,流程图如下

2.2.4 Flash CRC 运行时检测
运行时进行Flash CRC的自检,因为检测范围不同耗时不同,可以根据用户应用程序大小配置分段CRC计算,当计算到最后一段范围时,进行CRC值比较,如果不一致则测试失败。流程如下

2.2.5 看门狗运行时检测
运行时需要定期喂狗保证系统正常运行,看门狗喂狗的部分放置在SelfTest_DoRunTimeChecks()最后部分。
2.2.6 局部 RAM 自检
运行时的RAM自检是在systick中断函数中进行的。测试只覆盖分配给CLASS B变量的那部分内存。流程如下

2.3 软件 demo 演示
软件demo中安全库的例程主要有两个部分:
1) SW_SelfTest为工程文件,KEIL采用的是V5.18版本,IAR采用的V7.4版本。
2) AT32_CLASSB_Library为安全库函数文件。
    ● 程序运行基于AT32 BSP V1.2.2,用户使用其他BSP版本必须保证为V1.1.9及以上。
    ● Demo运行基于F403A芯片,运行在AT-START-F403A V1.0开发板。
    ● SW_SelfTest 路径为:
IEC_60730_CLASSB_demo\Project\SW_SelfTest
    ● AT32_CLASSB_Library 路径为:
IEC_60730_CLASSB_demo\Middlewares\AT32_CLASSB_Library


KEIL 运行打印信息如下



IAR 运行打印信息如下









AN0041_AT32_IEC 60730_CLASSB_LIB_ZH_V2.0.0.pdf

1002.56 KB

文档

AN0041_AT32_IEC 60730_CLASSB_LIB_V2.0.0.zip

3.07 MB

代码

使用特权

评论回复
沙发
fcccc| | 2021-3-17 12:37 | 只看该作者
不支持421?

使用特权

评论回复
板凳
muyichuan2012| | 2021-3-18 08:32 | 只看该作者
必须支持421,这是以前的帖子,支持421的帖子在下面链接。
https://bbs.21ic.com/icview-3070354-1-1.html?_dsign=9c43166c

使用特权

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

本版积分规则

178

主题

266

帖子

8

粉丝