前言 STM32H7 以太网的 MMC(MAC management counter)中断是个有点特别的中断。特殊之处在于它是默认使能。如果我们在代码里不针对 MMC 进行相关处理,就会造成一些异常现象。我们先来看一个真实的客户案例。 客户案例 客户使用 STM32H750 作为主控,与其他设备之间进行以太网通讯。客户在压力测试中发现: ·设备从第一次通讯开始,累计 7 到 8 天,就会发现 STM32H750 不再响应用户的请求。 ·客户通过使用 IDE 和添加辅助代码可以发现,STM32H750 会不停地进入以太网中断,导致所使用的操作系统无法进行有效的系统调度。 ·问题发生后,客户无论拔下网线或者再次连上网线,STM32H750 依然会不停的进入以太网中断。 ·客户尝试使用 IDE 查看所有以太网寄存器,会发现有时侯能够让系统恢复正常。 分析 系统不停的进入以太网中断,说明某个中断在被某种条件下被不停的触发,或者中断触发后没有被处理。进一步,当系统出现异常状况后,拔掉网线,中断依然不断的进入,说明该异常并不需要外界不停的输入,也就说明可能是中断没有被处理所导致。所以,客户首先想到的是补全所有使能的以太网中断的清除代码。然而,客户再次测试,却发现累计 7 到 8 天,问题再次发生。在这种情况下,为了深刻了解该状况的原因,我们建议客户,抓取异常时的寄存器现场,然后和正常状态时的寄存器进行对比。我们在设备未发生异常前,抓取了以太网的三组寄存器 DMA、MTL 和 MAC。同时,我们在发生异常后,在同一设备再次进行这三组寄存器的抓取。然后,我们使用文本比较工具,对两次的寄存器进行比较。我们很快就可以发现,MAC 寄存器存在值得关注的差异。MAC 寄存器对比如下:
▲图 1 MAC 寄存器对比 我 们 从 参 考 手 册 RM0433 (STM32H742, STM32H743/753 and STM32H750 Value line advanced Arm®-based 32-bit MCUs)(直接搜索关键子 MMCRXIS)中可以看到MMCRXIS 和MMCIS 表示系统收到了MMC 接收中断。
▲图 2 MMCRXIS 与 MMCIS 置位的含义 在两次三组寄存器的比较中,我们看到系统生成了 MMC 接收中断(MMC_RX_INTERRUPT 中RXUCGPIS)。这个符合前文的MMCRXIS 和MMCIS 的状态。
▲图 3 MMC_RX_INTERRUPT 的比较 MMC 中断的特点 MMC 选项其实是默认使能。我们可以从参考手册 RM0433 中看到这一点。
▲图 4 MAC management counters 在 MMC 默认使能的情况下,什么情况下会产生中断呢? 让我们在 RM0433 里搜索下两次寄存器比较发现的 RXUCGPIS 寄存器:
▲图 5 RXUCGPIS 我们可以看到MMC 接收中断会在统计值最大的一半或者最大值时会产生。这也和MMC RX interrupt register 开始的说明描述一致。
▲图 6 MMC Receive Interrupt 的条件 综合这两点,我们可以认为,在长时间以太网收发包之后,MMC 中断几乎一定会发生。这符合客户案例的场景,例如,重现这个问题需要 7 到 8 天。当然从这里我们也可以推断出,我们如果加快测试数据包收发的发送,MMC 中断会发生更早。那么,如何避免在产品应用中这种问题发生呢? 解决方案 1.1.使用MMC 中断 MMC 中断是个有用的功能。如果我们要使用的话,可以参考 MMC Rx interrupt register(ETH_MMC_RX_INTERRUPT)和 MMC Tx interrupt register (ETH_MMC_TX_INTERRUPT)的描述。我们需要对MMC 进行一个读的操作。
▲图 7 MMC Receive Interrupt 清除的方法 以及
▲图 8 MMC Transmit Interrupt register 清除的方法 这也解释了,客户为什么发现,通过调试器一个一个去读取以太网寄存器,会在某个操作时让异常状态恢复到正常。 1.2. 关闭 MMC 中断 在很多情况下,MMC 中断对实际产品没有意义。例如,在这个案例中,我们可以选择关闭 MMC中断。这就需要用到 MMC 中断的 mask 寄存器: MMC Rx interrupt mask register (ETH_MMC_RX_INTERRUPT_MASK) MMC Tx interrupt mask register (ETH_MMC_TX_INTERRUPT_MASK) 我们可以添加以下代码到我们的应用代码里 ETH->MMCRIMR = ETH_MMCRIMR_RXLPITRCIM | ETH_MMCRIMR_RXLPIUSCIM | ETH_MMCRIMR_RXUCGPIM | ETH_MMCRIMR_RXALGNERPIM | ETH_MMCRIMR_RXCRCERPIM; ETH->MMCTIMR = ETH_MMCTIMR_TXLPITRCIM | ETH_MMCTIMR_TXLPIUSCIM | ETH_MMCTIMR_TXGPKTIM | ETH_MMCTIMR_TXMCOLGPIM | ETH_MMCTIMR_TXSCOLGPIM; 客户反馈找不到 ETH 的定义。其实在 STM32H7 的例程里,我们可以很容易发现 ETH 定义在STM32Cube\Repository\STM32Cube_FW_H7_V1.8.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h750xx.h: #define ETH ((ETH_TypeDef *)ETH_BASE) 也就是说,如果你的工程时源自 STM32Cube 例程,你应该能够加入以上代码并且能够成功运行。 在加入上述代码或者类似操作后,客户反馈,再次进行超过 7 天以上的压力测试,系统运行正常。 总结 STM32H7 的 MMC 中断需要加以注意,如果不使用 MMC,需要确保它已经关闭;否则在经过长时间网络收发后,系统会产生并不是用户期望的中断,导致系统假死。另外,我们也看到了调试STM32 以太网的常规方式,也就是借助工具而不需要写代码就可以进行寄存器的比较。这种方法值得使用 STM32 以太网的用户进行调试时参考。 |
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
【福利三:逢7发帖赢大礼】使用惠勤致远STM32H743VI开发板+ST7796并口彩屏移植LVGL9.5并分享一些额外内容
【 逢7发帖赢大礼】7、TouchGFX中实现云彩流动效果
【 逢7发帖赢大礼】6、TouchGFX中添加图像素材和自定义代码编辑
【 逢7发帖赢大礼】5、TouchGFX 创建自定义界面和交互
【 逢7发帖赢大礼】4、CubeMX工程复用以及TouchGFX应用
【 逢7发帖赢大礼】3、利用CubeMX添加TouchGFX功能:工程修改和编译烧录
【 逢7发帖赢大礼】2、利用CubeMX添加TouchGFX功能:CubeMX配置
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
CubeMX生成CubeIDE工程代码乱码
微信公众号
手机版