RT-Thread studio学习笔记2-驱动LAN8720A

使用的板子是正点原子探索者STM32F407,板载的以太网芯片是LAN8720A,现在在RT-Thread studio下驱动LAN8720A。

打开board.h找到

/*-------------------------- ETH CONFIG BEGIN --------------------------*/

/** if you want to use eth you can use the following instructions.
 *
 * STEP 1, define macro related to the eth
 *                 such as    BSP_USING_ETH
 *
 * STEP 2, copy your eth init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end if board.c file
 *                 such as     void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)
 *
 * STEP 3, modify your stm32xxxx_hal_config.h file to support eth peripherals. define macro related to the peripherals
 *                 such as     #define HAL_ETH_MODULE_ENABLED
 *
 * STEP 4, config your phy type
 *                 such as     #define PHY_USING_LAN8720A
 *                             #define PHY_USING_DM9161CEP
 *                             #define PHY_USING_DP83848C
 * STEP 5, implement your phy reset function in the end of board.c file
 *                 void phy_reset(void)
 *


注释中官方已经告诉我们怎么进行以太网驱动的移植。

第一步,启用BSP_USING_ETH定义在board.h的300行,取消注释,启用define PHY_USING_LAN8720A

第二步,初始化RMII接口硬件

通过 stm32cubemx工具使能RMII硬件,打开stm32cubemx新建工程,搜索stm32f407zg,然后打开ETH功能,选择模式为mode,设置 PHY Speed mask、PHY Duplex mask设置如下

RT-Thread studio学习笔记2-驱动LAN8720A_第1张图片

 项目设置中,选中每一个外设生产.c、.h文件

RT-Thread studio学习笔记2-驱动LAN8720A_第2张图片点击GENERATE CODE生产代码,

第三步,通过stm32cubemx生成后,打开eth.c文件,找到HAL_ETH_MspInit函数,将其拷贝到/drivers/board.c中,打开探索者的原理图可以看到,ETH_RESET接在PD3,定义#define RESET_IO GET_PIN(D, 3),进行编译,通过
 

void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(ethHandle->Instance==ETH)
  {
  /* USER CODE BEGIN ETH_MspInit 0 */

  /* USER CODE END ETH_MspInit 0 */
    /* ETH clock enable */
    __HAL_RCC_ETH_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**ETH GPIO Configuration
    PC1     ------> ETH_MDC
    PA1     ------> ETH_REF_CLK
    PA2     ------> ETH_MDIO
    PA7     ------> ETH_CRS_DV
    PC4     ------> ETH_RXD0
    PC5     ------> ETH_RXD1
    PB11     ------> ETH_TX_EN
    PB12     ------> ETH_TXD0
    PB13     ------> ETH_TXD1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN ETH_MspInit 1 */

  /* USER CODE END ETH_MspInit 1 */
  }
}

#define RESET_IO GET_PIN(D, 3)
void phy_reset(void)
{
   rt_pin_mode(RESET_IO, PIN_MODE_OUTPUT);
   rt_pin_write(RESET_IO, PIN_HIGH);
   rt_thread_mdelay(50);
   rt_pin_write(RESET_IO, PIN_LOW);
   rt_thread_mdelay(50);
   rt_pin_write(RESET_IO, PIN_HIGH);
}

第四步,打开 /drivers/ stm32f7xx_hal_conf.h

在第60行使能 #define HAL_ETH_MODULE_ENABLED

添加lwip协议栈:打开RT-Thread Settings->选择lwip,设置如下图,ctrl+s保存,并编译

RT-Thread studio学习笔记2-驱动LAN8720A_第3张图片

第四步,开发板接在路由器下,自动获取到DHCP,通过电脑cmd命令ping通

 RT-Thread studio学习笔记2-驱动LAN8720A_第4张图片

 

你可能感兴趣的:(单片机,stm32,嵌入式硬件,arm,学习)