LWIP初體驗(yàn)-修改ST官方demo
01硬件說(shuō)明
為什么要寫(xiě)這篇文章?STM32的網(wǎng)絡(luò)應(yīng)用還是個(gè)復(fù)雜的外設(shè)的,拿到一個(gè)板子需要驗(yàn)證網(wǎng)絡(luò)部分是否正常,硬件設(shè)計(jì)是否有問(wèn)題,對(duì)于很熟悉LWIP的同學(xué)可以直接移植LWIP,驗(yàn)證硬件。但快速且方便的辦法是修改ST的官方demo來(lái)驗(yàn)證硬件。(ST提供了CubeMX工具,如果使用該工具的話,也很方便,不在本文的考慮范圍內(nèi))。
本文的硬件測(cè)試環(huán)境
- 主控:STM32F207VCT6,100管腳的封裝
- 網(wǎng)絡(luò)PHY芯片:RTL8201EL,48管腳封裝,34和35管腳下拉,也就是芯片地址:0
- 使用的網(wǎng)絡(luò)接口:MII接口
涉及到的硬件原理圖和PCB開(kāi)源,開(kāi)源地址https://github.com/strongercjd/STM32F207VCT6本文涉及到的修改前代碼和修改后代碼下載地址鏈接:https://pan.baidu.com/s/1dr9MzX_pga2SYWOft4lniw
提取碼:7uqj
(提示:公眾號(hào)不支持外鏈接,請(qǐng)復(fù)制鏈接到瀏覽器下載)
本文目的:本文不會(huì)詳細(xì)講解LWIP相關(guān)內(nèi)容,只是LWIP的初體驗(yàn),如果你有一塊板子帶有網(wǎng)絡(luò)PHY,需要你測(cè)試硬件是否有問(wèn)題,本文或許對(duì)你有幫助。
02修改步驟
ST官方提供了很多demo,UDP,tftp,http,TCP等等,我們修改最常用的TCPSever的demo,代碼路徑如下:

①是IAR的工程代碼,②是Keil的工程代碼。
2.1、修改IAR配置文件
修改芯片設(shè)置(其實(shí)不用修改)

硬件使用的是SWD模式,如果你使用的硬件是JTAG模式,不需要修改。
2.2、修改網(wǎng)絡(luò)PHY地址
在stm32f2x7_eth_bsp.h文件中,將DP83848的PHY地址修改為0。
2.3、修改硬件IO
在stm32f2x7_eth_bsp.c中,這部分主要是根據(jù)具體硬件修改的,因?yàn)镾T官方demo使用的是144腳芯片,我們使用100腳芯片,對(duì)應(yīng)的GPIO需要修改。

2.4、屏蔽無(wú)用的東西和修改IP
在main.h中,屏蔽USE_LCD宏定義,官方開(kāi)發(fā)板使用了LCD,這里我們不使用。

修改IP地址(以本機(jī)IP地址為準(zhǔn),修改一個(gè)和自己PC在同一網(wǎng)段的空閑IP),再修改網(wǎng)關(guān)。
2.5、屏蔽其他代碼
在stm32f2x7_eth_bsp.c中

屏蔽這一項(xiàng)是因?yàn)檫@是跟芯片相關(guān)的,該函數(shù)功能:配置物理層產(chǎn)生一個(gè)中斷的鏈路狀態(tài)變化
demo使用的是DP83848,我們的硬件使用的是RTL8201
該函數(shù)定義
PHY_MICR宏定義如下

該函數(shù)操作的是DP83848的17寄存器,改寄存器屬于廠商自定義部分寄存器。
重點(diǎn)是RTL8201芯片沒(méi)有該寄存器。這部分內(nèi)容詳見(jiàn)《RTL8201網(wǎng)絡(luò)芯片講解》,里面講解到了這個(gè)問(wèn)題。
03效果顯示
3.1、電腦能ping通
3.2、客戶端能夠連接收發(fā)數(shù)據(jù)
使用PC的TCP客戶端,可以連接上STM32F207建立的TCPSever,端口是7。STM32收到數(shù)據(jù)后,把所有數(shù)據(jù)返回。

04使用中斷方式
通過(guò)上述修改,已經(jīng)簡(jiǎn)單將LWIP簡(jiǎn)單跑起來(lái)了,并且建立了TCPSever,但demo中使用的是查詢的方式,實(shí)際項(xiàng)目中是需要使用中斷的,以便快速接收到網(wǎng)絡(luò)數(shù)據(jù)。
首先屏蔽掉main.c中輪詢函數(shù)。

添加網(wǎng)口中斷配置,在stm32f2x7_eth.c中增加ETH_IRQ的中斷配置。
在stm32f2xx_it.c中添加中斷服務(wù)函數(shù),添加的函數(shù)就是剛剛main函數(shù)屏蔽的內(nèi)容。

注意,這里采用時(shí)候if判斷語(yǔ)句,這里其實(shí)是有隱患的,如果一次數(shù)據(jù)大于1500字節(jié),也就是說(shuō)需要IP分片就是丟包,IP分片內(nèi)容請(qǐng)看文章《IP協(xié)議詳解》。
我們將if修改成while即可。
測(cè)試結(jié)果,使用ping命令測(cè)試
PC端使用TCP客戶端工具測(cè)試STM32建立的TCPsever。

05Keil工程的修改
主要是修改工程配置,代碼修改參考上述IAR修改過(guò)程即可。
修改芯片類型

修改調(diào)試工具,ST官方代碼當(dāng)然使用STlink了,我使用Jlink。

使用Jlink的SWD模式。

06移植TCP客戶機(jī)代碼
上文我們修改了TCPSever的demo,在很多情況STM32作為T(mén)CP客戶端連接服務(wù)器,下面我們將TCP客戶端代碼移植到剛才修改好的TCPSever工程中。為了體驗(yàn)一下,在移植好LWIP的基礎(chǔ)上,如果要實(shí)現(xiàn)TCP客戶端,需要哪些函數(shù)接口。
TCP客戶端demo代碼在ST官方庫(kù)中位置。
demo的代碼在中斷函數(shù)中,TCP作為客戶端主動(dòng)連接服務(wù)器的代碼在中斷函數(shù)中,在ST的demo中,中斷觸發(fā)STM32作為客戶端去鏈接服務(wù)器。
移植完畢,為了方便,把所有函數(shù)移植到main.c中,不再放置到中斷函數(shù)中。
分別拷貝tcp_echoclient_connect()、tcp_echoclient_connected()、tcp_echoclient_recv()、tcp_echoclient_connection_close()、tcp_echoclient_send()函數(shù)復(fù)制過(guò)來(lái)。
下面的這些變量也要復(fù)制過(guò)來(lái)

復(fù)制到main.c中

為防止和tcpsever代碼變量沖突,把tcp_echoserver.c所有代碼全部屏蔽掉,后者將其從工程目錄中刪除。
原來(lái)文件中的頭文件也復(fù)制過(guò)來(lái)

把原來(lái)main.h的IP信息復(fù)制過(guò)來(lái)

把tcp_echoclient_connected函數(shù)中一下屏蔽
這個(gè)時(shí)候編譯會(huì)出錯(cuò),原因是有些函數(shù)調(diào)用的錯(cuò)誤,
方法1:調(diào)整函數(shù)位置
方法2:添加函數(shù)說(shuō)明
修改IP(以實(shí)際IP為為主)
編譯代碼,下載到STM32,進(jìn)行測(cè)試:
ping測(cè)試
在PC端使用網(wǎng)絡(luò)調(diào)試助手新建TCP服務(wù)器,進(jìn)行客戶端測(cè)試,有新的客戶端上線。
為將接收到的數(shù)據(jù)返回PC,我們?cè)趖cp_echoclient_recv函數(shù)中加入以下代碼
收到的數(shù)據(jù)成功返回

本文簡(jiǎn)單進(jìn)行了LWIP的初體驗(yàn),并沒(méi)有太多技術(shù)含量,按照這個(gè)方法可以驗(yàn)證新硬件是否正常,如果上述測(cè)試全部通過(guò),說(shuō)明硬件是沒(méi)有問(wèn)題。