STM32 以太網學習
STM32進行以太網通信,需要 了解一下内容:
硬體層:MAC控制器 和 PHY 和 變壓器 .
軟體層:網絡協定棧,例如:lwip協定棧,RL-TCPnet協定棧,FreeRTOS-TCP協定棧,uIP協定棧。
MAC控制器
STM32F107/STM32F407自帶 MAC控制器,有的晶片把MAC和PHY做到了一起,像ENC28J60。
LWIP 協定棧 移植 需要資料如下:
官方 LWIP 源碼 下載下傳 , 官方 LWIP 文檔說明 最新版本 2.1.2 ,2018年12月29日15:34:07
1、網卡驅動移植,即 實作 struct netif 網卡 資料結構,裡面包含資料收發函數 等等 ,詳細:https://blog.csdn.net/zhzht19861011/article/details/6690534
2、作業系統接口移植,即 sys_arch.c 以及 sys_arch.h ,cc.h 的編寫 ,包含建立線程,信号量 等建立接口,以及 系統時間擷取接口等等 ,詳看 https://blog.csdn.net/ZCShouCSDN/article/details/80198116
3、lwip 功能 裁剪,即 lwipopts.h 檔案編寫 的編寫,主要包含 ,記憶體配置,以及功能 裁剪 ,詳看 :https://blog.csdn.net/slj_win/article/details/16959055
4、lwip 收發資料的 資料結構 pbuf 結構 嵌超全的LWIP記憶體管理經驗總結
移植案例 : https://github.com/suoZhangEmbedded/stm32h7_freertos
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM9AnYldnJwAzN9c3Pn5GcuQ0MlQ0MlcnW1JkbMFTVU9kMJRlTwUlaORXQ650MRpWTyUERNh3ZE1EMBR1T4FkaNRXTq10MnpWTzgzQOd3aU10dJpHT6lkeORTS65kdjJjYzpkMMRXOykVdNNjW2hXbZVnTtxENFRUT5N2ViBXO5xkNNh0YwIFSh9CXt92YuM3YltWas5iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
緊接着 以太網通信 依據 TCP\IP協定,但是這個協定太大了,STM32上運作不了,而有一個簡化版的TCP/IP協定是 LWIP協定,這個LWIP 協定是可以運作在STM32上面的。
下面就是LWIP協定移植到STM32F107上 。。。。 2015年8月14日17:28:29
首先下載下傳LWIP協定棧({{{後面發現沒啥用,因為ST 給移植好了}}})和STM32F107為以太網外設專門做的庫({{{後面發現不是庫,是移植LWIP好的工程}}})。
LWIP協定棧下載下傳位址: (下載下傳兩個檔案 名稱分别為 contrib-1.4.1.zip 和 lwip-1.4.1.zip)注: (2015年8月15日13:13:08這個時間 是這個版本)
http://ftp.twaren.net/Unix/NonGNU//lwip/
STM32F107為以太網外設專門做的庫下載下傳位址:(在頁面的最下面: 檔案名稱為:stsw-stm32026.zip) 注: (2015年8月15日13:14:12這個時間 是這個版本)
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF257862#
筆者再下載下傳之前,以為這個檔案(stsw-stm32026.zip)隻是一個庫函數(一個eth.C檔案,一個eth.H檔案) ,讓我們調用.實際不是這樣的,是一個移植好LWIP協定的一個好的(可以編譯通過)keil工程。
筆者正在閱讀這個工程,在閱讀這個工程之前下載下傳了這個工程的說明文檔(和下載下傳工程在同一個界面(AN3102Application note)),但是是英文的,筆者C和英文不是學的很好,正在閱讀中…… 2015年8月16日22:10:28
ethernetif.c 和stm32_eth.c:在這個工程文檔中有這樣的一段話,協定棧(LWIP)和以太網控制器(MAC)的連接配接檔案是ethernetif.c 和stm32_eth.c。 英文原句:For the STM32F107xx, the ethernetif.c (under Utilities\lwip-1.3.1\src\netif) and stm32_eth.c(under Libraries\STM32_ETH_Driver) files constitute the low-level layer, which is theinterface between the stack and the Ethernet controller. 這兩個檔案怎麼連接配接的,現在還不清楚!
netconf.c:為了使LWIP協定棧的周期任務能正常工作,還利用一個定時器為協定棧工作,有一個函數負責排程LWIP協定的任務。這個函數是LwIP_Periodic_Handle,定義在netconf.c中,注意這個檔案不是協定棧LWIP的檔案。主要功能包括:LWIP初始化,MAC位址和IP位址設定等等。
opt.h:協定棧的初始化參數在opt.h中可以找到,依靠opt.h修改後的新檔案lwipopts.h,這個檔案包含了LWIP協定棧為STM32F107做的一些修改!修改内容如下:
1、DHCP是否被使能,參數設定是LWIP_DHCP
2、TCP和UDP的連接配接數量,分别參數是MEMP_NUM_TCP_PCB 和MEMP_NUM_UDP_PCB
3、堆棧的數量設定參數是MEM_SIZE
4、緩沖區的數量和大小,參數是 PBUF_POOL_SIZE和PBUF_POOL_BUFSIZE
5、更詳細的請參考檔案lwipopts.h 。
PHY 接口配置:MII 和RMII 為STM32F107連接配接PHY的 兩種接口模式,在stm32f107.c檔案中有兩個宏定義,想用哪個接口,就把另外一個接口宏定義屏蔽掉。
此次編輯時間:2015年8月19日15:10:08
看了上面的源代碼簡單說明,筆者準備找個開發闆試驗一下(開發闆硬體說明: 晶片STM32F107,DM9161,HR911105A分别對應 MAC,PHY,以太網變壓器)。
2015年8月23日08:00:34 ,之是以這次更新和上次相差了很多的時間,是因為筆者想把這個工程下載下傳到開發闆運作起來,我想是不是得修改STM32F107(MAC)和DM9161(PHY)之間的連線,看了一段時間後發現開發闆上的線和代碼上的線是一樣的,隻不過PHY有個位址是1(某個引腳控制的拉高是1,拉低是0)),開發闆上是1,程式裡面是0,就修改這個,編譯,下載下傳到開發闆,代碼跑起來了,現在程式跑起來了,很是激動,雖然沒我多大的貢獻。MAC,PHY,以太網變壓器怎麼連接配接的稍後會加進來.
2015年8月26日11:11:33,代碼跑起來了,準備進行 UDP 資料傳輸。
打開 ST公司官方提供的以太網例程stsw-stm32070,工程裡面有兩個選項,一個是FreeRTOS和Standalone,可以了解為一個是作業系統,一個是“裸奔”,筆者還沒有學習過作業系統,是以在這時暫停STM32F407以太網的學習,去學習實時作業系統。2015年10月14日16:04:41