STM32F407移植OpenHarmony笔记8

继上一篇笔记,成功开启了littlefs文件系统,能读写FLASH上的文件了。

今天继续研究网络功能,让控制台的ping命令能工作。


轻量级系统使用的是liteos_m内核+lwip协议栈实现网络功能,需要进行配置开启lwip支持。

lwip的移植分为两部分,一部分是sys_arch用于适配rtos,这部分liteos_m已经实现了,

相关代码在:/kernel/liteos_m/components/net/lwip-2.1/porting/src

另一部分则是网卡驱动的适配,这部分代码适配起来和其它平台基本一样。

自己写一个ethernetif.c,在里面实现ethernetif_init,完成网卡初始化。

并定义一个struct netif实例,指定一些参数(如下),具体代码可以抄官方demo。

复制代码
netif->name[0] = 'e';
netif->name[1] = 'n';
netif->output = etharp_output;
netif->linkoutput = low_level_output;

网卡驱动的大概流程:

ethernetif_init由lwip在添加网卡的时候调用,初始化底层ETH模块;

然后创建一个线程和信号量,用于接收ETH的数据 ;

在接收线程里等待信号量,在ETH中断里发送信号量,唤醒接收线程;

接收线程调用low_level_input读取ETH数据放入pbuf中,并返回这个pbuf;

最后将pbuf丢给netif->input处理,这个函数在/third_party/lwip/src/netif/ethernet.c里面。

当协议栈要发送数据时,它会调用low_level_output,数据放在pbuf参数里面。

cpp 复制代码
    struct pbuf *p;
    struct netif *netif = (struct netif *)&stm32_netif;
    for (;;)
    {
        if (osSemaphoreAcquire(ethSemaphore, osWaitForever) == osOK)
        {
            do {
                p = low_level_input(netif);
                if (p != NULL)
                {
                    if (netif->input(p, netif) != ERR_OK)
                    {
                        pbuf_free(p);
                    }
                }
            } while (p != NULL);
        }
    }

这里简单记录一下lwip的初始化过程:

  1. 在内核初始化完成之后,调用tcpip_init(NULL, NULL);初始化lwip。

  2. 然后调用netif_add向lwip添加网卡,指定默认IP地址,网关等信息。

cpp 复制代码
netif_add(&stm32_netif, &ipaddr, &netmask, &gateway, NULL, &ethernetif_init, &ethernet_input);
netif_set_default(&stm32_netif);
netif_set_up(&stm32_netif);
  1. 如果需要DHCP获取IP,则启动dhcp client。
cpp 复制代码
dhcp_start(&stm32_netif);
dhcp_supplied_address(&stm32_netif); //判断DHCP状态

lwip的初始化就完成了。


抄完代码就开始编译调试,可以看到eth初始化的一些日志,然后ifconfig命令也能用了。

但是却发现ping不通其它IP,还要继续调试,找找原因。

经过一番研究,最后发现在/kernel/liteos_m/components/net/lwip-2.1/porting/include/lwip/lwipopts.h

这里面定义了ETH_PAD_SIZE=2,导致lwip数据解析错位,要把它改为0。

cpp 复制代码
#define ETH_PAD_SIZE  0 //从2改为0
相关推荐
三伏5224 分钟前
stm32f103系列手册IIC笔记2
笔记·stm32·嵌入式硬件
changzehai21 分钟前
Rust + VSCode + probe-rs搭建stm32-rs嵌入式开发调试环境
vscode·后端·stm32·rust·嵌入式·probe-rs
猫猫的小茶馆1 小时前
【Linux 驱动开发】三. 应用程序调用驱动过程分析
linux·arm开发·驱动开发·stm32·单片机·嵌入式硬件·pcb工艺
chengpei1471 小时前
Arduino环境下开发STM32
stm32·单片机·嵌入式硬件
A懿轩A1 小时前
【2026 最新】Flutter 编译开发 OpenHarmony 工程目录结构全解析
flutter·harmonyos·openharmony·开源鸿蒙
Embers(余烬矿)2 小时前
STM32 usb 设备描述符失败
stm32·单片机·嵌入式硬件
zd8451015002 小时前
CubeMX H743 lwip ETH初始化流程
网络·stm32·单片机
兆龙电子单片机设计2 小时前
【STM32项目开源】STM32单片机智能温控风扇系统
stm32·单片机·物联网·开源·自动化
云山工作室2 小时前
基于单片机的自动门控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计
橙露3 小时前
工业控制嵌入式开发:Modbus 协议在 STM32 中的实现与调试
服务器·网络·stm32