1. 程式人生 > >STM32開發筆記47:STM32F4+DP83848乙太網通訊指南系列(一):知識儲備

STM32開發筆記47:STM32F4+DP83848乙太網通訊指南系列(一):知識儲備

微控制器型號:STM32F407VGT


本章為系列指南第一章,主要是介紹一下專案思路,並且儘可能列出從零開始著手開發這個專案過程中,所需要理解的各類知識點,關於這些知識點,如果需要更詳細的介紹,請列為看官自行百度谷歌。

STM32F407簡介

STM32F407主頻168MHz,主頻這個數值的意義可以這麼理解:每秒執行168,000,000步簡單指令,也就是每毫秒168,000次,每微秒168次。我們工業乙太網進入實時通訊後的資料傳輸週期大概每2ms互動4次,每次60個Byte,最差的演算法複雜度計算下來需要每毫秒4 / 2 * 60byte = 120步(事實上用不了這麼多步),而這顆STM32F07的晶片提供每毫秒168,000次操作,相差3個數量級,因此大致上看來這顆晶片是完全可以勝任的。

STM32F407可以通過多個時鐘配置方案達到最高168MHz,一般是使用外部8MHz晶振,通過鎖相環倍頻到168MHz,這個我們後面章節會講。

目前STM32晶片有三種程式碼編寫的方案:第一是暫存器方案,通過內部各種地址定義的巨集來操作,晦澀難懂,需要不停地查資料才能理解;第二種是標準庫函式方案,沿用一份很久沒有更新的標準庫進行開發,標準庫ST公司已經不打算維護升級了,但是網路上資料非常豐富;第三種是HAL庫函式方案,繼標準庫推出多年之後,ST公司推出了HAL庫函式版本的SDK,這份SDK保持維護和更新,並且ST公司在F7系列晶片上只允許這使用HAL庫函式程式設計,目前為止該庫函式版本的書籍資料並不是很豐富,值得慶幸的是正點原子團隊也率先推出了STM32F1,F4,F7全系列的HAL庫函式教程,參見:http://openedv.com/thread-13912-1-1.html 。但是針對本專案,我們依然使用標準庫函式進行開發,理由是可以參考借鑑大量的乙太網通訊實驗程式碼,以及ST官方的LWIP協議棧程式碼,畢竟這些現有成熟的程式碼還都是基於標準庫函式進行編寫的。

乙太網層次的理解,白話版

有了以上乙太網層次的理解後,我們將STM32F407的網路架構與之對照理解。

STM32F407內建了MAC層的處理能力,並且使用DMA技術強化了MAC層能力。

DMA(Direct Memory Access,直接記憶體存取),是現代處理器一個很重要的技術,它允許不同速度的硬體裝置來溝通,也不需要依賴於CPU的大量中斷負載。如果沒有DMA,CPU需要從來源把輸入資料複製到暫存器,然後把它們再次寫回到需要使用的地方。在這個時間中,CPU對於其他的工作來說完全無法使用。

關於DMA的進一步理解:STM32F407的匯流排架構中,單獨分配了一個MAC層的DMA資料匯流排,也就是無論你用不用,核心邏輯總會在固定的時間段釋放對匯流排資料的訪問,由一段MAC層控制器來對資料匯流排上的資料進行存取處理。這段處理,是獨立於168MHz主頻之外的。如圖所示(圖片來自RM0090ST官方STM32F4手冊P50):

擁有DMA能力的MAC層,可以在使用者程式碼完全不干預的情況下,將DMA中的資料傳送給PHY,同時在PHY接到資料後,將PHY的資料讀取到DMA中,並通知中斷。以上操作的前提是:使用者提前配置好MAC,PHY,DMA,以及中斷向量,這部分工作是這個系列的核心內容,涉及到的內容比較多,會在後續章節逐一介紹。

PHY模組

STM32F407內建的MAC層讓使用者封裝位元組資料為網路幀結構,但STM32F407並沒有能力將其傳送到電纜上去,特別是涉及到光電電磁等模擬量的訊號,沒法處理,因此需要外部PHY模組進行輔助。我們知道STM32F407是一個純數位電路晶片,而PHY需要處理的又是模擬訊號,功耗比純數位電路大很多(摸上去發燙)。因此從成本、體積、工藝等各方面考慮,ST公司並未在STM32系列晶片中增加PHY模組,而是建議使用者在PCB板上自行增加PHY模組。目前已經有一些晶片公司推出了內建PHY的晶片,不過比較少,可自行百度谷歌或者,淘寶,對,你沒聽錯,搜這方面資料時有時候淘寶比較厲害。

PHY晶片可選型號比較豐富,有純粹的PHY晶片(DP83848,LAN8720),也有整合MAC層+PHY層的晶片(ENC28J60, DM9000),還有內建TCP/IP協議棧硬解碼的MAC+PHY晶片(W5500)。這裡要注意的是,我們這個專案涉及到工業乙太網協議,IO資料通過OSI模型中的鏈路層收發,因此千萬不能選擇整合TCP/IP協議棧的PHY晶片,那種晶片通過I2C或者SPI將TCP/UDP報文抽象出來傳送給上位機,已經將鏈路層不符合TCP/UPD規則的過濾掉了。

MAC跟PHY通訊是使用RMII或者MII介面,前者引腳使用少,頻率高;後者引腳使用多,頻率低。一般使用前者。DP83848可以使用RMII或者MII,LAN8720只可以使用RMII。無論RMII還是MII,你都只需要做個瞭解,在配置時根據電路引腳的接法,配置好。具體的時序圖不需要看,不需要你直接控制,有現成的函式幫忙。

PHY有地址的概念,MAC理論上最多能控制32個PHY(可以自己做一個32埠的交換機了)。DP83848的42-46引腳讀入自己的ADDR,MAC在通訊時可以指定其中某一ADDR進行通訊,ADDR不匹配的PHY自動忽略訊號。

Ethernet庫函式

STM32的開發環境是Keil5,通過配置Keil5,可以下載獲得STM32F4系列的SDK,也就是標準庫函式的SDK,但是這份標準庫函式裡面是沒有有關Ethernet方面的函式的,為什麼?因為ST公司認為PHY都沒整合到CPU裡面,庫函式就更沒辦法整合進去了,包括PHYADDR,MII,RMII的選擇,有的PHY甚至不使用MII或者RMII介面,而是高度封裝後使用SPI進行通訊。因此ST沒法為所有使用者提供一個通用的函式庫,但是官方提供了一個DEMO程式,該程式作用非常大,到ST官網,搜尋框輸入LWIP就能搜到這個DEMO,官方文件編號是STSW-STM32070,適用於STM32F4系列的乙太網通訊DEMO,使用LWIP協議棧,適配PHY為DP83848,正好是我們使用的這一款。

這份文件裡/STM32F4x7_ETH_LwIP_V1.1.1/Libraries/STM32F4x7_ETH_Driver下面的stm32f4x7_eth.c以及配套的.h檔案是比較關鍵的,類似於標準庫提供的那些I2C,UART,SPI等庫函式檔案。該檔案的使用方法和理解,後續章節會詳細介紹。

LWIP協議棧

LWIP是一個精簡版的TCP/IP協議棧,廣泛用於嵌入式裝置中,佔用記憶體少。

LWIP通過呼叫MAC層來實現網路通訊,呼叫的庫函式就定義在上述的STM32F4x7_ETH_Driver檔案中。

LWIP可以解決大多數應用層場景的通訊需求,比如TCP和UDP。

LWIP無法解決鏈路層的通訊問題,因此我們本專案並沒有移植LWIP,而是參考借鑑LWIP呼叫MAC層部分的程式碼,從而自己構建協議棧,完成收發包任務。

總結

以上就是整個STM32乙太網通訊的基礎知識,知識點比較零碎,我儘量用白話文把他們羅列出來,因為我也是從零開始學著做的,期間看過不少晦澀難懂的文件。在著手寫這個系列的時候,我們公司的這個專案已經被我搞定了,雖然具體實現的協議,應用的場景需要保密無法透露,但我仍然希望就STM32嵌入式乙太網通訊這個通用的問題,就我的能力講解出來,幫助有需要的朋友。