01、硬體說明
為什么要寫這篇文章?STM32的網路應用還是個復雜的外設的,拿到一個板子需要驗證網路部分是否正常,硬體設計是否有問題,對于很熟悉LWIP的同學可以直接移植LWIP,驗證硬體,但快速且方便的辦法是修改ST的官方demo來驗證硬體,(ST提供了CubeMX工具,如果使用該工具的話,也很方便,不在本文的考慮范圍內),
本文的硬體測驗環境
-
主控:STM32F207VCT6,100管腳的封裝
-
網路PHY芯片:RTL8201EL,48管腳封裝,34和35管腳下拉,也就是芯片地址:0
-
使用的網路介面:MII介面
涉及到的硬體原理圖和PCB開源,開源地址
https://github.com/strongercjd/STM32F207VCT6
本文涉及到的修改前代碼和修改后代碼下載地址
鏈接:https://pan.baidu.com/s/1dr9MzX_pga2SYWOft4lniw
提取碼:7uqj
本文目的:本文不會詳細講解LWIP相關內容,只是LWIP的初體驗,如果你有一塊板子帶有網路PHY,需要你測驗硬體是否有問題,本文或許對你有幫助,
02、修改步驟
ST官方提供了很多demo,UDP,tftp,http,TCP等等,我們修改最常用的TCPSever的demo,代碼路徑如下:

?
①是IAR的工程代碼,②是Keil的工程代碼,
2.1、修改IAR組態檔
修改芯片設定(其實不用修改)

?
硬體使用的是SWD模式,如果你使用的硬體是JTAG模式,不需要修改,

?
2.2、修改網路PHY地址
在stm32f2x7_eth_bsp.h檔案中,將DP83848的PHY地址修改為0,

?
2.3、修改硬體IO
在stm32f2x7_eth_bsp.c中,這部分主要是根據具體硬體修改的,因為ST官方demo使用的是144腳芯片,我們使用100腳芯片,對應的GPIO需要修改,

?
2.2、屏蔽無用的東西和修改IP
在main.h中,屏蔽USE_LCD宏定義,官方開發板使用了LCD,這里我們不使用,

?
修改IP地址(以本機IP地址為準,修改一個和自己PC在同一網段的空閑IP),再修改網關,

?
2.3、屏蔽其他代碼
在stm32f2x7_eth_bsp.c中

?
屏蔽這一項是因為這是跟芯片相關的,該函式功能:配置物理層產生一個中斷的鏈路狀態變化
demo使用的是DP83848,我們的硬體使用的是RTL8201
該函式定義

?
PHY_MICR宏定義如下

?
該函式操作的是DP83848的17暫存器,改暫存器屬于廠商自定義部分暫存器,
重點是RTL8201芯片沒有該暫存器,這部分內容詳見《RTL8201網路芯片講解》,里面講解到了這個問題,
03、效果顯示
3.1、電腦能ping通

?
3.2、客戶端能夠連接收發資料
使用PC的TCP客戶端,可以連接上STM32F207建立的TCPSever,埠是7,STM32收到資料后,把所有資料回傳,

?
04、使用中斷方式
通過上述修改,已經簡單將LWIP簡單跑起來了,并且建立了TCPSever,但demo中使用的是查詢的方式,實際專案中是需要使用中斷的,以便快速接收到網路資料,
首先屏蔽掉main.c中輪詢函式,

?
添加網口中斷配置,在stm32f2x7_eth.c中增加ETH_IRQ的中斷配置,

?
在stm32f2xx_it.c中添加中斷服務函式,添加的函式就是剛剛main函式屏蔽的內容,

?
注意,這里采用時候if判斷陳述句,這里其實是有隱患的,如果一次資料大于1500位元組,也就是說需要IP分片就是丟包,IP分片內容請看文章《IP協議詳解》,我們將if修改成while即可,

?
測驗結果,使用ping命令測驗

?
PC端使用TCP客戶端工具測驗STM32建立的TCPsever,

?
05、Keil工程的修改
主要是修改工程配置,代碼修改參考上述IAR修改程序即可,
修改芯片型別

?
修改除錯工具,ST官方代碼當然使用STlink了,我使用Jlink,

?
使用Jlink的SWD模式,

?
06、移植TCP客戶機代碼
上文我們修改了TCPSever的demo,在很多情況STM32作為TCP客戶端連接服務器,下面我們將TCP客戶端代碼移植到剛才修改好的TCPSever工程中,為了體驗一下,在移植好LWIP的基礎上,如果要實作TCP客戶端,需要哪些函式介面,
TCP客戶端demo代碼在ST官方庫中位置,

?
demo的代碼在中斷函式中,TCP作為客戶端主動連接服務器的代碼在中斷函式中,在ST的demo中,中斷觸發STM32作為客戶端去鏈接服務器,

?
移植完畢,為了方便,把所有函式移植到main.c中,不再放置到中斷函式中,

?
分別拷貝tcp_echoclient_connect()、tcp_echoclient_connected()、tcp_echoclient_recv()、tcp_echoclient_connection_close()、tcp_echoclient_send()函式復制過來,
下面的這些變數也要復制過來

?
復制到main.c中

?
為防止和tcpsever代碼變數沖突,把tcp_echoserver.c所有代碼全部屏蔽掉,后者將其從工程目錄中洗掉,
原來檔案中的頭檔案也復制過來

?
把原來main.h的IP資訊復制過來

?
把tcp_echoclient_connected函式中一下屏蔽

?
這個時候編譯會出錯,原因是有些函式呼叫的錯誤,
方法1:調整函式位置
方法2:添加函式說明

?
修改IP(以實際IP為為主)

?
編譯代碼,下載到STM32,進行測驗:
ping測驗

?
在PC端使用網路除錯助手新建TCP服務器,進行客戶端測驗,有新的客戶端上線,

?
為將接收到的資料回傳PC,我們在tcp_echoclient_recv函式中加入以下代碼

?
收到的資料成功回傳

?
本文簡單進行了LWIP的初體驗,并沒有太多技術含量,按照這個方法可以驗證新硬體是否正常,如果上述測驗全部通過,說明硬體是沒有問題,
點擊查看本文所在的專輯,STM32F207網路開發
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/279157.html
標籤:嵌入式
下一篇:STM32移植LWIP
