1、前言
STM32H7 以太網的 MMC(MAC management counter)中斷是個有點特別的中斷。特殊之處在于它是默認使能。如果我們在代碼里不針對 MMC 進行相關處理,就會造成一些異?,F(xiàn)象。我們先來看一個真實的客戶案例。
2、客戶案例
客戶使用 STM32H750 作為主控,與其他設備之間進行以太網通訊。
客戶在壓力測試中發(fā)現(xiàn):
? 設備從第一次通訊開始,累計 7 到 8 天,就會發(fā)現(xiàn) STM32H750 不再響應用戶的請求。
? 客戶通過使用 IDE 和添加輔助代碼可以發(fā)現(xiàn),STM32H750 會不停地進入以太網中斷,導致所使用的操作系統(tǒng)無法進行有效的系統(tǒng)調度。
? 問題發(fā)生后,客戶無論拔下網線或者再次連上網線,STM32H750 依然會不停的進入以太網中斷。
? 客戶嘗試使用 IDE 查看所有以太網寄存器,會發(fā)現(xiàn)有時侯能夠讓系統(tǒng)恢復正常。
3、分析
系統(tǒng)不停的進入以太網中斷,說明某個中斷在被某種條件下被不停的觸發(fā),或者中斷觸發(fā)后沒有被處理。進一步,當系統(tǒng)出現(xiàn)異常狀況后,拔掉網線,中斷依然不斷的進入,說明該異常并不需要外界不停的輸入,也就說明可能是中斷沒有被處理所導致。所以,客戶首先想到的是補全所有使能的以太網中斷的清除代碼。然而,客戶再次測試,卻發(fā)現(xiàn)累計 7 到 8 天,問題再次發(fā)生。
在這種情況下,為了深刻了解該狀況的原因,我們建議客戶,抓取異常時的寄存器現(xiàn)場,然后和正常狀態(tài)時的寄存器進行對比。我們在設備未發(fā)生異常前,抓取了以太網的三組寄存器 DMA、 MTL 和 MAC。同時,我們在發(fā)生異常后,在同一設備再次進行這三組寄存器的抓取。然后,我們使用文本比較工具,對兩次的寄存器進行比較。我們很快就可以發(fā)現(xiàn),MAC 寄存器存在值得關注的差異。MAC 寄存器對比如下:

我們可以看到在系統(tǒng)異常情況下下,MMCRXIS 和 MMCIS 被置位了。
我們從參考手冊 RM0433 (STM32H742, STM32H743/753 and STM32H750 Value line advanced Arm-based 32-bit MCUs)(直接搜索關鍵子 MMCRXIS)中可以看到 MMCRXIS 和 MMCIS 表示系統(tǒng)收到了 MMC 接收中斷。

在兩次三組寄存器的比較中,我們看到系統(tǒng)生成了 MMC 接收中斷(MMC_RX_INTERRUPT 中 RXUCGPIS)。這個符合前文的 MMCRXIS 和 MMCIS 的狀態(tài)。

從參考手冊 RM0433 中我們可以看到,只要 MMC 選項使能,該中斷標志就為有效。但是我們并沒有使能 MMC 選項,甚至我們都沒有使能 MMC 中斷,為什么還是有中斷產生呢?
4、MMC 中斷的特點
MMC 選項其實是默認使能。我們可以從參考手冊 RM0433 中看到這一點。

在 MMC 默認使能的情況下,什么情況下會產生中斷呢?
讓我們在 RM0433 里搜索下兩次寄存器比較發(fā)現(xiàn)的 RXUCGPIS 寄存器:

綜合這兩點,我們可以認為,在長時間以太網收發(fā)包之后,MMC 中斷幾乎一定會發(fā)生。這符合客戶案例的場景,例如,重現(xiàn)這個問題需要 7 到 8 天。當然從這里我們也可以推斷出,我們如果加快測試數(shù)據(jù)包收發(fā)的發(fā)送,MMC 中斷會發(fā)生更早。那么,如何避免在產品應用中這種問題發(fā)生呢?
5、解決方案
1.1. 使用 MMC 中斷
MMC 中斷是個有用的功能。如果我們要使用的話,可以參考 MMC Rx interrupt register (ETH_MMC_RX_INTERRUPT)和 MMC Tx interrupt register (ETH_MMC_TX_INTERRUPT)的描述。我們需要對 MMC 進行一個讀的操作。


這也解釋了,客戶為什么發(fā)現(xiàn),通過調試器一個一個去讀取以太網寄存器,會在某個操作時讓異常狀態(tài)恢復到正常。
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 的定義。其實在 STM32H7 的例程里,我們可以很容易發(fā)現(xiàn) ETH 定義在
STM32CubeRepositorySTM32Cube_FW_H7_V1.8.0DriversCMSISDeviceSTSTM32H7xxIncludestm32h750xx.h:

也就是說,如果你的工程代碼源自 STM32Cube 例程,你應該能夠加入以上代碼并且能夠成功運行。
在加入上述代碼或者類似操作后,客戶反饋,再次進行超過 7 天以上的壓力測試,系統(tǒng)運行正常。
6、總結
STM32H7 的 MMC 中斷需要加以注意,如果不使用 MMC,需要確保它已經關閉;否則在經過長時間網絡收發(fā)后,系統(tǒng)會產生并非用戶所期望的中斷,導致系統(tǒng)假死。另外,我們也看到了調試STM32 以太網的常規(guī)方式,也就是借助工具而不需要寫代碼就可以進行寄存器的比較。這種方法值得使用 STM32 以太網的用戶進行調試時參考。
審核編輯:湯梓紅
-
以太網
+關注
關注
41文章
5997瀏覽量
180806 -
STM32
+關注
關注
2309文章
11162瀏覽量
373414 -
MMC
+關注
關注
0文章
78瀏覽量
31471 -
stm32h7
+關注
關注
0文章
37瀏覽量
1753
原文標題:工程師筆記|STM32H7 以太網的 MMC 中斷
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
#硬聲創(chuàng)作季 #FPGA Xilinx入門-16 亞穩(wěn)態(tài)現(xiàn)象原理與解決方案-1
#硬聲創(chuàng)作季 #FPGA Xilinx入門-16 亞穩(wěn)態(tài)現(xiàn)象原理與解決方案-2
#硬聲創(chuàng)作季 #FPGA Xilinx入門-16 亞穩(wěn)態(tài)現(xiàn)象原理與解決方案-3
MMC中斷的特點及解決方案
評論