1、前言
STM32H7 以太網的 MMC(MAC management counter)中斷是個有點特別的中斷。特殊之處在于它是默認使能。如果我們在代碼里不針對 MMC 進行相關處理,就會造成一些異常現象。我們先來看一個真實的客戶案例。
2、客戶案例
客戶使用 STM32H750 作為主控,與其他設備之間進行以太網通訊。
客戶在壓力測試中發現:
? 設備從第一次通訊開始,累計 7 到 8 天,就會發現 STM32H750 不再響應用戶的請求。
? 客戶通過使用 IDE 和添加輔助代碼可以發現,STM32H750 會不停地進入以太網中斷,導致所使用的操作系統無法進行有效的系統調度。
? 問題發生后,客戶無論拔下網線或者再次連上網線,STM32H750 依然會不停的進入以太網中斷。
? 客戶嘗試使用 IDE 查看所有以太網寄存器,會發現有時侯能夠讓系統恢復正常。
3、分析
系統不停的進入以太網中斷,說明某個中斷在被某種條件下被不停的觸發,或者中斷觸發后沒有被處理。進一步,當系統出現異常狀況后,拔掉網線,中斷依然不斷的進入,說明該異常并不需要外界不停的輸入,也就說明可能是中斷沒有被處理所導致。所以,客戶首先想到的是補全所有使能的以太網中斷的清除代碼。然而,客戶再次測試,卻發現累計 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 中斷,為什么還是有中斷產生呢?
4、MMC 中斷的特點
MMC 選項其實是默認使能。我們可以從參考手冊 RM0433 中看到這一點。
在 MMC 默認使能的情況下,什么情況下會產生中斷呢?
讓我們在 RM0433 里搜索下兩次寄存器比較發現的 RXUCGPIS 寄存器:
綜合這兩點,我們可以認為,在長時間以太網收發包之后,MMC 中斷幾乎一定會發生。這符合客戶案例的場景,例如,重現這個問題需要 7 到 8 天。當然從這里我們也可以推斷出,我們如果加快測試數據包收發的發送,MMC 中斷會發生更早。那么,如何避免在產品應用中這種問題發生呢?
5、解決方案
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 的定義。其實在 STM32H7 的例程里,我們可以很容易發現 ETH 定義在
STM32CubeRepositorySTM32Cube_FW_H7_V1.8.0DriversCMSISDeviceSTSTM32H7xxIncludestm32h750xx.h:
也就是說,如果你的工程代碼源自 STM32Cube 例程,你應該能夠加入以上代碼并且能夠成功運行。
在加入上述代碼或者類似操作后,客戶反饋,再次進行超過 7 天以上的壓力測試,系統運行正常。
6、總結
STM32H7 的 MMC 中斷需要加以注意,如果不使用 MMC,需要確保它已經關閉;否則在經過長時間網絡收發后,系統會產生并非用戶所期望的中斷,導致系統假死。另外,我們也看到了調試STM32 以太網的常規方式,也就是借助工具而不需要寫代碼就可以進行寄存器的比較。這種方法值得使用 STM32 以太網的用戶進行調試時參考。
審核編輯:湯梓紅
-
以太網
+關注
關注
40文章
5288瀏覽量
169663 -
STM32
+關注
關注
2258文章
10828瀏覽量
352484 -
MMC
+關注
關注
0文章
73瀏覽量
30418 -
stm32h7
+關注
關注
0文章
36瀏覽量
1753
原文標題:工程師筆記|STM32H7 以太網的 MMC 中斷
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論