使用stm32cubeide stm32f407 lan8720a freertos lwip 实现udp client网络数据转串口数据过程详解
1前言
项目需要使用MCU实现网络功能,后续确定方案stm32f407 外接lan8720a实现硬件平台搭建,针对lan8720a也是用的比较多的phy,网上比较多的开发板,硬件上都是选用了这个phy,项目周期比较短,选用了这个常用phy。记得十年前,刚参加工作那会接触的第一个项目,就是MCU实现网络控制协议,当时lwip也不是很流行呢,网络协议栈只能手撕了,当时硬着头皮写,最多也写到UDP,不过对付当时的项目也够用了。抽时间,可以把当时手撕UDP的协议拿出来再看看。技术都是不断的更新迭代,十年后,现在stm32cubeide、stm32cubemx等软件都集成了lwip,这让开发更快速、便捷。但是作为过来人建议,初学者,最好刚开始还是使用固件库、lwip的源码移植,这样对系统理解的更深刻,毕竟网络协议栈真是一门大学问。
文章使用工程下载地址
udp客户端,具体测试过程参考5.3/5.4章节
https://download.csdn.net/download/li171049/90577013
udp服务端,具体测试过程参考5.5章节
https://download.csdn.net/download/li171049/90581052
2硬件设计
lan8720a的硬件原理图比较成熟,没啥特别要注意的,lan8720a和stm32f407采用rgmii的接口。
stm32f407采用串口6作为调试串口,直接通过ttl,也就是该串口的数据可以通过网络数据发送出来,也可以接收到网络数据通过该串口打印出来。
3软件设计
采用STM32CubeIDE 1.17.0,针对硬件配置如下
3.1时钟配置
3.2总体配置
如下图所示
3.3phy的复位管脚
3.4ETH的配置
如下图所示,选用RMII模式,这里需要注意,Rx Mode的配置为默认即可,针对采用操作系统、和不使用操作系统,该选项的配置会自动更改。
3.5 freeRTOS的配置
这里增大默认任务堆栈,不然会出现堆栈溢出错误。
3.6lwip的配置
主要是采用静态IP,不开启DHCP,针对电脑进行ping包测试。
4关键代码
4.1phy开机复位
针对phy复位IO,进行上电复位操作
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);HAL_Delay(55);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);HAL_Delay(55);
4.2UDP初始化
周期发送测试数据
udp_client_init();for(;;){osDelay(1000);sprintf((char*)lwip_udp_send_buf,"UDP_client send\r\n");//周期发送UDP数据到远端IPlwip_udp_send_flag |= LWIP_SEND_DATA; //标记有数据需要发送udp_client_send_data();}
5测试记录
5.1测试电脑IP配置
与板卡配置为同一网段,192.168.1.22
5.2ping包测试
电脑的的ping包测试
5.3网络调试助手接收、发送udp数据
使用网络调试助手,监听192.169.1.22:1500端口号,
测试如下图所示,可以看到能够周期接收到UDP_client send
同时发送192.169.1.70:1500,QQQ,可以看到串口能够收到对应字样
5.4串口工具接收网口数据
串口接收,随便使用一个串口工具,配置波特率115200,即可
5.5udp server测试记录
如下图所示,针对udp server测试记录,STM32工程中使用UDP server绑定1400端口号进行数据监听,收到数据后,将数据原路返回发送,同时通过串口打印接收到的数据,具体测试记录如下图所示。
6 文章使用工程下载地址
udp客户端,具体测试过程参考5.3/5.4章节
https://download.csdn.net/download/li171049/90577013
udp服务端,具体测试过程参考5.5章节
https://download.csdn.net/download/li171049/90581052