历史上的今天
返回首页

历史上的今天

今天是:2024年10月13日(星期日)

正在发生

2020年10月13日 | 配置rt-thread中的lwip模块

2020-10-13 来源:eefocus

环境:


开发环境:MDK5.23


rt-thread版本:2.1.0


lwip版本:1.4.1


单片机型号:stm32f407


phy芯片型号:dp83848


配置步骤:

PHY的时钟是50M,产生这个时钟有两个方法:

用50M有源晶振给PHY

单片机产生50M信号给PHY

本文用单片机产生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

  * @{

  */

/* The PHY status register value change from a PHY to another so the user have

   to update this value depending on the used external PHY */

/**

  * @brief  For LAN8700

  */

/*#define PHY_SR                           31 */        /*!< Tranceiver Status Register */

 

/**

  * @brief  For DP83848

  */

#define PHY_SR                           16     /*!< Tranceiver Status Register */

 

/* The Speed and Duplex mask values change from a PHY to another so the user have to update

   this value depending on the used external PHY */

/**

  * @brief  For LAN8700

  */

/*#define PHY_Speed_Status            ((uint16_t)0x0004)*/      /*!< Configured information of Speed: 10Mbps */

/*#define PHY_Duplex_Status           ((uint16_t)0x0010)*/      /*!< Configured information of Duplex: Full-duplex */

 

/**

  * @brief  For DP83848

  */

#define PHY_Speed_Status            ((uint16_t)0x0002)    /*!< Configured information of Speed: 10Mbps */

#define PHY_Duplex_Status           ((uint16_t)0x0004)    /*!< Configured information of Duplex: Full-duplex */

#define IS_ETH_PHY_ADDRESS(ADDRESS) ((ADDRESS) <= 0x20)

#define IS_ETH_PHY_REG(REG) ((REG) <= 0x1F)

步骤4:修改stm32f4xx_eth.c文件,设置为RMII模式

/* STM32F ETH dirver options */

#define RMII_MODE                       /* MII_MODE or RMII_MODE */

#define RMII_TX_GPIO_GROUP        1     /* 1:GPIOB or 2:GPIOG */

步骤5:修改stm32f4xx_eth.c文件中的GPIO_Configuration()函数,使用PA8输出50M时钟

/*

 * GPIO Configuration for ETH

 */

static void GPIO_Configuration(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

 

    /* Enable SYSCFG clock */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE);

 

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

 

    /* config MDIO and MDC. */

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); /* config ETH_MDIO */

    GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); /* config ETH_MDC */

    /* config PA2: MDIO */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* config PC1: MDC */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

 

    /* Ethernet pins configuration ************************************************/

#if defined(MII_MODE)

/*

    ETH_MDIO ------------> PA2

    ETH_MDC -------------> PC1

    ETH_MII_CRS ---------> PA0

    ETH_MII_COL ---------> PA3

    ETH_MII_RX_CLK ------> PA1

    ETH_MII_RX_ER -------> PB10

    ETH_MII_RX_ER -------> PI10

    ETH_MII_RX_DV -------> PA7

    ETH_MII_RXD0 --------> PC4

    ETH_MII_RXD1 --------> PC5

    ETH_MII_RXD2 --------> PB0

    ETH_MII_RXD3 --------> PB1

    ETH_MII_TX_EN -------> PB11

    ETH_MII_TX_EN -------> PG11

    ETH_MII_TX_CLK ------> PC3

    ETH_MII_TXD0 --------> PB12

    ETH_MII_TXD0 --------> PG13

    ETH_MII_TXD1 --------> PB13

    ETH_MII_TXD1 --------> PG14

    ETH_MII_TXD2 --------> PC2

    ETH_MII_TXD3 --------> PB8

    ETH_MII_TXD3  -------> PE2

*/

 

#error insert MII GPIO initial.

#elif defined(RMII_MODE)

/*

    ETH_MDIO ------------> PA2

    ETH_MDC -------------> PC1

    ETH_RMII_REF_CLK ----> PA1

    ETH_RMII_CRS_DV -----> PA7

    ETH_RMII_RXD0 -------> PC4

    ETH_RMII_RXD1 -------> PC5

    ETH_RMII_TX_EN ------> PG11

    ETH_RMII_TXD0 -------> PG13

    ETH_RMII_TXD1 -------> PG14

    ETH_RMII_TX_EN ------> PB11

    ETH_RMII_TXD0 -------> PB12

    ETH_RMII_TXD1 -------> PB13

    

    PA8输出MCO1 50M

*/

    // PA8输出时钟 start

    /* Configure MCO (PA8) */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    

    /* Output PLL clock divided by 2 (50MHz) on MCO pin (PA8) to clock the PHY */

    RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_2);

 

    SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);

    

    // end

 

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); /* RMII_REF_CLK */

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); /* RMII_CRS_DV */

 

    /* configure PA1:RMII_REF_CLK, PA7:RMII_CRS_DV. */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); /* RMII_RXD0 */

    GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); /* RMII_RXD1 */

 

    /* configure PC4:RMII_RXD0, PC5:RMII_RXD1. */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

    GPIO_Init(GPIOC, &GPIO_InitStructure);

 

#   if RMII_TX_GPIO_GROUP == 1

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

 

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH); /* RMII_TX_EN */

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_ETH); /* RMII_TXD0 */

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH); /* RMII_TXD1 */

 

    /* configure PB11:RMII_TX_EN, PB12:RMII_TXD0, PB13:RMII_TXD1 */

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

#   elif RMII_TX_GPIO_GROUP == 2

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

 

    GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH); /* RMII_TX_EN */

    GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); /* RMII_TXD0 */

    GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); /* RMII_TXD1 */

 

    /* configure PG11:RMII_TX_EN, PG13:RMII_TXD0, PG14:RMII_TXD1 */

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;

    GPIO_Init(GPIOG, &GPIO_InitStructure);

#   else

#   error RMII_TX_GPIO_GROUP setting error!

#   endif /*RMII_TX_GPIO_GROUP */

#endif /* RMII_MODE */

}

步骤6:修改stm32f4xx_eth.c文件中的phy_monitor_thread_entry()函数。

本函数存在bug,还是使用LAN8700寄存器,应该使用DP83848的寄存器。

static void phy_monitor_thread_entry(void *parameter)

{

    uint8_t phy_addr = 0xFF;

    uint8_t phy_speed_new = 0;

 

    /* phy search */

    {

        rt_uint32_t i;

        rt_uint16_t temp;

 

        for(i=0; i<=0x1F; i++)

        {

            temp = ETH_ReadPHYRegister(i, 0x02);

 

            if( temp != 0xFFFF )

            {

                phy_addr = i;

                break;

            }

        }

    } /* phy search */

 

    if(phy_addr == 0xFF)

    {

        STM32_ETH_PRINTF("phy not probe!rn");

        return;

    }

    else

    {

        STM32_ETH_PRINTF("found a phy, address:0x%02Xrn", phy_addr);

    }

 

    /* RESET PHY */

    STM32_ETH_PRINTF("RESET PHY!rn");

    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)

    {

        uint16_t status  = ETH_ReadPHYRegister(phy_addr, PHY_BSR);

        STM32_ETH_PRINTF("LAN8720 status:0x%04Xrn", status);

 

        phy_speed_new = 0;

 

        if(status & (PHY_AutoNego_Complete | PHY_Linked_Status))

        {

            uint16_t SR;

 

//            SR = ETH_ReadPHYRegister(phy_addr, 31);

推荐阅读

史海拾趣

3L Electronic Corporation公司的发展小趣事

3L Electronic Corporation,自XXXX年在台北创立以来,凭借创始人的远见卓识和团队的努力,逐渐在电子行业崭露头角。初期,公司主要生产电子零组件,凭借着精湛的工艺和稳定的质量,赢得了客户的信赖。随着市场的扩大,公司逐渐拓展到电子产品修理和国际贸易等领域,为后续的快速发展奠定了坚实基础。

HARTING公司的发展小趣事

作为一家有社会责任感的企业,3L Electronic Corporation始终关注环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少对环境的影响。同时,公司还参与社会公益事业,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展创造了良好的社会环境。

请注意,上述故事是基于公开信息和行业常识的概括描述,并不代表3L Electronic Corporation公司的真实发展历程。如需了解更多关于该公司的详细信息,建议查阅其官方网站或相关新闻报道。

地博电子(DIBO)公司的发展小趣事

为了满足不断增长的市场需求,地博电子在2017年创立了株洲地博光电材料有限公司,打造了第二智造基地。新基地的建设不仅进一步提高了公司的生产能力和研发水平,还为公司的长期发展提供了强有力的支持。在株洲地博高科技园一期建设完成后,地博电子的产能和品质都得到了显著提升。

Grayhill公司的发展小趣事
在工业控制系统中,许多设备需要精确的电压和电流控制,W723扩展输出电流稳压电路能够满足这一需求。
ACCUTEK公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,ACCUTEK公司开始将目光投向国际市场。公司积极参加国际电子展会和技术交流活动,与全球多家知名企业建立了合作关系。同时,公司还在海外设立了多个分支机构,以便更好地服务当地客户。这些举措不仅提升了公司的国际影响力,也为公司的长远发展注入了新的活力。

DSP Group Inc公司的发展小趣事

DSP Group Inc公司成立于1987年,早期专注于数字信号处理(DSP)技术的研发。在成立之初,公司便认识到了DSP技术在语音处理、音频编解码等领域的巨大潜力。通过不断的技术创新和研发投入,DSP Group逐渐在DSP领域树立了领先地位,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

关于FPGA开发板信息

伙计们: 作为FPGA初学者,或已经工作,但是接触机会不多,又想学好它的人来说,有一个开发板是不错的。 可是这些人一般不会了解哪个好,那个不好。那就请高手来介绍或者指导买哪家的了。 在此,也强烈建议论坛开展一个diyFPGA开发板的活动…

查看全部问答>

为什么我的按键中断在程序启动的时候总自动进入

为什么我的按键中断在程序启动的时候总自动进入,不是按下按键以后,而是程序一运行的时候就自动进入中断函数,请问这是什么原因呢?…

查看全部问答>

怎样从内存中读取摄像头采集的数据保存成bmp格式

我已经从把摄像头采集的数据保存使用 mmap 内存映射来获取了图像,当用write函数得出的是jpeg格式的 我想得到bmp格式的图片怎么做,跪求,急用。谢谢各位。 …

查看全部问答>

用verilog HDL 实现网络加密算法md5

用verilog HDL 实现一个网络加密的算法(md5),有没有哪位高手能给点帮助,我邮箱是poppy220@126.com 先谢过啦!^_^ …

查看全部问答>

关于STM32外设初始化时,时钟配置的列表

附件为在使用STM32外设,进行初始化时,各个外设需要对哪些时钟进行配置的列表。希望大家对该文件的内容多提意见,我们将对其进行修改,使得大家在使用STM32时有所帮助。 相关链接:https://bbs.eeworld.com.cn/upfiles/img/20093/200931217123 ...…

查看全部问答>

一个很莫名其妙的问题

最近刚刚开始接触STM32,今天调试串口的时候发现一个很无奈的问题,源代码基本都是使用keil自带的demo,就不列举了。修改以下这些设置:/* PLLCLK = 12MHz * 6= 72 MHz */     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6 ...…

查看全部问答>

9b96的EPI能同时连几个外设?

想扩展个NOR FLASH ,SDRAM,FPGA,想问下各位,能实现吗?我是说都用EPI连接?可是手册上说配EPI的模式不同,如何实现?谢谢。 如果用MCU到FPGA,再到SDRAM,,不就多此一举了吗, 如果用I2C的或者SPI的FLASH,程序是不是得先考到RAM里?  …

查看全部问答>

求指导

老师最近给了一个电动汽车电池管理系统(BMS)设计的方向,小弟有一点编程、数电、模电、fpga的基础。也看了一些BMS相关论文的论文,但始终不知道如何着手去做。 求高人指导,比如还应学习什么基础知识之类的…

查看全部问答>

秒计时器,求高帮忙

  u(一)功能简述 :   u 通过单片机系统实现秒表计时功能,可以进行暂停计时、恢复计时、设定时间和清零等操作。   u(二)设计要求 :   u系统上电,数码管显示“99”. u每隔1秒,数码管显示减1,减小到“00”后 ...…

查看全部问答>

一阶无源惯性低通滤波器的单片机实现

那位大虾帮忙下。。一阶无源惯性低通滤波器的单片机实现。。要求采用单片机采用离散化处理后,来实现滤波功能 不太懂。。。…

查看全部问答>