之前的推文已經將STM32網路的三大件講完了

?
①PHY介面,《STM32網路電路設計》
②MAC控制器,《STM32網路之MAC控制器》
③DMA控制器,《STM32網路之DMA控制器》
本文將聚焦STM32網路的中斷系統,簡單聊一下中斷系統和用法,
01、簡介
網路中斷向量:一個用于正常的網路操作,另一個當它映射到EXIT線路19的時候,用于以太網喚醒事件(帶有喚醒幀或魔術資料包檢測)
第一個網路中斷保留為MAC和DMA產生的中斷,正如在MAC中斷和DMA中斷部分,
第二個中斷保留為喚醒事件時PMT產生的中斷,喚醒事件對EXIT線路19的映射是造成STM32F20X和STM32F21X退出低功耗模式,并且產生中斷,
當映射到EXIT線路19的以太網喚醒事件發生和,MACPMT中斷使能并且有一個上升沿的EXIT線路19中斷也被使能,他們都能喚醒中斷,
可使用看門狗定時器(請參見ETH_DMARSWTR 暫存器)靈活控制RS 位(ETH_DMASR暫存器),當此看門狗定時器使用非零值編程時,看門狗定時器激活,只要RXDMA完成發送一個接收的資料幀到系統存盤,在沒有觸發接收狀態,因為它不是使能的在相應的接收描述符(RDES1[31])(也就是:未在相應接收描述符(RDES1[31])使能接收狀態),當定時器按照編程值運行時,RS位被置1并且中斷發生,如果ETH_DMAIER暫存器中相應位使能,看門狗定時失效在運行前,當資料幀被發送到記憶體,并且RS置1,因為定時器被使能為描述符,
注意:
讀取PMT 控制和狀態暫存器會自動將接收的喚醒幀和接收的魔術資料包PMT 中斷標志清零,但是,由于用于這些標志的暫存器位于 CLK_RX域,因此在韌體能發現此更新前可能有顯著的延遲,當 RX 時鐘很慢(在10 Mbit 模式)和當AHB 總線為高頻時,該延遲會特別長,
由于從PMT 到CPU 的中斷請求基于CLK_RX 域中的相同暫存器,所以即使在讀取PMT_CSR 之后,CPU也可能錯誤地第二次呼叫中斷例程,因此,可能需要韌體輪詢接收的喚醒幀和接收的魔術資料包位,并僅在發現它們都為‘0’時退出中斷服務程式,
02、代碼
STM32的網路中斷,其實準確來說應該是網路專用的DMA的中斷,網路中的資料包符合1518規則,也就是說是1460位元組,MAC接收的資料包是2K位元組,網路上每一個資料包MAC接收完都會產生中斷,
官方代碼是這樣的

?
明顯是使用查詢的方式,沒有使用到中斷,
中斷的使用方式如下:
配置網路中斷

?
注釋掉官方提供的查詢部分的代碼,

?
我們使用中斷形式之后,代碼是

?
這樣的代碼,我們在接收小于一個DMA描述符資料大小的資料沒有問題,很流暢,
DMA描述符部分內容請看《STM32網路之DMA控制器》,
在接收大量資料的時候就會出現錯誤,接收的會緩慢,接收的過多會死機
解決辦法是:
把if修改成while

?
這樣就把整個資料包接收完之后再跳出中斷,這樣就解決了這個問題,
點擊查看本文所在的專輯,STM32F207教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/273960.html
標籤:嵌入式
上一篇:STM32
下一篇:STM32
