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
緊接着 以太網通信 依據 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