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