本例中使用的是 stm32f429-fire-challenger开发板,所以需要下载 BSP的LWIP驱动,将下载的LWIP驱动源码 drv_etc.c 和 drv_etc.h 文件添加到自己工程驱动文件所在的路径。
将drv_etc.c代码做一下更动:
将#include 《drv_log.h》改为#include 《rtdbg.h》
删除extern void phy_reset(void);和 phy_reset();
添加ETH外设配置:
打开stm32f429-fire-challenger的BSP,在board目录下找到stm32f4xx_hal_msp.c文件,移植到工程中。
然后改动stm32f4xx_hal_msp.c里的代码:
把#include “main.h”改为#include “board.h”
删除多余的配置,只保留void HAL_ETH_MspInit(ETH_HandleTypeDef* heth)和void HAL_ETH_MspDeInit(ETH_HandleTypeDef* heth)
打开include “board.h”,添加#define PHY_USING_LAN8720A
移植完成,编译。
4.2.3 网络设备层和LAN8720驱动解析
4.2.3.1 网络设备层解析
RT-Thread 的 lwIP 移植在原版的基础上,添加了网络设备层以替换原来的驱动层。和原来的驱动层不同的是,对于以太网数据的收发采用了独立的双线程结构,erx 线程和 etx 线程在正常情况下,两者的优先级设置成相同,用户可以根据自身实际要求进行微调以侧重接收或发送。
数据接收流程:
当以太网硬件设备收到网络报文产生中断时,接收到的数据会被存放到接收缓冲区,然后以太网中断程序会发送邮件来唤醒 erx 线程,erx 线程会按照接收到的数据长度来申请 pbuf,并将数据放入 pbuf 的 payload 中,然后将 pbuf 通过邮件发送给 去处理。
数据发送流程:
当有数据需要发送时,LwIP 会将数据通过邮件发送给 etx 线程,然后永久等待在 tx_ack 信号量上。etx 线程接收到邮件后,通过调用驱动中的 rt_stm32_eth_tx() 函数发送数据,发送完成之后再发送一次 tx_ack 信号量唤醒 LwIP
网络设备介绍:
RT-Thread 网络设备继承了标准设备,由 eth_device 结构体定义:
1struct eth_device
2{
3 /* 标准设备 */
4 struct rt_device parent;