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

STM32F4+DP83848乙太網通訊指南系列(一):知識儲備

丁丁的部落格:https://www.hexcode.cn/article/show/stm32-ethernet1

2017-12-09 17:32:19

STM32F4+DP83848乙太網通訊指南系列(一):知識儲備

前言:專案需求使用STM32F407進行乙太網通訊,並涉及到資料鏈路層的工業乙太網通訊,使用LWIP協議棧並不能滿足需求,因此需要自己摸清STM32F407呼叫外部PHY進行網路收發包的過程,並在此基礎上嘗試自己構建適用於專案的網路協議棧。我基本上是從零開始著手這個專案的,之前只有一些STC51系列和STM32F1系列微控制器開發的經驗,專案開發過程中學習、參考、借鑑了很多網路上的教程和部落格,在此尤其感謝正點原子團隊釋出的相關視訊教程。公司買的開發板主晶片是一顆STM32F407,搭配了一顆DP83848的PHY,因此本系列教程將使用DP83848進行適配,同時原子哥的學習板和教程中是使用LAN8720這顆PHY進行適配的,本系列指南也會花一些篇幅介紹各種PHY與STM32晶片進行適配的方法。

為了您更好地閱讀本系列,請點選原創連線進行瀏覽:

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

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協議棧程式碼,畢竟這些現有成熟的程式碼還都是基於標準庫函式進行編寫的。

  • STM32文件資料方面,請自行下載以下檔案:

  1. ST-RM0090 STM32F4參考手冊中文版.pdf
  2. 正點原子-STM32F4開發指南-標準庫函式中文版.pdf
  3. 正點原子-STM32F4標準庫函式例程.rar

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

乙太網分為很多層(按照OSI模型有七層,按照TCP/IP協議有五層),我們只需要瞭解其中這麼幾個:

  1. 最底下的PHY物理層:傳送和接受光、電、電磁波等各類模擬量的訊號,使其在介質上傳輸,盡最大可能保證其完整和準確。
  2. PHY上方的MAC層:構建有意義的幀格式,提供一定能力的校驗功能。
  3. 網路層:為整個網路拓撲服務,一般執行在後臺,使用者無感知,為網路結構提供路由(ARP)、通路測試(ICMP:Ping)等基礎服務。
  4. 除了上述三個層,其餘的層我們可以一併理解為應用層,因為其餘各層都是由應用程式根據不同的協議自行構建報文的。應用層所有的報文可分為兩個大類,TCP和UDP,TCP提供三次握手+四次揮手,因此網路資源消耗比較大,但是提供了確切的成功或者不成功的資訊;UDP只需要傳送方傳送一次報文就可以,因此傳送和接受成功與否並不可知。構建於TCP之上的協議有著名的HTTP、FTP、Telnet等;構建於UDP之上的協議相對來說不是很常見,像SNMP、TFTP這些簡單協議基本上都用不到,原因很簡單,UDP提供的是不確定的網路通訊,一般網路互動都需要非常確切的成功失敗的返回結果,記得曾幾何時OICQ(暴露年齡)的聊天資訊就是通過UDP協議傳送的,現在估計早就換成TCP了。

STM32F407乙太網架構

有了以上乙太網層次的理解後,我們將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自動忽略訊號。
  • DP83848的datesheet下載:DP83848C.pdf

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,正好是我們使用的這一款。
  • 上述頁面下載時需要註冊ST,使用者名稱密碼登入,而ST的響應速度超慢,可能還需要科學上網,列位可以到我上傳的地址下載:en.stsw-stm32070.zip
  • 這份文件裡/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嵌入式乙太網通訊這個通用的問題,就我的能力講解出來,幫助有需要的朋友。