天天看點

STM32 以太網學習 - 所長

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

STM32 以太網學習 - 所長

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