rt-thread驱动篇(06)---STM32F429单片机lwip网络协议栈添加

目录

参考示例

前言

一、RT-Thread中的lwip

二、驱动添加

2.1 CubeMX配置

2.2、添加复位驱动

三、ENV配置

3.1、添加以太网驱动

3.2、选中 lwIP 与 net dev

3.3、选中 SAL 与 DFS

3.4、选中 network_samples


参考示例

网络协议栈驱动移植笔记

在 STM32F407 上应用网络功能

前言

以太网芯片有很多种,常见的大致可以分成 3 种:

  • 以太网芯片只有 PHY(物理接口收发器 ),需要单片机带 MAC(以太网媒体接入控制器 ),通过 MII 或者 RMII 接口和单片机通讯。例如 LAN8720。
  • 以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯。例如 ENC28J60。
  • 以太网芯片带 MAC 和 PHY,通过 SPI 接口和单片机通讯,同时内置硬件协议栈,适合低速单片机。例如 W5500。

板卡上使用的是LAN8720以太网芯片,只有 PHY(物理接口收发器 ),单片机带 MAC(以太网媒体接入控制器 ),通过RMII 接口和单片机通讯,复位引脚是PH3

一、RT-Thread中的lwip

RT-Thread在移植lwIP的过程中根据RT-Thread的特点进行了适当调整。

RT-Thread操作系统中的lwIP是从lwIP发布原始版本移植过来,然后添加了设备层以替换原来的驱动层。不同于原版,这里RT-Thread对于以太网数据的收发采用了独立的双线程(erx线程与etx线程)结构:

  • erx线程用于以太网报文的接收──当以太网硬件设备收到网络报文产生中断时,中断服务例程将会通过邮箱的形式唤醒erx线程,让erx线程主动进行以太网报文收取过程,当erx线程收到有效网络报文后,它通过邮箱的形式通知给LwIP的主线程(tcp线程);
  • tcp的发送操作则是通过邮箱的形式唤醒etx线程进行实际的以太网硬件写入。在正常情况下,erx线程和etx线程的优先级是相同的,用户可以根据自身实际要求进行微调以侧重接收或发送。

RT-Thread中将lwIP应用起来主要包括三个核心步骤:

1. 创建收发包线程,调用接口eth_system_device_init_private(),这步在已经在lwip_system_init()中调用了

2. 提供网卡驱动,调用网卡初始化函数eth_device_init,注册网卡设备(为网卡添加名称,IP、子网掩码、网关,网卡设备使用的发包和收包接口函数等)

3. 初始化lwIP,创建lwIP线程,调用接口lwip_system_init()。系统已经通过自动初始化机制自动调用了(INIT_PREV_EXPORT(lwip_system_init);)。

至此,三个步骤完成之后,应用层便可以直接与外界通讯。

二、驱动添加

网卡外设驱动部分rtthread已经在\libraries\HAL_Drivers\drv_eth.c/h中写好了,唯一要改的就是在phy_reset.c中添加PHY网卡的复位。在drv_eth.c中会调用HAL库的HAL_ETH_Init函数来初始化ETH外设,调用顺序如下:

rt_stm32_eth_init()/dev_eth.c ---> HAL_ETH_Init()/stm32f4xx_hal_eth.c ---> HAL_ETH_MspInit()/stm32f4xx_hal_msp.c;所以在添加以太网外设之前,需要先通过CubeMX配置ETH生成HAL_ETH_MspInit函数,完成对ETH外设时钟、IO引脚的配置

2.1 CubeMX配置

2.2、添加复位驱动

#define ETH_RESET_IO    GET_PIN(H, 3)                //PHY RESET PIN

/* phy reset */
void phy_reset(void)
{
    rt_pin_write(ETH_RESET_IO, PIN_HIGH);
    rt_thread_mdelay(100);
    rt_pin_write(ETH_RESET_IO, PIN_LOW);
    rt_thread_mdelay(100);
}

int phy_init(void)
{
    rt_pin_mode(ETH_RESET_IO, PIN_MODE_OUTPUT);
    rt_pin_write(ETH_RESET_IO, PIN_LOW);
    return RT_EOK;
}
INIT_BOARD_EXPORT(phy_init);

三、ENV配置

在ENV中选中的组件或软件包,如果开启了包管理器自动更新或者手动使用 pkgs --update 命令,就能自动将选择的软件包更新到BSP中;然后再使用 scons --target=xxx 命令编译BSP时,选择的软件包相关源代码就会被自动添加进工程中并进行编译

3.1、添加以太网驱动

选中网卡驱动,开启 BSP_USING_ETH 和 PHY_USING_LAN8720A宏定义,开启后在scons构建工程时,drv_eth.c phy_reset.c 就能自动添加进工程中

3.2、选中 lwIP 与 net dev

启用 lwIP 与 net device: 

3.3、选中 SAL 与 DFS

打开 SAL 层,并打开 BSD socket:

 fd 的管理在文件系统中,所以需要添加文件系统:

3.4、选中 network_samples

这个软件包包含一些网络操作的例程,在添加完网络驱动后可以用来进行网络功能的测试

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值