糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > STM32CubeMX学习--STM32F429ZG RMII+LAN8720A移植LWIP网络协议

STM32CubeMX学习--STM32F429ZG RMII+LAN8720A移植LWIP网络协议

时间:2023-01-16 05:59:56

相关推荐

STM32CubeMX学习--STM32F429ZG RMII+LAN8720A移植LWIP网络协议

工程文件已上传资源,需要可以自行下载。工程文件

原理图

其中LAN8742A的时钟由MCU的MCO2提供50MHZ。

STM32CubeMX工程

SYS

选择Serial Wire下载方式

RCC

这里选择MCO2位LAN8742A提供时钟源,注意MCO2需要配置成VERY_HIGH模式,即超快速模式,否则时钟源出问题,网线识别不到。

时钟树

设置如图所示,为了满足后面USB时钟为48M,这里MCO2从PLLI2SCLK取时钟。

ETH

这里选择RMII精简模式,LAN8742地址线悬空,所以设置为0。注意:这里选择RMII方式时,默认配置的PIN脚TXD0,TXD1与原理图不同。需要手动改过来。

LWIP

这里我们选择不使用DHCP,使能ICMP即可使用ping指令ping开发板。

复位引脚设置

堆栈设置

代码修改

main.c

在主函数中添加处理函数

int main(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_LWIP_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){MX_LWIP_Process();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}

ethernetif.c

添加LAN8742复位程序

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 *//* Enable Peripheral clock */__HAL_RCC_ETH_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOG_CLK_ENABLE();/**ETH GPIO ConfigurationPC1------> ETH_MDCPA1------> ETH_REF_CLKPA2------> ETH_MDIOPA7------> ETH_CRS_DVPC4------> ETH_RXD0PC5------> ETH_RXD1PB11------> ETH_TX_ENPG13------> ETH_TXD0PG14------> 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_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);GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14;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(GPIOG, &GPIO_InitStruct);/* USER CODE BEGIN ETH_MspInit 1 */HAL_GPIO_WritePin(ETH_RESET_GPIO_Port,ETH_RESET_Pin,GPIO_PIN_RESET);HAL_Delay(50);HAL_GPIO_WritePin(ETH_RESET_GPIO_Port,ETH_RESET_Pin,GPIO_PIN_SET);HAL_Delay(50);/* USER CODE END ETH_MspInit 1 */}}

lwip.c

确认IP参数正确

void MX_LWIP_Init(void){/* IP addresses initialization */IP_ADDRESS[0] = 192;IP_ADDRESS[1] = 168;IP_ADDRESS[2] = 0;IP_ADDRESS[3] = 10;NETMASK_ADDRESS[0] = 255;NETMASK_ADDRESS[1] = 255;NETMASK_ADDRESS[2] = 255;NETMASK_ADDRESS[3] = 0;GATEWAY_ADDRESS[0] = 192;GATEWAY_ADDRESS[1] = 168;GATEWAY_ADDRESS[2] = 0;GATEWAY_ADDRESS[3] = 1;/* Initilialize the LwIP stack without RTOS */lwip_init();/* IP addresses initialization without DHCP (IPv4) */IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);/* add the network interface (IPv4/IPv6) without RTOS */netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);/* Registers the default network interface */netif_set_default(&gnetif);if (netif_is_link_up(&gnetif)){/* When the netif is fully configured this function must be called */netif_set_up(&gnetif);}else{/* When the netif link is down this function must be called */netif_set_down(&gnetif);}/* Set the link callback function, this function is called on change of link status*/netif_set_link_callback(&gnetif, ethernetif_update_config);/* Create the Ethernet link handler thread *//* USER CODE BEGIN 3 *//* USER CODE END 3 */}

以上程序无误之后,编译下载。接通网线到电脑端,电脑端设置静态IP与开发板在同一网段,在DOS命令下即可ping通开发板。

问题总结

在调试过程中遇到很多问题,导致开发板无法ping通。这里为大家提供一下调试思路:

首先确认时钟频率是否正确,示波器测量。保证REF_CLK和LAN8742A的pin5都有50M时钟。在硬件没问题的情况下,时钟源没问题,LAN8742就可以工作,此时电脑端能够识别到网线。确保RMII的IO配置与原理图一致,默认的可能不同MCO2一定要配置成VERY_HIGH模式复位引脚正确LAN8742A的地址线如果悬空,地址应为0尽量保证CubeMX软件和库是最新的,旧版可能出问题

如果觉得《STM32CubeMX学习--STM32F429ZG RMII+LAN8720A移植LWIP网络协议》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。