这篇来学习下在rt-thread系统下移植lwip协议栈,r源码中网络的驱动已经有了,使用时需要配置下网络和网络芯片的接口初始化工作。
在这篇https://bbs.eeworld.com.cn/thread-1244953-1-1.html rt-thread studio 软件创建的工程,给开发板下载代码总是提示失败,下边使用另一种方式来创建项目。
一、rt-thread 源代码下载
1.1、下载地址:https://www.rt-thread.org/download.html#download-rt-thread-source-code
有三种方式,选择其中即可。
1.2、env 工具下载
下载地址:https://www.rt-thread.org/download.html#download-rt-thread-env-tool
下载后解压即可使用。
二、创建MDK工程项目
2.1、打开开发板对应的目录
在下载的源码目录下,找到apm32f407igt对应的开发板
2.2、生成MDK项目
使用ENV工具,生成MDK项目
执行命令:scons --target=mdk5
2.3、编译生成的工程
三、配置网络
3.1、修改/board/Kconfig
3.2、使能网络
3.3、修改网络接口
3.3.1、编译项目后,提示下面错误
3.3.2、增加对应的函数
void apm32_msp_eth_init(void)
{
GPIO_Config_T configStruct;
/**
* ETH_RESET# PD11
* ETH_MDIO PA2
* ETH_MDC PC1
*/
/** Enable GPIOs clocks */
RCM_EnableAHB1PeriphClock(ETH_MDC_GPIO_CLK | ETH_MDIO_GPIO_CLK |
ETH_RESET_GPIO_CLK);
/** Enable SYSCFG clock */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
/** Configure ETH_RESET# */
GPIO_ConfigStructInit(&configStruct);
configStruct.pin = ETH_RESET_PIN;
configStruct.speed = GPIO_SPEED_100MHz;
configStruct.mode = GPIO_MODE_OUT;
configStruct.otype = GPIO_OTYPE_PP;
configStruct.pupd = GPIO_PUPD_NOPULL;
GPIO_Config(ETH_RESET_PORT, &configStruct);
/** Configure ETH_MDC */
configStruct.pin = ETH_MDC_PIN;
configStruct.mode = GPIO_MODE_AF;
GPIO_Config(ETH_MDC_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_MDC_PORT, ETH_MDC_SOURCE, ETH_MDC_AF);
/** Configure ETH_MDIO */
configStruct.pin = ETH_MDIO_PIN;
GPIO_Config(ETH_MDIO_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_MDIO_PORT, ETH_MDIO_SOURCE, ETH_MDIO_AF);
/** RESET ETH PHY */
ETH_RESET_PIN_LOW();
EthResetDelay(LAN8720A_RESET_DELAY);
ETH_RESET_PIN_HIGH();
EthResetDelay(LAN8720A_RESET_DELAY);
/** if BOARD_LAN8720A.h define MII_MODE, this function configurate MII_MODE */
/** Mode RMII */
/**
* ETH_RMII_REF_CLK PA1
* ETH_RMII_CRS_DV PA7
* ETH_RMII_RXD0 PC4
* ETH_RMII_RXD1 PC5
* ETH_RMII_TX_EN PB11
* ETH_RMII_TXD0 PB12
* ETH_RMII_TXD1 PB13
*/
/** Enable GPIOs clocks */
RCM_EnableAHB1PeriphClock(ETH_RMII_REF_CLK_GPIO_CLK | ETH_RMII_CRS_DV_GPIO_CLK |
ETH_RMII_RXD0_GPIO_CLK | ETH_RMII_RXD1_GPIO_CLK |
ETH_RMII_TX_EN_GPIO_CLK | ETH_RMII_TXD0_GPIO_CLK |
ETH_RMII_TXD1_GPIO_CLK);
/** Configure ETH_RMII_REF_CLK */
configStruct.pin = ETH_RMII_REF_CLK_PIN;
configStruct.mode = GPIO_MODE_AF;
configStruct.speed = GPIO_SPEED_100MHz;
GPIO_Config(ETH_RMII_REF_CLK_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_RMII_REF_CLK_PORT, ETH_RMII_REF_CLK_SOURCE, ETH_RMII_REF_CLK_AF);
/** Configure ETH_RMII_CRS_DV */
configStruct.pin = ETH_RMII_CRS_DV_PIN;
GPIO_Config(ETH_RMII_CRS_DV_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_RMII_CRS_DV_PORT, ETH_RMII_CRS_DV_SOURCE, ETH_RMII_CRS_DV_AF);
/** Configure ETH_RMII_RXD0 */
configStruct.pin = ETH_RMII_RXD0_PIN;
GPIO_Config(ETH_RMII_RXD0_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_RMII_RXD0_PORT, ETH_RMII_RXD0_SOURCE, ETH_RMII_RXD0_AF);
/** Configure ETH_RMII_RXD1 */
configStruct.pin = ETH_RMII_RXD1_PIN;
GPIO_Config(ETH_RMII_RXD1_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_RMII_RXD1_PORT, ETH_RMII_RXD1_SOURCE, ETH_RMII_RXD1_AF);
/** Configure ETH_RMII_TX_EN */
configStruct.pin = ETH_RMII_TX_EN_PIN;
GPIO_Config(ETH_RMII_TX_EN_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_RMII_TX_EN_PORT, ETH_RMII_TX_EN_SOURCE, ETH_RMII_TX_EN_AF);
/** Configure ETH_RMII_TXD0 */
configStruct.pin = ETH_RMII_TXD0_PIN;
GPIO_Config(ETH_RMII_TXD0_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_RMII_TXD0_PORT, ETH_RMII_TXD0_SOURCE, ETH_RMII_TXD0_AF);
/** Configure ETH_RMII_TXD1 */
configStruct.pin = ETH_RMII_TXD1_PIN;
GPIO_Config(ETH_RMII_TXD1_PORT, &configStruct);
GPIO_ConfigPinAF(ETH_RMII_TXD1_PORT, ETH_RMII_TXD1_SOURCE, ETH_RMII_TXD1_AF);
SYSCFG_ConfigMediaInterface(SYSCFG_INTERFACE_RMII);
}
void phy_reset(void)
{
ETH_RESET_PIN_LOW();
rt_thread_mdelay(50);
ETH_RESET_PIN_HIGH();
}
三、程序运行
下载编译好的代码,开发板运行
3.1、运行ifconfig命令
本帖最后由 TL-LED 于 2023-6-17 18:04 编辑