移植环境:RT-THREAD Studio
编译环境:MDK5
系统版本:rt thread 4.0.3
LWiP版本:2.0.2
硬件环境:野火STM32H750开发板
PHY:LAN8720A
此前需要感谢论坛的各位大佬,分享了关于ART-PI开发板的移植LWIP的教程,此次的成功都是站在巨人的肩膀上。关于各位大佬的文章我就不放出处了,论坛里面搜索ART-PI关键字有很多关于这方面的文章。
好了接下来我们谈谈正题,关于野火开发板STM32H750基于LAN8720A移植LWIP的详解,如有错误请各位大佬指正。驱动的配置,和一些配置过程在这篇帖子里面,也是笔者移植完成的,关于里面的出现的问题是笔者的开发板硬件的问题现在已经解决。
接下来谈谈关于ART-PI开发板的工程移植到野火STM32H750上的一些改动,关于硬件引脚的改动void
HAL_ETH_MspInit(ETH_HandleTypeDef* heth)函数的改动:
static void ETH_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ETH_MDIO_GPIO_CLK_ENABLE();
ETH_MDC_GPIO_CLK_ENABLE();
ETH_RMII_REF_CLK_GPIO_CLK_ENABLE();
ETH_RMII_CRS_DV_GPIO_CLK_ENABLE();
ETH_RMII_RXD0_GPIO_CLK_ENABLE();
ETH_RMII_RXD1_GPIO_CLK_ENABLE();
ETH_RMII_TX_EN_GPIO_CLK_ENABLE();
ETH_RMII_TXD0_GPIO_CLK_ENABLE();
ETH_RMII_TXD1_GPIO_CLK_ENABLE();
GPIO_InitStructure.Pin = ETH_MDIO_PIN;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Alternate = ETH_MDIO_AF;
HAL_GPIO_Init(ETH_MDIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_MDC_PIN;
GPIO_InitStructure.Alternate = ETH_MDC_AF;
HAL_GPIO_Init(ETH_MDC_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_RMII_REF_CLK_PIN;
GPIO_InitStructure.Alternate = ETH_RMII_REF_CLK_AF;
HAL_GPIO_Init(ETH_RMII_REF_CLK_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_RMII_CRS_DV_PIN;
GPIO_InitStructure.Alternate = ETH_RMII_CRS_DV_AF;
HAL_GPIO_Init(ETH_RMII_CRS_DV_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_RMII_RXD0_PIN;
GPIO_InitStructure.Alternate = ETH_RMII_RXD0_AF;
HAL_GPIO_Init(ETH_RMII_RXD0_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_RMII_RXD1_PIN;
GPIO_InitStructure.Alternate = ETH_RMII_RXD1_AF;
HAL_GPIO_Init(ETH_RMII_RXD1_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_RMII_TX_EN_PIN;
GPIO_InitStructure.Alternate = ETH_RMII_TX_EN_AF;
HAL_GPIO_Init(ETH_RMII_TX_EN_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_RMII_TXD0_PIN;
GPIO_InitStructure.Alternate = ETH_RMII_TXD0_AF;
HAL_GPIO_Init(ETH_RMII_TXD0_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = ETH_RMII_TXD1_PIN;
GPIO_InitStructure.Alternate = ETH_RMII_TXD1_AF;
HAL_GPIO_Init(ETH_RMII_TXD1_PORT, &GPIO_InitStructure);
}
void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)
{
ETH_GPIO_Config();
HAL_NVIC_SetPriority(ETH_IRQn, 0x7, 0);
HAL_NVIC_EnableIRQ(ETH_IRQn);
__HAL_RCC_ETH1MAC_CLK_ENABLE();
__HAL_RCC_ETH1TX_CLK_ENABLE();
__HAL_RCC_ETH1RX_CLK_ENABLE();
}
此处笔者直接拷贝的野火原来的例程,当然也可以观看野火的原理图,然后根据STM32CubeMX生成这段代码,想要有更多的游戏体验的开发友,当然可以毅然决然的选择后者,这里笔者需要抓经项目时间,所以直接复制了野火的例程。
由于野火的开发板LAN8720A的硬件复位引脚没有与单片机连接,所以需要修改复位方式使用软件复位方式的得修改drv_eth.c文件里面的static int phy_reset(void);函数如下所示:
static int phy_reset(void)
{
if(HAL_ETH_WritePHYRegister(&EthHandle, LAN8720A_PHY_ADDRESS, PHY_BCR, PHY_RESET) != HAL_OK)
{
return HAL_ERROR;
}
HAL_Delay(PHY_RESET_DELAY);
return HAL_OK;
}
如果想让代码更具有观赏性,可选择用宏编译的方式注释或启动某段代码,这里笔者直接注释了硬件复位的部分。到此了移植的过程基本算完成了,但是笔者阅读了野火的移植过程,也阅读了ART-PI的工程源码,区别还是挺大的。此次算是圆满完成移植的过程,另外还想说的是RTT studio确实省下了不少时间。
原作者:Dbug洋葱
|