配置rt-thread中的lwip模組
環境:
開發環境:mdk5.23
rt-thread版本:2.1.0
lwip版本:1.4.1
微控制器型號:stm32f407
phy晶元型號:dp83848
配置步驟:
phy的時鐘是50m,產生這個時鐘有兩個方法:
本文用微控制器產生50m訊號給phy,使用的引腳是微控制器的pa8。
步驟1:
配置微控制器主頻為100m
步驟2:修改rtconfig.h檔案,啟動lwip
/* section: lwip, a lighwight tcp/ip protocol stack */
#define rt_using_lwip
#define rt_using_lwip141
步驟3:修改stm32f4xx_eth.h檔案,開啟dp83848的相關巨集定義
/**
* @}
*//** @defgroup phy_status_register
* @
步驟6:修改stm32f4xx_eth.c檔案中的phy_monitor_thread_entry()函式。
本函式存在bug,還是使用lan8700暫存器,應該使用dp83848的暫存器。
static void phy_monitor_thread_entry(void *parameter)
}} /* phy search */
if(phy_addr == 0xff)
else
/* reset phy */
stm32_eth_printf("reset phy!\r\n");
eth_writephyregister(phy_addr, phy_bcr, phy_reset);
rt_thread_delay(rt_tick_per_second * 2);
eth_writephyregister(phy_addr, phy_bcr, phy_autonegotiation);
while(1)
if(sr & 0x04)
}/* linkchange */
if(phy_speed_new != phy_speed)
else
if(phy_speed_new & phy_duplex_mask)
else
rt_stm32_eth_init((rt_device_t)&stm32_eth_device);
/* send link up. */
eth_device_linkchange(&stm32_eth_device.parent, rt_true);
} /* link up. */
else
/* link down. */
phy_speed = phy_speed_new;
} /* linkchange */
rt_thread_delay(rt_tick_per_second);
} /* while(1) */
}
修改處:
// sr = eth_readphyregister(phy_addr, 31);
sr = eth_readphyregister(phy_addr, 16);
stm32_eth_printf("dp83848 reg 16:0x%04x\r\n", sr);
sr = (sr >> 2) & 0x07; /* lan8720, reg31[4:2], speed indication. */
phy_speed_new = phy_link_mask;
// if((sr & 0x03) == 2)
if((sr & 0x02) == 0)
配置完成
後應該可以ping通。
rt thread 串列埠裝置的配置流程
板級硬體初始化 系統定時器初始化 系統排程器初始化 建立初始化執行緒 元件初始化 定時器執行緒初始化 空閒執行緒初始化 系統排程器工作 串列埠裝置配置函式中遍歷要使用的串列埠裝置,做一些工作引數配置和裝置介面實現並註冊裝置 但在此不初始化裝置或不使能裝置 具體配置過程 1.註冊串列埠裝置,以便 fi...
RT Thread中的鍊錶結構
rt thread中的鍊錶是帶表頭節點的雙向迴圈鍊錶結構,它的表頭節點與之前的部落格 雙向迴圈鍊錶 中介紹的表頭節點不同,之前部落格介紹的表頭節點與後繼節點結構是一致的,這是因為指標型別問題,前面介紹過的鍊錶都是前驅節點指向後繼節點的首位址,即指向節點結構體的指標。rt thread鍊錶節點中的指標...
RT Thread的訊息佇列
1.訊息佇列控制塊的組成 結構體 通過下圖可以很容易發現訊息佇列有8個元素.msg pool msg size max msgs entry msg queue head msg queue tail msg queue free和.parent,其中.msg pool為訊息佇列的起始位址 msg ...