[MCU] 【极海APM32F407 Tiny Board】rt-thread系统下移植LWIP协议栈

TL-LED   2023-6-17 18:04 楼主

        这篇来学习下在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

有三种方式,选择其中即可。

001.png

1.2、env 工具下载

下载地址:https://www.rt-thread.org/download.html#download-rt-thread-env-tool

下载后解压即可使用。

 

二、创建MDK工程项目

 

2.1、打开开发板对应的目录

在下载的源码目录下,找到apm32f407igt对应的开发板

002.png

2.2、生成MDK项目

使用ENV工具,生成MDK项目

执行命令:scons --target=mdk5

003.png

 

2.3、编译生成的工程

004.png

 

三、配置网络

 

3.1、修改/board/Kconfig

102.png

 

3.2、使能网络

100.png 101.png

 

3.3、修改网络接口

3.3.1、编译项目后,提示下面错误

103.png

 

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命令

104.png 3.2、ping 192.168.1.108

105.png

本帖最后由 TL-LED 于 2023-6-17 18:04 编辑

回复评论 (1)

极海APM32F407 Tiny Board的rt-thread系统下移植LWIP协议栈,楼主的步骤说的比较清楚

点赞  2023-6-18 16:19
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复