马上注册,结交更多电磁兼容工程师,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
正如前面在电气快速瞬变 (EFT) 抗扰度 IEC 61000-4-4 中所讨论的,最常见的由于 EFT 事件的保护和/或设计不佳的电路导致的问题是:
• CPU 或系统复位(最常见)
• 通讯错误或故障
• 闩锁【闩锁效应(Latch-up)是CMOS集成电路中一个重要的问题,这种问题会导致芯片功能的混乱或者电路直接无法工作甚至烧毁。】
• 内存损坏
在保护不佳的设计中,EFT 事件最常见的结果是 CPU 复位。大多数 CPU 都有多种复位机制,例如外部硬件复位、欠压复位 (BOR)、低电压某些器件上的检测 (LVD) 复位和上电复位 (POR)。每个的触发条件这些复位各不相同,但应用软件面临的挑战是确定复位是否在问题是正常发生的,例如在典型的例行上电或 EFT 事件中。有在软件保护方面没有绝对,但以下是一些常识“最好实践”要考虑。在本节的最后是一个固件技术,使用户应用程序来确定 POR 或 BOR 是由 EFT 事件还是由正常上电引起的顺序。
失控代码保护
WDT 可用于指示失控代码事件并从中恢复,例如由于 EFT 事件可能发生的情况。
1. 使用尽可能短的 WDT 超时周期,以确保失控状态不会持续很长时间。
2. 在主循环中只使用一次 WDT 刷新操作,不要中断服务程序,除非主循环执行周期大于 WDT 超时,在这种情况下,WDT 刷新应该在主循环中以大约相等的间隔放置。
3. 使用多个 RAM 质询令牌密钥来决定是否刷新 WDT,而不仅仅是一个位。
令牌密钥
使用质询 RAM 持久令牌密钥保护关键子例程和 WDT 刷新免受代码失控事件的影响,这将有助于防止出现失控的代码执行。
注意: 持久变量是在编译器运行时初始化例程重置时不会自动初始化的变量。 编译器运行时初始化例程是一个例程,链接器作为前缀附加到用户对象和 hex 文件中,这在用户的源代码中是不可见的。这种变量类型的优点是不会被重置事件预初始化。 它允许用户代码评估并决定是否以及何时在运行时初始化变量; 例如,基于 EFT 引起的复位,而不是典型的启动复位。
下图显示了 _persistent unsigned int token_sub_x,token_sub_y, token_sub_z;.
_persistent unsigned int token_sub_x,
1. 为所有异常错误创建 ISR,例如非法操作码、未对齐地址、无效内存地址等。
2. 为每种异常类型创建持久变量,并在进入异常 ISR 时使用用户选择的唯一值初始化持久变量。 在 MPLAB XC32 C/C++ 编译器中PIC32 器件,编译器会自动使用 while(1) 填充所有用户未定义的异常。
注意: 在大多数 CPU 中,异常 ID 寄存器是永久性硬件寄存器,不会在任何复位时清除。 请查看相应的 CPU 数据表或软件用户指南以获得说明。 如果您的 CPU 具有持久的硬件异常 ID 寄存器,请忽略使用示例的软件异常 RAM 令牌密钥部分,如下所示。
3. 在 WDT CPU 复位时,检查是否发生任何异常作为可能的 EFT 事件,并且酌情处理。
Exception Example _persistent unsigned int exception_x, exception_y, exception_z;
填充未使用的程序存储器
在由于 EFT 事件导致 CPU 执行出错并进入未使用的程序内存空间的情况下,用户应考虑使用陷阱指令序列填充未使用的程序内存以停止失控代码,并允许 WDT 时间- 出来并重置。 有多种方法可以做到这一点,作为建议,请查阅您的开发工具手册或编译器用户手册,了解可能有编译器宏可用的情况。
|