解决方案
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 天以上的压力测试,系统运行正
常。
|