1、前言
STM32H7 以太網(wǎng)的 MMC(MAC management counter)中斷是個有點特別的中斷。特殊之處在于它是默認使能。如果我們在代碼里不針對 MMC 進行相關處理,就會造成一些異?,F(xiàn)象。我們先來看一個真實的客戶案例。
2、客戶案例
客戶使用 STM32H750 作為主控,與其他設備之間進行以太網(wǎng)通訊。
客戶在壓力測試中發(fā)現(xiàn):
? 設備從第一次通訊開始,累計 7 到 8 天,就會發(fā)現(xiàn) STM32H750 不再響應用戶的請求。
? 客戶通過使用 IDE 和添加輔助代碼可以發(fā)現(xiàn),STM32H750 會不停地進入以太網(wǎng)中斷,導致所使用的操作系統(tǒng)無法進行有效的系統(tǒng)調(diào)度。
? 問題發(fā)生后,客戶無論拔下網(wǎng)線或者再次連上網(wǎng)線,STM32H750 依然會不停的進入以太網(wǎng)中斷。
? 客戶嘗試使用 IDE 查看所有以太網(wǎng)寄存器,會發(fā)現(xiàn)有時侯能夠讓系統(tǒng)恢復正常。
3、分析
系統(tǒng)不停的進入以太網(wǎng)中斷,說明某個中斷在被某種條件下被不停的觸發(fā),或者中斷觸發(fā)后沒有被處理。進一步,當系統(tǒng)出現(xiàn)異常狀況后,拔掉網(wǎng)線,中斷依然不斷的進入,說明該異常并不需要外界不停的輸入,也就說明可能是中斷沒有被處理所導致。所以,客戶首先想到的是補全所有使能的以太網(wǎng)中斷的清除代碼。然而,客戶再次測試,卻發(fā)現(xiàn)累計 7 到 8 天,問題再次發(fā)生。
在這種情況下,為了深刻了解該狀況的原因,我們建議客戶,抓取異常時的寄存器現(xiàn)場,然后和正常狀態(tài)時的寄存器進行對比。我們在設備未發(fā)生異常前,抓取了以太網(wǎng)的三組寄存器 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 中斷,為什么還是有中斷產(chǎn)生呢?
4、MMC 中斷的特點
MMC 選項其實是默認使能。我們可以從參考手冊 RM0433 中看到這一點。
在 MMC 默認使能的情況下,什么情況下會產(chǎn)生中斷呢?
讓我們在 RM0433 里搜索下兩次寄存器比較發(fā)現(xiàn)的 RXUCGPIS 寄存器:
綜合這兩點,我們可以認為,在長時間以太網(wǎng)收發(fā)包之后,MMC 中斷幾乎一定會發(fā)生。這符合客戶案例的場景,例如,重現(xiàn)這個問題需要 7 到 8 天。當然從這里我們也可以推斷出,我們?nèi)绻涌鞙y試數(shù)據(jù)包收發(fā)的發(fā)送,MMC 中斷會發(fā)生更早。那么,如何避免在產(chǎn)品應用中這種問題發(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),通過調(diào)試器一個一個去讀取以太網(wǎng)寄存器,會在某個操作時讓異常狀態(tài)恢復到正常。
1.2. 關閉MMC中斷
在很多情況下,MMC 中斷對實際產(chǎn)品沒有意義。例如,在這個案例中,我們可以選擇關閉 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,需要確保它已經(jīng)關閉;否則在經(jīng)過長時間網(wǎng)絡收發(fā)后,系統(tǒng)會產(chǎn)生并非用戶所期望的中斷,導致系統(tǒng)假死。另外,我們也看到了調(diào)試STM32 以太網(wǎng)的常規(guī)方式,也就是借助工具而不需要寫代碼就可以進行寄存器的比較。這種方法值得使用 STM32 以太網(wǎng)的用戶進行調(diào)試時參考。
審核編輯:湯梓紅
-
以太網(wǎng)
+關注
關注
41文章
5642瀏覽量
176063 -
STM32
+關注
關注
2295文章
11032瀏覽量
365226 -
MMC
+關注
關注
0文章
77瀏覽量
31019 -
stm32h7
+關注
關注
0文章
37瀏覽量
1753
原文標題:工程師筆記|STM32H7 以太網(wǎng)的 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卡有什么特點?
多域SDON解決方案的特點有哪些?
STM32H7以太網(wǎng)的MMC中斷

評論