前段時(shí)間做項(xiàng)目用到百兆網(wǎng)通信,用到了LWIP,一開(kāi)始是參照原子的例程做移植,因?yàn)樵拥睦讨惺褂玫氖荓AN8720,為了改成DP83848,改寄存器地址,改位定義,改速度計(jì)算公式,折騰了好多天也沒(méi)成功,最后只好聽(tīng)從網(wǎng)友的建議,修改ST官方的一個(gè)例程,幾天下來(lái),竟然成功了,現(xiàn)在將步驟分享給大家,感覺(jué)實(shí)際工程中用DP83848的還是大多數(shù)。.其實(shí)本文并不是移植LWIP,只是將ST官方的例程改成我們項(xiàng)目所需要的,然后我們?cè)僭谶@個(gè)基礎(chǔ)上完成自己的項(xiàng)目即可,這對(duì)新接觸LWIP又急著做項(xiàng)目的人比較適合,沒(méi)必要去了解LWIP的具體實(shí)現(xiàn),會(huì)用就行了。.
本人的項(xiàng)目配置:STM32F407VET6 + DP83848C
1、從官方網(wǎng)站http://www.stmcu.org/document/list/index/category-523下載STSW-STM32070 面向STM32F4x7微控制器的LwIP TCP/IP協(xié)議棧的演示代碼 的英文文檔DM00036052.pdf和軟件包stsw-stm32070.zip。stsw-stm32070.zip是面向STM32F4x7微控制器的LwIP TCP/IP協(xié)議棧的基于官方EVAL開(kāi)發(fā)板的演示代碼,顯然,我們直接修改這個(gè)演示代碼要比我們?nèi)ヒ浦睱WIP簡(jiǎn)單得多。DM00036052.pdf是演示代碼的說(shuō)明文檔。
2、將stsw-stm32070.zip解壓得到STM32F4x7_ETH_LwIP_V1.1.0文件夾,下面是STM32F4x7_ETH_LwIP_V1.1.0文件夾架構(gòu)
3、刪除_htmresc文件夾,這個(gè)文件夾是ST及CMSIS公司logo,沒(méi)什么用。
4、打開(kāi)project文件夾,這個(gè)文件夾包括兩個(gè)文件夾:FreeRTOS和Standalone。
FreeRTOS文件夾里的程序示例是基于FreeRTOS系統(tǒng)的LWIP移植示例,這里我們不需要,直接刪除。
Standalone文件夾里是一些無(wú)操作系統(tǒng)LWIP移植示例程序,在這里我們工程需要的是普通的數(shù)據(jù)傳輸,所以只使用到UDP,所以我們只保留udp_echo_client文件夾,其他的都刪除掉。在udp_echo_client文件夾中EWARM文件夾是IAR EWARM建立的工程,MDK-ARM是keil MDK建立的工程。在這里我們選擇MDK工程,IAR建立的工程可以保留也可以刪除。還有一個(gè)文件夾RIDE,打開(kāi)看了看,應(yīng)該是用另一款編譯軟件建立的工程空間,這里我們不需要,直接刪除。
5、Utilities-》Third_Party文件夾下面有三個(gè)文件夾FatFs_vR0、FreeRTOSV7.3 、lwip-1.4.1。FatFs_vR0一個(gè)通用的文件系統(tǒng)模塊,用于在小型嵌入式系統(tǒng)中實(shí)現(xiàn)FAT文件系統(tǒng),F(xiàn)reeRTOSV7.3一個(gè)迷你操作系統(tǒng)內(nèi)核的小型嵌入式系統(tǒng),在這里我們都用不上,直接刪除。lwip-1.4.1文件夾是LWIP源碼,是我們所需要的。
6、打開(kāi)MDK-ARM文件夾里面的MDK工程,我們先編譯一下,可以看到有0個(gè)錯(cuò)誤,三個(gè)警告,其中兩個(gè)警告是定義了變量但是沒(méi)有使用,我們不去管它,另一個(gè)警告是。.\。.\。.\。.\Utilities\Third_Party\lwip-1.4.1\port\STM32F4x7\Standalone
\ethernetif.c(366): warning: #1-D: last line of file ends without a newline 提示ethernetif.c文件的最后一行(也就是366行)沒(méi)有換行,MDK里面每個(gè)文件的最后一行必須換行,不然會(huì)提示一個(gè)警告,這里把366行后面換行再編譯,這個(gè)警告就消失了。
7、打開(kāi) main.h 文件,因?yàn)槲覀冸娐钒迳鲜褂玫氖荝MII接口,所以將#define MII_MOD注釋掉,將//#define RMII_MODE取消注釋?zhuān)缦聢D所示:
在這里要注意RMII的時(shí)鐘為50MHz,在電路板上直接焊接一個(gè)50MHz的有源晶振就可以了。
取消//#define USE_DHCP的注釋?zhuān)瑔⒂脛?dòng)態(tài)地址分配,當(dāng)?shù)刂贩峙洳怀晒t使用靜態(tài)IP地址。如圖:
本項(xiàng)目中直接刪除掉,因?yàn)閯h除掉了SERIAL_DEBUG,所以我們可以將serial_debug.c文件從項(xiàng)目中移除。
?
點(diǎn)擊紅色的叉號(hào)刪除serial_debug.c,然后點(diǎn)擊OK就可以了。
將Groups欄STM324xG_EVAL中的stm324x7i_eval.c和stm324x7i_eval_lcd.c刪除,將MDK_ARM中的啟動(dòng)文件startup_stm32f427x.s刪除,將Project Targets分欄中的項(xiàng)目名STM324x7I_EVAL刪除,將STM324xG_EVAL中的stm324xg_eval_lcd.c刪除,這都是和本項(xiàng)目無(wú)關(guān)的東西。這時(shí)候編譯會(huì)提示錯(cuò)誤,我們將stm32f4x7_eth_bsp.h文件里關(guān)于包含LCD函數(shù)的頭文件刪除,如下圖。
將stm32f4x7_eth_bsp.c文件里面關(guān)于LCD的部分刪除掉,如下圖,將這些行刪除。
將netconf.c中141-148行關(guān)于LCD的函數(shù)刪掉
/* Set the LCD Text Color */
LCD_SetTextColor(Red);
/* Display message on the LCD */
LCD_DisplayStringLine(Line5, (uint8_t*)“ Network Cable is ”);
LCD_DisplayStringLine(Line6, (uint8_t*)“ not connected ”);
/* Set the LCD Text Color */
LCD_SetTextColor(White);
再編譯就沒(méi)有問(wèn)題了。
8、按電路圖修改時(shí)鐘,修改 stm32f4xx.h中宏定義標(biāo)識(shí)符HSE_VALUE 的值為我們的外部時(shí)鐘20MHz
?
?
設(shè)置主 PLL 時(shí)鐘, 在 System_stm32f4xx.c 文件開(kāi)頭的地方配置
?
所以我們的主 PLL 時(shí)鐘為:
PLL = 20MHz * N/ (M*P) = 20MHz* 336 /(20*2) = 168MHz
SystemInit()函數(shù)中設(shè)置的系統(tǒng)時(shí)鐘大?。?/p>
SYSCLK(系統(tǒng)時(shí)鐘) = 168MHz
AHB 總線時(shí)鐘 (HCLK=SYSCLK) = 168MHz
APB1 總線時(shí)鐘 (PCLK1=SYSCLK/4) = 42MHz
APB2 總線時(shí)鐘 (PCLK2=SYSCLK/2) = 84MHz
PLL 主時(shí)鐘 = 168MHz
9、這個(gè)例程默認(rèn)的是STM324xG_EVAL開(kāi)發(fā)板,它使用的主芯片是STM32F407IG,而我們項(xiàng)目所使用的主芯片是STM32F407VE,要更改芯片配置。
選擇 Device 將下面的主芯片改為
10、下面我們進(jìn)入main.c函數(shù)看一下程序:
首先的注釋是說(shuō)明系統(tǒng)時(shí)鐘已經(jīng)配置完成,如果修改的話可以參考第8條。接下來(lái)就是配置中斷優(yōu)先級(jí)分組NVIC_PriorityGroupConfig,這個(gè)很重要,只要定義了中斷,就必須配置中斷優(yōu)先級(jí)分組,這個(gè)函數(shù)在系統(tǒng)中只能被調(diào)用一次,一旦分組確定就最好不要更改。這里分配的是組4,4位搶占優(yōu)先級(jí), 0位響應(yīng)優(yōu)先級(jí)。
接下來(lái)的是條件編譯和LCD初始化,在前面我們已經(jīng)刪除SERIAL_DEBUG 串口調(diào)試和LCD頭文件,這里我們直接將這段程序刪除。如下圖,將這幾行代碼刪除掉。
?
?
刪除mian.c下面關(guān)于LCD的信息:
?
刪除128行以后的所有數(shù)據(jù)。
打開(kāi)stm324xg_eval.h,注釋掉第39行#include “stm32_eval_legacy.h”,這個(gè)頭文件是關(guān)于開(kāi)發(fā)板上LCD及按鍵的聲明,本項(xiàng)目中沒(méi)有用到LCD和按鍵。
打開(kāi)stm32f4x7_eth_bsp.c文件,刪除關(guān)于LCD的一些程序,刪除447行至472行的程序和485行到495行的程序,這里的程序是在LCD屏上顯示一些語(yǔ)句及本機(jī)的IP。刪除如下圖所示程序。
打開(kāi)netconf.c文件,刪除關(guān)于LCD的程序,刪除第219至223行程序,刪除239至255行程序,刪除274至290行程序。這是關(guān)于LCD顯示分配動(dòng)態(tài)IP的信息的程序。
11、下面是stm32f4x7_eth_bsp.c ; 配置以太網(wǎng) (GPIOs, clocks, MAC, DMA),對(duì)于GPIO的配置,我們選用的是RMII接口,而且芯片是STM32F407VE,和STM324xG_EVAL開(kāi)發(fā)板上有些引腳定義有些差別,所以我們要對(duì)網(wǎng)口的GPIO接口修改:
修改結(jié)果如上圖所示 , 注意以太網(wǎng)配置那段注釋里面,雙斜線的是我們RMII沒(méi)有用到的引腳,還有就是要將PG11/PG13/PG14修改為PB11/PB12/PB13。
12、接下來(lái)就是修改關(guān)于LED和按鍵的程序了,刪除netconf.c里面第179行、第234行和252行,有些行數(shù)可能不對(duì),但代碼不會(huì)變,找到相應(yīng)代碼并修改
將stm324xg_eval.c文件除了#include “stm324xg_eval.h”其他全部刪除,如圖所示
將stm324xg_eval.h文件除了下圖所示程序其他全部刪除:
?
我們項(xiàng)目電路板上所用到的功能就可以在這兩個(gè)文件夾定義和聲明了。
?
13、在官方UDP客戶端這個(gè)例程中是利用按鍵中斷來(lái)發(fā)送數(shù)據(jù)包的,本人開(kāi)發(fā)的項(xiàng)目是當(dāng)收到下位機(jī)的數(shù)據(jù)后就將數(shù)據(jù)轉(zhuǎn)發(fā)給PC,所以在這里用不到按鍵中斷。之前我們刪除了LCD_LED_BUTTON_Init();這個(gè)函數(shù),這個(gè)函數(shù)就是配置LED、LCD以及按鍵初始化及按鍵中斷的函數(shù)。所以在這里這個(gè)按鍵中斷已經(jīng)沒(méi)有作用了,我們可以將UDP客戶端發(fā)送數(shù)據(jù)包的函數(shù)直接復(fù)制到主函數(shù)中,然后將按鍵中斷函數(shù)清空。按鍵中斷函數(shù)在stm32f4xx_it.c函數(shù)中,如下圖,將udp_echoclient_connect();復(fù)制到主函數(shù)中以便使用,等我們改寫(xiě)主函數(shù)時(shí)會(huì)用到這個(gè)函數(shù)。這個(gè)函數(shù)是基于EVAL開(kāi)發(fā)板寫(xiě)的一個(gè)數(shù)據(jù)收發(fā)函數(shù),我們自己實(shí)現(xiàn)收發(fā)功能都可以參照這個(gè)函數(shù)來(lái)寫(xiě) , 復(fù)制完之后直接將這個(gè)中斷函數(shù)內(nèi)容清空就可以了。在main.c中還要添加udp_echoclient_connect()函數(shù)所在文件對(duì)應(yīng)的頭文件#include “udp_echoclient.h”。
?
13、至此,編譯下載,修改電腦IP,連接我們的板子,因?yàn)槭前遄雍碗娔X直接連接而不使用路由器,所以DHCP不會(huì)成功,會(huì)使用我們分配的靜態(tài)IP,在main.h里面。這時(shí)候應(yīng)該就可以ping通了,說(shuō)明LWIP已經(jīng)運(yùn)行在我們的板子上了,之后我們就可以參照udp_echoclient_connect()實(shí)現(xiàn)我們想要的功能,具體的大家就可以自己去分析了……
關(guān)于LWIP的接口函數(shù)使用,大家可以參考周立功的《《LWIP接口與編程指南》》,對(duì)一般應(yīng)用足夠了,在百度文庫(kù)上有免費(fèi)下載
評(píng)論