类型 | 详细类型 | 内容 | 详细检测流程 | 其它处理要求 | 测试方案 | |
启动时检测 | CPU检测 | 主要检查内核标志、寄存器和堆栈指针等是否正确 | 检测内核标志和堆栈指针。分别对寄存器R0~R12进行加、减、写入AA、写入55等操作,根据结果是否大于0、小于0、相等、是否进位标志变化等判断是否异常。对状态寄存器进行读操作、写操作。操作前先把寄存器中内容读出暂存到其他寄存器,做现场保护,检测完之后再赋回去 | | 仿真 | |
| 控制流检测
(控制流测点1(RAM初始化前)检测
控制流测点2(进主程序前)检测) | 开机自检部分以控制流检测指针程序结束。 | 和CPU一起检测,寄存器加载,数据存储到内存 | | | |
| 堆栈边界溢出检测 | 该测试通过存储在为堆栈保留的空间顶部的Magic pattern完整性来检测堆栈是否溢出。如果原始pattern被破坏,则测试失败,调用故障安全程序。
Pattern放置在为堆栈区域保留的最低地址。这一区域根据设备可以有不同的配置。用户必须为堆栈定义足够的区域,并保证pattern正确放置。 | 和CPU一起检测,4字节对齐,存和取。操作前先把寄存器中内容读出暂存到其他寄存器,检测完之后再赋回去 | | 仿真 | |
| 看门狗检测 | 通过判断复位状态寄存器的标识来判断是否执行成功 | 通过代码一直等待直到复位后再进行寄存器读取判断。检测过程中有复位操作。 | | 屏蔽喂狗,看代码运行是否复位报故障码 | |
| 系统时钟检测
(内部/外部晶振检测
内部/外部晶振锁相环检测
PLL锁相环切换检测
时钟频率检测) | 先启动内部低速时钟源(LSI),然后启动外部高速时钟源(HSE),通过PLL设置为系统时钟。初始化一个专用的定时器TIM14,用于交叉测量由预先定义的LSI周期数控制的HSE频率。该定时器的两个最终捕获值之间的差值给出了LSI和HSE频率的比例。捕获值的处理在定时器中断中处理。将该比例值与预期的范围值进行比较:如果超过25%,则测试失败。 | 系统默认使用的是LSI,当HSE异常时仍会使用LSI,不进行时钟切换 | | 外部晶振短接,看是否报故障码 | |
| RAM 检测 | 用值0x00和0xFF逐字交替检查和填充整个RAM,前3个循环按照地址递增执行,后3个循环按照地址递减执行 | (0x20000000~0x2000BFEF),用值0x55和0xAA逐16字节交替填充检查和整个RAM,连续多遍,仅留最后16字节用作必要数据的暂存缓存,现场保护和恢复 | | 忽略 | |
| FLASH存储完整性CRC检测 | 将flash数据用CRC算法计算,将结果值跟编译时已存储在FLASH指定位置的预先计算好的CRC值进行比较,如果不一致则测试失败。 | 芯片CRC外设寄存器读写检测,代码区CRC值对比 | | 更改hex文件看是否报故障码 | |
| | | | | | |
运行时周期检测 | CPU寄存器检测 | CPU运行时周期自检跟启动时的自检类似,只是不检测内核标志和堆栈指针。 | | 如果当前电机转速高于转折速度,控制器进入ASC状态;
如果电机转速低于转折速度,关闭MOSFET; | 仿真 | 在View中选择打开Registers Window,即可在窗口中查看内核中寄存器的值 |
| 堆栈边界溢出检测 | 该测试通过存储在为堆栈保留的空间顶部的Magic pattern完整性来检测堆栈是否溢出。如果原始pattern被破坏,则测试失败,调用故障安全程序。
Pattern放置在为堆栈区域保留的最低地址。这一区域根据设备可以有不同的配置。用户必须为堆栈定义足够的区域,并保证pattern正确放置。 | 内存是否被篡改。存储在仅仅用作栈的地址,栈底部地址0x2000BBE0,大小0x410未初始化的分区内,定义buf[4]的值是否和初始化时相同来判断,不同则报故障。 | 如果当前电机转速高于转折速度,控制器进入ASC状态;
如果电机转速低于转折速度,关闭MOSFET; | 仿真 | |
| 系统时钟检测
(内部/外部晶振检测
内部/外部晶振锁相环检测
PLL锁相环切换检测) | 跟启动时检测类似。初始化一个专用的定时器TIM14,用于交叉测量由预先定义的LSI周期数控制的HSE频率。该定时器的两个最终捕获值之间的差值给出了LSI和HSE频率的比例。捕获值的处理在定时器中断中处理。将该比例值与预期的范围值进行比较:如果超过25%,则测试失败。 | | 如果电机转速低于10RPM,关闭MOSFET; | 外部晶振短接,看是否报故障码 | HSE异常时切换到LSI |
| FLASH存储完整性CRC检测 | 跟启动时检测类似 | | 如果当前电机转速高于转折速度,控制器进入ASC状态;
如果电机转速低于转折速度,关闭MOSFET; | 更改hex文件看是否报故障码 | |
| 看门狗检测 | 运行时需要定期喂狗保证系统正常运行 | | 进入跛行模式; | 屏蔽喂狗,看代码运行是否复位报故障码 | |
| RAM 检测(CLASS b变量检测) | 测试只覆盖分配给CLASS B变量的那部分内存。 | 也称为CLASS b变量RAM自检,用36字节的0x20000030~ 0x20000053地址内容。两个互相取反变量,判断是否和对方的取反相等,不等则报故障 | 如果当前电机转速高于转折速度,控制器进入ASC状态;
如果电机转速低于转折速度,关闭MOSFET; | 仿真 | |
| | | | | | |
其他 | | | | | | |
| 自检耗时,调用频率 | RAM自检和其他自检调用是分开的,目前调用周期都是100ms | | 实测RAM自检耗时6~8us,其他自检总耗时9~11us | 仿真 | |
| CPU、RAM、堆栈故障验证方法 | 检测SRAM可以修改检测地址的内容,CPU可以在仿真的时候修改内核的R寄存器内容,堆栈可以故意让堆栈溢出 | | | 仿真 | |