[控制系统] AT32 B类代码自检设计

[复制链接]
987|0
wahe2008 发表于 2025-9-25 16:27 | 显示全部楼层 |阅读模式

总体设计MCU型号AT32F423RCT7-LQFP64256K48 K字节的SRAM(0xC000)
原始
区域名称起始地址终止地址大小byte变量名称(uint32_t )作用
RAM_BUF0x200000000x2000001F0x20runtime_ram_buf[6 + 2U]RAM运行时检测BUF
RAM_POINTER0x200000200x200000270x08*p_runtime_ram_chk
*p_runtime_ram_chk_inv
RAM运行时检测指针
GAP_AHEAD0x200000280x2000002F0x08gap_for_ram_test_overlay_ahead[2]RAM运行前间隙
CLASSB0x200000300x200000530x24ctrl_flow_cnt
isr_ctrl_flow_cnt
period_val
systick_cnt
time_base_flag
lick_period_flag
last_ctrl_flow_cnt
*p_runtime_crc_chk
reference_crc
CLASS b变量
CLASSB_INV0x200000540x200000770x24ctrl_flow_cnt_inv
isr_ctrl_flow_cnt_inv
period_val_inv
systick_cnt_inv
time_base_flag_inv
lick_period_flag_inv
last_ctrl_flow_cnt_inv
*p_runtime_crc_chk_inv
reference_crc_inv
CLASS b反转变量
0x200000780x2000007F0x08
GAP_BEHIND0x200000800x200000870x08gap_for_ram_test_overlay_behind[2]RAM运行后间隙
CLASSA0x200000880x2000BBDF0xBB58CLASS A正常代码变量RW数据区
STACK_NO_HEAP0x2000BBE00x2000BFEF0x410包括app启动文件0x400大小的stack,和16字节的栈尾溢出自检
RAM_BACKUP0x2000BFF00x2000BFFF0x10栈顶地址,RAM备份,现场恢复
项目更改后
CLASSA0x200000880x2000BBCF0xBB48
STACK_NO_HEAP0x2000BBD00x2000BFDF0x410
RAM_BACKUP0x2000BFE00x2000BFEF0x10
自检变量定义0x2000BFF00x2000BFFD0x0C
升级标志0x2000BFFC0x2000BFFF0x04
类型
详细类型
内容
详细检测流程
其它处理要求
测试方案
启动时检测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寄存器内容,堆栈可以故意让堆栈溢出
仿真











1010668d4fa00bd94f.png
8266668d4fa08c42b9.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:奋斗是一种乐趣,追求是一种动力,助人是一种储蓄,吃亏是一种积累,谦和是一种修养,宽容是一种境界,忍让

24

主题

561

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部