外部复位导致MCU内部复位失效
问题详细描述为了方便在板卡板卡复位,我们的硬件工程师在做单板设计时,把MCU的复位IO 连接了到FPGA,可以通过FPGA来复位板卡的MCU。但是测试时发现,如果是单板状态,可以顺利下载固件,但是如果是集成情况下无法正常下载固件,且看门狗复位也受影响。
https://api.fanyedu.com/uploads/image/29/efd8a6e6961feaa3879047e5168b4d.jpg
问题具体分析
出现这个问题后,首先想到的是可能是芯片复位信号受影响了,因为使用调试器通过SWD接口下载固件时需要硬件复位或者软件复位的方式复位MCU。 而这个信号又受FPGA控制(强制拉高),在下载的场景可能会复位失败。
因此查看了STM32 Reference manual RM0008 Page 91 Power Reset 章节,仔细看了内部复位框图后找到了答案。从下图可以看到 STM32 MCU 的NRST 是一个双向接口,在内部复位电路产生复位动作时,会输出一个低电平的信号;如果这个时候FPGA输出的是高电平,则信号会发生冲突
https://api.fanyedu.com/uploads/image/83/a985d43b9eb82d5f164e88793281c4.jpg
问题解决方案
因为FPGA的IO 无法配置为Open-Drain输出,只能配置为Push-pull推挽输出,导致当需要主动复位时,无法将NRST信号拉低,因此只能把FPGA 复位MCU的功能去掉,即把MCU外部复位控制信号断开(R112电阻 空贴)。
总结和建议
外部IC 连接NRST 信号导致MCU 内部复位信号失效的问题是由于STM32 MCU 的NRST 引脚结构引起的,如果设计使用外部复位的方式,最好使用Open-Drain输出,否则容易出现我遇设计中遇到的问题。
检查复位引脚 的上拉/下拉电阻是否符合规格 在软件中动态配置GPIO,当需要输出低电平时,配置GPIO输出低电平;当需要输出高电平时,配置GPIO为输入下拉模式,释放NRST控制,让MCU的上拉电阻自动将NRST电平拉高。 信号冲突可能导致大电流,应注意保护电路,防止器件损坏 当内部复位电路产生复位动作时,该引脚会输出低电平信号。若此时外部复位信号为高电平,信号就会发生冲突,导致内部复位信号无法正常生效。 复位信号受干扰 如果外部复位电路中没有正确连接上拉电阻,或者上拉电阻的阻值选择不当,可能会导致复位引脚的电平不稳定。在外部复位信号撤销后,复位引脚可能无法及时回到正确的高电平状态,从而影响MCU的内部复位操作。 MCU的特殊功能寄存器中可能有一些与复位相关的控制位,如果这些控制位设置不正确,可能会影响MCU对外部复位信号的响应。 如果外部复位导致MCU内部复位失效的问题是由于复位引脚特性引起的,那么可以考虑断开外部复位控制信号。即,将MCU的复位引脚与外部设备断开连接。 如果怀疑MCU本身存在硬件故障,可以尝试更换MCU进行测试。 可以在外部设备和MCU的复位引脚之间增加一个二极管或其他电路元件,以保护复位引脚不受外部设备高电平的影响。 在复位电路中,去耦电容的作用是非常重要的。如果去耦电容的容值选择不当或者位置不合理,可能会导致电源电压的波动,从而影响复位信号的稳定性。 在硬件电路中加入 二极管隔离 或 逻辑门控制,避免信号冲突。 MCU的内部复位功能可能需要通过软件进行配置,如果配置错误,可能导致内部复位失效。 外部复位信号可能受到干扰,导致复位信号不稳定,从而影响了内部复位的正常工作。 MCU的复位引脚可能配置错误,或者外部复位电路设计不当,导致内部复位电路没有被正确触发。 复位引脚可能受到 EMI 或高频噪声干扰,导致误触发或无法触发。 如果外部复位电路的驱动能力不足,无法提供足够的电流来确保复位引脚的电平能够稳定地保持在低电平状态,就会导致复位信号不稳定。特别是在MCU内部负载较大或者电源电压不稳定的情况下,这种问题可能会更加明显。 优化电源滤波 在某些情况下,可以通过软件配置来解决外部复位导致MCU内部复位失效的问题。