• 正文
  • 相关推荐
申请入驻 产业图谱

极海 MCU 软件 EMC 预防‑恢复全流程固件实施方案

17小时前
48
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1. 整体实施思路

软件 EMC 改造建议按照 “先预防加固,再做故障自动恢复” 顺序落地。

  1. 第一步:做预防技术改造,在运行过程中降低故障发生概率;
  2. 第二步:部署自动恢复机制,就算干扰造成异常,设备可以自主修复;
  3. 第三步:整机测试,模拟 EMC 干扰工况验证整套逻辑有效性;

注意:软件方案不能替代硬件 PCB、电源、屏蔽等硬件 EMC 设计。

资料获取:AN1117_增强微控制器电磁兼容性(EMC)的软件技术

2. 自动恢复技术模块分步实施

2.1 复位源识别标记实现

  1. 固件复位启动入口,最先读取复位状态寄存器;
  2. 解析复位标记,区分 POR 上电复位、LVD 复位、看门狗复位、寄生热复位;
  3. POR 上电复位:执行完整全部外设、全局变量初始化;
  4. LVD 复位:优先执行电源状态判断、电源管理逻辑;
  5. 看门狗 / 寄生热复位:跳过完整初始化流程,直接执行故障状态恢复、错误统计,跳转主业务循环; 参考逻辑流程图:文档图 1 复位源识别流程。

2.2 非易失 EEPROM 数据保护实施

  1. 关键业务参数,在 EEPROM 至少保存 2 份独立副本;
  2. 每一份数据增加校验和或者时间戳标记;
  3. 每次上电读取参数的时候,必须校验校验和;如果副本 A 损坏,自动切换读取副本 B;两份全部损坏,加载出厂默认参数;
  4. 避免高频频繁写 EEPROM,减少写入过程遭遇干扰损坏数据的风险。

2.3 看门狗正确部署

  1. 在系统初始化的早期阶段就使能看门狗,尽可能缩短 “无看门狗保护窗口”;
  2. 喂狗代码只放置在主循环业务路径,禁止放在任何中断服务函数内部;
  3. 不在循环开头无脑喂狗;在每一个关键业务逻辑处理完成之后才执行喂狗;
  4. 超时时间匹配业务最大执行耗时,不要随意设置为最大超时时间。

参考流程图:文档图 2、图 4、图 5、图 6,区分错误和正确实现。

2.4 备份 RAM 业务状态保存恢复

前置条件:确认目标 MCU 硬件具备备份 RAM;普通 RAM 复位后数据丢失,不能使用该方案。

  1. 定义备份 RAM 专属变量,用于保存业务状态标记、关键时序参数;
  2. 业务运行过程中,业务状态发生变更,同步更新备份 RAM 变量;
  3. MCU 复位后,启动恢复程序 CRR 读取备份 RAM 标记;
  4. 根据 RAM 内保存的状态标记,恢复业务动作、时序参数,无需人工介入。

参考流程图:文档图 3 自动恢复软件示例。

3. 预防技术模块分步实施

3.1 中断向量闲置优化

  1. 未使用中断保持 NVIC 使能位关闭;
  2. 保证全部未使用中断都指向 Default_Handler 默认异常处理函数;
  3. 异常处理函数内部可以增加故障计数,用于产品故障日志统计。

3.2 过滤关键字节、非法字节

  1. 编译工程,输出.list 汇编机器码文件;
  2. 检索识别关键字节位置;
  3. 在对应位置插入 NOP 指令,移位机器码,规避 PC 跑飞误触发;
  4. 同样方式处理非法字节序列。

3.3 闲置 Flash 存储区防护

  1. 未使用 Flash 扇区设置为只读属性;
  2. 闲置区域填充未定义指令;
  3. 上电增加程序完整性自检,校验程序段校验和;检测异常进入故障处理。

3.4 IO 输入与 ADC 采样软件抗干扰

  1. IO 引脚逻辑判断,连续多次采样,结果一致才判定电平有效;
  2. ADC 采集:连续多次采样,丢弃明显跳变极值,求取平均值作为有效采样输出。

3.5 寄存器巡检与刷新机制

  1. 将时钟、GPIO、外设配置寄存器列表整理出来;
  2. 在主循环或者周期定时器任务中:读取寄存器,与预期标准值比对;
  3. 如果读取数值和预期不一致,重新写入标准配置,记录故障计数。

3.6 冗余数据存储落地

  • RAM 运行数据:重要变量,采用原值 + 互补值双备份,读取的时候做比对校验;
  • EEPROM 持久化参数:双倍副本 + 校验 / 奇偶校验 / ECC,按需选用;
  • 定期完成主备副本同步。

3.7 数字模块上电复位(V1.1 新增)

在 main 函数最开始初始化位置加入数字模块复位代码,参考 G32M3101 示例:

static void SystemReset(void)
{
/* Reset all digital module */
SCU->APBRST = 0x8477;
SCU->APBRST = 0x00000000U;
SCU->AHBRST = 0x73;
SCU->AHBRST = 0x00000000U;
}

用途:规避 PMU 遭受 EMC 干扰 LDO 电压上漂 > 1.7V 导致数字模块跑飞风险。

4. 常见错误实现清单(文档记录坑点,完整保留)

  1. 看门狗使能太晚,初始化阶段 PC 跑飞,看门狗尚未启动无法捕获故障;
  2. 在中断服务函数里面执行喂狗,主循环卡死依旧持续喂狗,看门狗完全失效;
  3. EEPROM 只存单份关键参数,遭遇干扰写入中断直接参数损坏;
  4. 直接使用普通 RAM 当作复位状态保存区,复位之后数据已经清零;
  5. 寄存器只做初始化,运行全程不再巡检刷新,被干扰篡改之后无法自动复原;
  6. 复位之后不管复位来源,每次都完整全套初始化,拉长故障恢复时间。

5. 固件集成验证建议

  1. 单元模块验证:分别测试复位识别逻辑、看门狗逻辑、EEPROM 校验逻辑、RAM 恢复逻辑;
  2. 整机工况验证:结合 EMC 测试环境,模拟浪涌、静电等干扰,验证设备故障检测、自动恢复行为;
  3. 故障日志建议:增加故障记录,记录复位源、故障次数,方便后期产品现场问题排查。

相关推荐