打印
[STM32H7]

STM32H7 以太网的 MMC 中断

[复制链接]
750|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
STM32H7 以太网的 MMCMAC management counter) 中断是个有点特别的中断。特殊之处
在于它是默认使能。如果我们在代码里不针对
MMC 进行相关处理,就会造成一些异常现象。我
们先来看一个真实的客户案例。
  

使用特权

评论回复
沙发
问天少年|  楼主 | 2021-11-10 13:37 | 只看该作者
客户案例
客户使用 STM32H750 作为主控,与其他设备之间进行以太网通讯。客户在压力测试中发现:
• 设备从第一次通讯开始,累计 7 到 8 天,就会发现 STM32H750 不再响应用户
的请求。
• 客户通过使用 IDE 和添加辅助代码可以发现, STM32H750 会不停地进入以太
网中断,导致所使用的操作系统无法进行有效的系统调度。
• 问题发生后,客户无论拔下网线或者再次连上网线, STM32H750 依然会不停
的进入以太网中断。
• 客户尝试使用 IDE 查看所有以太网寄存器,会发现有时侯能够让系统恢复正
常。

使用特权

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

使用特权

评论回复
地板
问天少年|  楼主 | 2021-11-10 13:38 | 只看该作者

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

使用特权

评论回复
5
问天少年|  楼主 | 2021-11-10 13:38 | 只看该作者

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

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

使用特权

评论回复
6
问天少年|  楼主 | 2021-11-10 13:40 | 只看该作者
MC 中断的特点
MMC 选项其实是默认使能。我们可以从参考手册 RM0433 中看到这一点。

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

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

使用特权

评论回复
7
问天少年|  楼主 | 2021-11-10 13:41 | 只看该作者

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

使用特权

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

以及

这也解释了, 客户为什么发现,通过调试器一个一个去读取以太网寄存器,会在某个操作时让异
常状态恢复到正常。

使用特权

评论回复
9
问天少年|  楼主 | 2021-11-10 13:43 | 只看该作者
.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 天以上的压力测试,系统运行正



使用特权

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

使用特权

评论回复
11
aozima| | 2021-11-10 14:42 | 只看该作者
以前项目中遇到过,ISR处理并清掉就行了。

使用特权

评论回复
12
磨砂| | 2021-12-6 15:33 | 只看该作者
如果不注意的话就会忽略这一点

使用特权

评论回复
13
晓伍| | 2021-12-6 15:48 | 只看该作者
不仔细看真的不容易发现

使用特权

评论回复
14
八层楼| | 2021-12-6 16:05 | 只看该作者
这个中断必须处理好

使用特权

评论回复
15
观海| | 2021-12-6 16:06 | 只看该作者
这种最好在手册上重点说明

使用特权

评论回复
16
tpgf| | 2021-12-6 16:08 | 只看该作者
添加辅助代码需要注意什么呢

使用特权

评论回复
17
guanjiaer| | 2021-12-6 16:11 | 只看该作者
还有其他系列是默认使能的吗

使用特权

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

本版积分规则

57

主题

405

帖子

1

粉丝