记录一下通过STM32CubeMX配置STM32F407使用lan8720A使用lwip实现dhcp功能,使用硬件正点原子战舰开发板,STM32CubeMX版本6.4;FreeRTOS版本10.2.1,接口:cmsis_v2。
1.硬件主要原理图如下:(lan8720正常工作,C11电压1.2v。PHY地址设置:MAC层通过SMI总线对PHY进行读写操作,LAN8720通过设置RXER/PHYAD0引脚来设置PHY地址,芯片内部自带下拉电阻,当硬复位结束后,LAN8720会读取该引脚电平,作为器件的SMI地址;若该引脚接下拉电阻时(浮空也可,因为内部自带下拉电阻),SMI地址为0;若该引脚接上拉电阻,SMI地址为1;这里采用的是引脚浮空,即设置LAN8720地址为0,后面配置地址会用得到。)
2.STM32CubeMX配置eth截图:
首先把时钟配置下:
1)配置PHY地址为0,上面提到第10脚悬空时地址为0.
2) PHY选择userPHY ,A用系统自带的。
3)B用系统自带的,特殊说明第三个参数最好改为数据手册的参数:
4)PHY参数设置由来:
5)其余配置截图:
3.freestos配置(没什么特殊操作,只是添加了2个任务而已):
4.LWIP配置:
我这里使用的是动态获取IP地址
其余配置展示,几乎没改动,改动的都标记出来了
打开 debug调试信息:
在keil(freestos的一个任务里)中添加如下代码查看是否获取动态ip成功:
要包含如下头文件:
为了方便测试,整个部分代码粘贴如下,请按需复制。
void StartDefaultTask(void *argument)
{
/* init code for LWIP */
MX_LWIP_Init();
/* USER CODE BEGIN StartDefaultTask */
App_Ethernet_init();
printf("DMA INIT");
struct dhcp *dhcp;
/* Infinite loop */
for(;;)
{
/*测试动态获取ip用*/
dhcp=netif_dhcp_data(&gnetif);
printf("DHCP IP address: %s\n", ip4addr_ntoa(&dhcp->offered_ip_addr));
printf("DHCP Subnet mask: %s\n", ip4addr_ntoa(&dhcp->offered_sn_mask));
printf("DHCP Default gateway: %s\n", ip4addr_ntoa(&dhcp->offered_gw_addr));
/*测试动态获取ip用*/
printf("IAM LIVEING1");
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
osDelay(500);
//MX_LWIP_Process();
}
/* USER CODE END StartDefaultTask */
}
最后截取下测试成功的打印信息截图:
至此,整个工程调试结束,如果对你有帮助请点个赞再走。