打印
[STM32H7]

STM32H7 以太网的 MMC 中断

[复制链接]
742|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LEDyyds|  楼主 | 2021-11-4 14:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用 STM32H750 作为主控,与其他设备之间进行以太网通讯。客户在压力测试中发现:
• 设备从第一次通讯开始,累计 7 到 8 天,就会发现 STM32H750 不再响应用户
的请求。
• 客户通过使用 IDE 和添加辅助代码可以发现, STM32H750 会不停地进入以太
网中断,导致所使用的操作系统无法进行有效的系统调度。
• 问题发生后,客户无论拔下网线或者再次连上网线, STM32H750 依然会不停
的进入以太网中断。
• 客户尝试使用 IDE 查看所有以太网寄存器,会发现有时侯能够让系统恢复正
常。  

使用特权

评论回复
沙发
LEDyyds|  楼主 | 2021-11-4 14:31 | 只看该作者
分析
系统不停的进入以太网中断,说明某个中断在被某种条件下被不停的触发,或者中断触发后没有
被处理。进一步,当系统出现异常状况后,拔掉网线,中断依然不断的进入,说明该异常并不需
要外界不停的输入,也就说明可能是中断没有被处理所导致。所以,客户首先想到的是补全所有
使能的以太网中断的清除代码。然而,客户再次测试,却发现累计 7 到 8 天,问题再次发生。
在这种情况下,为了深刻了解该状况的原因,我们建议客户,抓取异常时的寄存器现场,然后和
正常状态时的寄存器进行对比。我们在设备未发生异常前,抓取了以太网的三组寄存器 DMA、
MTL 和 MAC。同时,我们在发生异常后,在同一设备再次进行这三组寄存器的抓取。然后,我
们使用文本比较工具,对两次的寄存器进行比较。我们很快就可以发现, MAC 寄存器存在值得
关注的差异。 MAC 寄存器对比如下:

我们可以看到在系统异常情况下下, MMCRXIS 和 MMCIS 被置位了。
我们从参考手册 RM0433 (STM32H742, STM32H743/753 and STM32H750 Value line
advanced Arm®-based 32-bit MCUs)(直接搜索关键子 MMCRXIS) 中可以看到 MMCRXIS 和
MMCIS 表示系统收到了 MMC 接收中断。

在两次三组寄存器的比较中, 我们看到系统生成了 MMC 接收中断(MMC_RX_INTERRUPT 中
RXUCGPIS)。这个符合前文的 MMCRXIS 和 MMCIS 的状态。  


从参考手册 RM0433 中我们可以看到,只要 MMC 选项使能,该中断标志就为有效。但是我们并
没有使能 MMC 选项,甚至我们都没有使能 MMC 中断,为什么还是有中断产生呢?


使用特权

评论回复
板凳
LEDyyds|  楼主 | 2021-11-4 14:35 | 只看该作者
MMC 中断的特点
MMC 选项其实是默认使能。我们可以从参考手册 RM0433 中看到这一点。  


在 MMC 默认使能的情况下,什么情况下会产生中断呢?
让我们在 RM0433 里搜索下两次寄存器比较发现的 RXUCGPIS 寄存器:

我们可以看到 MMC 接收中断会在统计值最大的一半或者最大值时会产生。 这也和 MMC RX
interrupt register 开始的说明描述一致。

综合这两点, 我们可以认为, 在长时间以太网收发包之后, MMC 中断几乎一定会发生。 这符合
客户案例的场景,例如,重现这个问题需要 7 到 8 天。 当然从这里我们也可以推断出,我们如果
加快测试数据包收发的发送, MMC 中断会发生更早。 那么,如何避免在产品应用中这种问题发
生呢?


使用特权

评论回复
地板
LEDyyds|  楼主 | 2021-11-4 14:37 | 只看该作者
解决方案
1.1. 使用 MMC 中断
MMC 中断是个有用的功能。如果我们要使用的话, 可以参考 MMC Rx interrupt register
(ETH_MMC_RX_INTERRUPT)MMC Tx interrupt register (ETH_MMC_TX_INTERRUPT)
描述。 我们需要对
MMC 进行一个读的操作。  


这也解释了, 客户为什么发现,通过调试器一个一个去读取以太网寄存器,会在某个操作时让异
常状态恢复到正常。
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\I
nclude\stm32h750xx.h:
#define ETH ((ETH_TypeDef *)ETH_BASE)
也就是说,如果你的工程时源自 STM32Cube 例程,你应该能够加入以上代码并且能够成功运
行。
在加入上述代码或者类似操作后,客户反馈,再次进行超过 7 天以上的压力测试,系统运行正
常。


使用特权

评论回复
5
LEDyyds|  楼主 | 2021-11-4 14:37 | 只看该作者
总结
STM32H7 MMC 中断需要加以注意,如果不使用 MMC,需要确保它已经关闭;否则在经过长
时间网络收发后,系统会产生并不是用户期望的中断,导致系统假死。另外,我们也看到了调试
STM32 以太网的常规方式,也就是借助工具而不需要写代码就可以进行寄存器的比较。这种方
法值得使用
STM32 以太网的用户进行调试时参考。  

使用特权

评论回复
6
磨砂| | 2021-12-2 11:48 | 只看该作者
这是一种什么中断方式呢

使用特权

评论回复
7
wowu| | 2021-12-2 12:09 | 只看该作者
重新上电能好使吗

使用特权

评论回复
8
xiaoqizi| | 2021-12-2 12:10 | 只看该作者
这个周期是固定的吗

使用特权

评论回复
9
木木guainv| | 2021-12-2 12:14 | 只看该作者
如何避免被异常情况开启呀

使用特权

评论回复
10
tpgf| | 2021-12-2 12:15 | 只看该作者
这种中断在什么情况下会发生呢都

使用特权

评论回复
11
晓伍| | 2021-12-2 12:35 | 只看该作者
如何解决这种假死呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

119

主题

841

帖子

1

粉丝