STM32F207核心版的LwIP例程的心得
//=====================================================================
//TITLE:
// STM32F207核心版的LwIP例程的心得
//AUTHOR:
// norains
//DATE:
// Friday 01-July-2011
//Environment:
// Keil MDK 4.2
// STM32F207
//=====================================================================
最近拿了片STM32F207的核心版,上面有以太網(wǎng)的芯片,可以聯(lián)網(wǎng);而之前所工作的領(lǐng)域均沒有涉及網(wǎng)絡(luò)方面,所以在使用上遇上了不少麻煩,特別是例程也沒有很正常跑起來。以下的記錄,均是在調(diào)試?yán)虝r的一些記錄,有點支離破碎不成體系,各位讀者權(quán)當(dāng)筆記來看好了。
1. IP地址
例程默認(rèn)的是采用自動分配IP地址的DHCP方式。如果大家的路由器無法查看到主機(jī)列表的話,那么這個分配方式就會比如郁悶。因為僅僅是使用核心版,是無法知道當(dāng)前的IP地址的,除非你接了LCD來進(jìn)行顯示。
如果要更改其分配方式,可以打開lwipopts.h文件,將LWIP_DHCP的宏定義更改為0,如:
/*----------DHCPoptions----------*/
/*DefineLWIP_DHCPto1ifyouwantDHCPconfigurationof
interfaces.DHCPisnotimplementedinlwIP0.5.1,however,so
turningthisondoescurrentlynotwork.*/
#defineLWIP_DHCP0
將LWIP_DHCP設(shè)置為0后,就需要手動設(shè)置IP地址了。相應(yīng)的數(shù)值,可以查看netconf.c文件,如:
IP4_ADDR(&ipaddr,192,168,0,8);
IP4_ADDR(&netmask,255,255,255,0);
IP4_ADDR(&gw,192,168,0,1);
這里將IP地址設(shè)置為192.168.0.8,掩碼為255.255.255.0,網(wǎng)關(guān)則是192.168.0.1。如果各位對這些地址有所異議,也可以手動修改。
在這里順便再說一下主機(jī)的IP地址設(shè)定。大家都知道,如果局域網(wǎng)的網(wǎng)段不一樣的話,是無法通信的;而又由于某些原因,使得主機(jī)的IP地址不能和開發(fā)板處于同一網(wǎng)段。遇到這種情形,直接修改核心版的IP地址自然是可以的,但我們還可以采用另外一種方法。
首先TCP/IP屬性中,我們固定一個IP地址,如圖:
點擊"高級",可以添加多個IP地址,如圖:
這樣就能夠和核心版同一網(wǎng)段,也能夠正常通信了。
2. RMII
所拿到的核心是STM32F107和STM32F207共用的,但因為引腳問題,使用STM32F207是不能使用MII,必須采用RMII。如果要更改這個模式,必須打開stm32f2x7.c文件,將MII_MODE宏去掉,并且定義相應(yīng)的RMII_MODE,如:
#defineRMII_MODE//RMIImodeforSTM3220F-EVALBoard(MB786)(checkjumperssetting)
//forRMIImodeyouhavetosetthesystemclockfrequencyto100MHz
//youcandothisinsystem_stm32f2xx.cfile
//#defineMII_MODE/*MIImodeforSTM3220F-EVALBoard(MB786)(checkjumperssetting)*/
如果這里執(zhí)意使用的是MII_MODE會是什么結(jié)果呢?結(jié)果便是無法跳出該循環(huán)語句:
/*Waitforsoftwarereset*/
while(ETH_GetSoftwareResetStatus()==SET);
因為會檢測到一直是SET狀態(tài),沒有RESET,代碼會一直循環(huán)。
3. PLL_N
如果使用了RMII模式,那么必須要將system_stm32f2xx.c的PLL_N定義由原來的240更改為200,如:
#define PLL_N 200 //norains:If you want to use RMII,it must set 200 here.Others you could set 240
假如不進(jìn)行更改的話,那么下面這段main.cpp文件的main函數(shù)循環(huán)代碼會出問題:
while(ETH_GetRxPktSize()!=0)
{
LwIP_Pkt_Handle();
}
簡單點來說,是ETH_GetRxPktSize函數(shù)永遠(yuǎn)返回為0,無法接收到數(shù)據(jù)。
4.測試
當(dāng)一切都準(zhǔn)備就緒之后,可以將核心版連接到路由器中,然后在命令行界面輸入ping就能夠檢測到設(shè)備,如圖: