0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在i.MX RT微控制器上初始化LWIP协议栈

恩智浦MCU加油站 来源:恩智浦MCU加油站 2024-10-12 11:48 次阅读

在i.MX RT微控制器上初始化LWIP协议栈是一个复杂但有趣的过程,它涉及多个步骤和关键组件的配置。以下是该初始化流程的介绍:

LWIP协议栈与开发平台简介

LWIP(Light Weight IP),是一种轻量化且开源的TCP/IP协议栈。LwIP在有限的RAMROM条件下,实现了一个完整的TCP/IP 协议栈,并且LwIP在MCU平台上得到了非常广泛的应用。此外,它既可以基于操作系统运行,也可以在裸机情况下运行。

TCP/IP协议栈的模型结构如下图所示:

b02e601a-877e-11ef-b8af-92fbcf53809c.png

本篇文章基于i.MX RT四位数跨界MCU平台,RT四位数跨界MCU最高主频可达1Ghz,并且搭载了很多性能强劲的外设,广泛的应用于工业,自动化,IoT,消费电子等领域,并且NXP官方提供免费的IDE,开发工具以及SDK软件包等,为开发者提供了全面的支持。

以太网接口及PHY管理接口硬件初始化

Ethernet MAC与PHY之间通过以太网接口连接,常见的接口有RMII,MII等。与此同时,RT四位数上的EthernetMAC外设也配备了PHY管理接口,可通过MDC MDIO来实现PHY相关寄存器的读写。

此处以RT1060举例,在RT1060 EVK上默认使用的是RMII以太网接口,对照原理图完成RMII相关管脚的初始化。

b0532292-877e-11ef-b8af-92fbcf53809c.png

MDC,MDIO初始化:

b06dd024-877e-11ef-b8af-92fbcf53809c.png

PHYINIT以及RESET管脚初始化,配成GPIO输出即可:

b094b608-877e-11ef-b8af-92fbcf53809c.png

RMII的TX_CLK由MCU提供,因此要将TX_CLK的方向配置为输出:

b0a8dd68-877e-11ef-b8af-92fbcf53809c.png

至此,以太网接口,PHY管理接口等硬件配置基本初始化完成。

LWIP时基初始化与超时事件注册

在LWIP中,经常会进行一些超时判定,例如ARP缓存表的时间管理,IP分片数据报的重装等待超时等等,并且LwIP也提供了超时事件注册函数sys_timeout,在RT1060官方SDK的ping bm demo中就是通过超时事件来发送ping请求。

而超时的判定需要一个时基,MCU中一般会用系统滴答定时器来作为时基,且时间间隔设置为1ms并开启中断。每一次进中断都会将当前时间加1。设置滴答定时器的代码如下图所示。

b0bcfbcc-877e-11ef-b8af-92fbcf53809c.png

在LWIP协议栈初始化时,也需要注册一些超时事件,通过调用sys_timeout函数,该函数中又会调用sys_timeout_abs函数。

在sys_timeout_abs函数中会计算出超时事件即将超时的时间,并且根据超时时间将这些超时事件连接成一个链表,如下图所示。当超时发生时就会调用对应的处理函数。

b0c68020-877e-11ef-b8af-92fbcf53809c.png

SDK中会把需要注册的超时事件都放在一个数组中,在初始化时调用注册函数去一个个注册这些超时事件。超时事件数组如下图所示。

b0f03442-877e-11ef-b8af-92fbcf53809c.png

LWIP内存堆内存池初始化

在LwIP中,内存分配策略一般有两种,一种是分配固定大小的内存块。如TCP 首部、UDP 首部,IP 首部,以太网首部等都是固定的数据结构,其大小就是一个固定的值,那么我们就能采用这种方式分配这些固定大小的内存空间,这样子的效率就会大大提高。另一种是利用内存堆进行动态分配,属于可变长度的内存块。

在LWIP协议栈初始化时一定要对这两种内存分配方式进行初始化,方便后续协议栈进行相关内存分配。内存堆初始化代码如下所示,其中LWIP_RAM_HEAP_POINTER实际上就是分配的内存堆数组首地址。

b103a5c2-877e-11ef-b8af-92fbcf53809c.png

内存堆数组大小为想要分配的内存堆大小对齐后再加上两倍的mem结构体对齐后的大小,mem结构体中会存放一些内存堆相关管理信息,宏定义如下图所示。

b11d5d6e-877e-11ef-b8af-92fbcf53809c.png

不难看出在内存堆初始化代码中实际上就是初始化了两个mem结构体。第一个mem结构体在内存堆起始地址处,next成员为MEM_SIZE_ALIGNED, prev和used成员皆初始化为0。

第二个mem结构体ram_end设置为内存堆首地址偏移MEM_SIZE_ALIGNED处,used变量设置为1,next和prev皆指向偏移MEM_SIZE_ALIGNED的位置。

内存池初始化函数为memp_init,如下图所示。它使用轮询的方式调用memp_init_pool去初始化每一类内存池,memp_pools数组中存放了初始化过的memp结构体。

b133a5ce-877e-11ef-b8af-92fbcf53809c.png

在memp_init_pool中会根据初始化过的memp结构体中的一些参数,比如下图中所示的num,num代表有多少个内存块,memp_init_pool中会根据num将内存块连接成单链表。

b148ff64-877e-11ef-b8af-92fbcf53809c.png

网卡挂载及初始化

调用netif_add来挂载网卡,netif结构体是抽象出来的网卡结构体,IP地址,网关,子网掩码等都会保存在该结构体中。网卡初始化函数也会作为参数之一传入netif_add函数,并在netif_add函数中被调用。在该初始化函数中最终会完成以下几部分初始化:

1.以太网相关数据结构的初始化,包括rx_buffer,tx_buffer, buffer descriptor,buffer descriptor ring。初始化这些数据结构,以便在接收发送以太网数据时使用。

2.phy的初始化,初始化以太网外设中的MDC MDIO,如下图所示。

b16495da-877e-11ef-b8af-92fbcf53809c.png

通过MDC MDIO去操作PHY相关的寄存器,例如去配置PHY的百兆千兆模式,软复位PHY,检查自动协商,连接状态以及配置LED等等。确保PHY工作在想要的状态下,部分初始化PHY的代码如下所示。

b17482f6-877e-11ef-b8af-92fbcf53809c.png

3.设置netif相关参数,例如MAC地址长度,MTU,flags,以及网络接口层输入,网络接口层输出函数等。

4.初始化Ethernet MAC外设,去配置以太网外设中的接口类型,速度,工作模式,中断等等。部分配置代码如下所示。

b187f836-877e-11ef-b8af-92fbcf53809c.png

LWIP不同API初始化

在完成上述初始化流程之后,还需要调用一些LwIP提供的API,LwIP常用的API有RAW API, Socket API, NETCONN API三种,前者是不需要基于操作系统的,后两者需要基于操作系统运行。这三种API在初始化时也是不同的,Socket API和NETCONN API类似,此处以RT1060 SDK中的ping demo来举例说明。

首先是RAW API,在raw.c中定义了一个raw_pcb结构体,初始化时会定义一个新的raw_pcb结构体并插入raw_pcbs链表。并且给新定义的raw_pcb赋初值,如下图所示,通过raw_recv绑定ping_recv函数。通过raw_bind绑定IP地址,并且注册一个超时事件,超时时就调用ping_timeout函数,参数为ping_pcb。在ping_timeout函数中会发送ping请求。

b1936b80-877e-11ef-b8af-92fbcf53809c.png

当LWIP跑在操作系统上时,LWIP协议栈是作为一个独立线程存在的。因此,在初始化时要创建tcpip_thread线程。用户代码与tcpip_thread线程之间是通过邮箱进行数据的交互的。因此,在初始化时也需要创建一个邮箱。

b1ac9eb6-877e-11ef-b8af-92fbcf53809c.png

在使用Socket API时,首先要调用lwip_socket函数向内核申请一个套接字,然后调用setsockopt设置套接字的一些选项。接着就可以调用lwip_sendto函数去发送数据包。调用recvfrom函数接收数据包。

至此,在i.MX RT使用LwIP协议栈初始化流程介绍完毕,通过理解和实践这些步骤,开发者可以在i.MX RT微控制器上成功初始化LWIP协议栈,并实现网络通信功能。

总体看来,整个初始化流程还是相对复杂的,这个过程不仅涉及硬件驱动编程和TCP/IP协议栈的配置,还需要对内存管理、中断处理、超时检查等关键知识点有深入的理解。感兴趣的读者可以下载RT四位数的SDK深入了解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7377

    浏览量

    150549
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1334

    浏览量

    78845
  • LwIP
    +关注

    关注

    2

    文章

    85

    浏览量

    26999
  • 协议栈
    +关注

    关注

    2

    文章

    138

    浏览量

    33585

原文标题:在i.MX RT使用LWIP协议栈的初始化流程

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【大联大品佳 NXP i.MX RT1050试用申请】i.MX RT1050 3D打印机控制器

    项目名称:i.MX RT1050 3D打印机控制器试用计划:申请理由本人在开源硬件行业有五年多的学习和开发经验,曾设计多款FDM,SLA,LCD 3D打印机控制板,参与公司3D打印机的
    发表于 08-10 18:23

    i.MX RT1050平台的相关资料推荐

    的首款跨界处理。该处理器具备应用处理的高性能与高度集成的优势,更具有微控制器的易用性和实时功能。NXP Semiconductors(恩智浦半导体)公司根据用户成本需求,在 i.MX
    发表于 11-29 07:19

    如何使用sdphost的ROM引导加载程序中区分i.MX RT1062和i.MX RT 1064?

    有什么方法可以通过读取特定寄存来确定微控制器类型,而不是系列或 UID?我想在使用 sdphost 的 ROM 引导加载程序中区分 i.MX RT1062 和
    发表于 04-27 08:37

    恩智浦i.MX RT600跨界微控制器在功耗、性能和存储方面有显著特点

    恩智浦半导体近日宣布i.MX RT600跨界微控制器 (MCU) 上市,这是一款面向音频、语音和机器学习等超低功耗、安全边缘应用的理想解决方案。
    的头像 发表于 03-15 14:29 2683次阅读

    恩智浦i.MX RT1170开创GHz MCU时代

    自2017年上市以来,i.MX RT系列取得了优秀的市场表现。i.MX RT1170跨界MCU是恩智浦i.MX
    的头像 发表于 03-22 11:14 3374次阅读

    恩智浦i.MX RT1170在将该系列带上了更高的层面

    自2017年上市以来,i.MX RT系列取得了优秀的市场表现。i.MX RT1170跨界MCU是恩智浦i.MX
    的头像 发表于 05-18 11:15 3672次阅读

    i.MX RT开发笔记-01 | 初识 i.MX RT1062 跨界MCU

    一、跨界处理i.MX RT 系列 MCU 是由 NXP 推出的跨界处理,跨界是指该系列MCU的定位既非传统的微控制器、也非传统的微处理
    发表于 10-29 10:21 28次下载
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>开发笔记-01 | 初识 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062 跨界MCU

    【044】SylixOS 正式支持 i.MX RT1050平台

    的首款跨界处理。该处理器具备应用处理的高性能与高度集成的优势,更具有微控制器的易用性和实时功能。NXP Semiconductors(恩智浦半导体)公司根据用户成本需求,在 i.MX
    发表于 11-19 12:51 14次下载
    【044】SylixOS 正式支持 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1050平台

    i.MX RT开发笔记-08 | i.MX RT1062嵌套中断向量控制器NVIC(按键中断检测)

    系列文章目录i.MX RT开发笔记-01 | 初识 i.MX RT1062 跨界MCUi.MX RT
    发表于 12-01 13:51 2次下载
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>开发笔记-08 | <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062嵌套中断向量<b class='flag-5'>控制器</b>NVIC(按键中断检测)

    RT-Thread & NXP 发布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界处理系列。该系列下又包括 i.MX RT1020、i.MX
    发表于 12-07 13:06 2次下载
    <b class='flag-5'>RT</b>-Thread & NXP 发布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    何在i.MX RT1050使用FlexIO模块模拟XY2-100振镜通信协议接口

    一、概述 本文介绍了如何使用i.MX RT系列芯片的FlexIO实现XY2-100激光振镜控制协议。FlexIO模块是NXP Kineti
    的头像 发表于 05-18 09:22 3432次阅读
    如<b class='flag-5'>何在</b><b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1050使用FlexIO模块模拟XY2-100振镜通信<b class='flag-5'>协议</b>接口

    i.MX RT10xx使用FlexIO实现XY2-100振镜控制协议

    本文介绍了如何使用i.MX RT系列芯片的FlexIO实现XY2-100激光振镜控制协议。FlexIO模块是NXP Kinetis和
    的头像 发表于 05-18 09:21 5499次阅读
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>10xx使用FlexIO实现XY2-100振镜<b class='flag-5'>控制</b><b class='flag-5'>协议</b>

    i.MX RT的FlexRAM配置问题

    i.MX RT的FlexRAM配置问题
    的头像 发表于 10-24 15:46 707次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置问题

    基于NXP微控制器i.MX RT1170的多人体实时检测算法和系统

    基于NXP微控制器i.MX RT1170的多人体实时检测算法和系统
    的头像 发表于 10-26 16:27 963次阅读
    基于NXP<b class='flag-5'>微控制器</b><b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1170的多人体实时检测算法和系统

    使用LwIP协议浅析实战分析(i.MX RT

    LWIP协议与网络分层 LwIP(Light weight IP),是一种轻量化且开源的TCP/IP协议,它可以在有限的RAM和ROM条件
    的头像 发表于 02-02 17:05 1358次阅读
    使用<b class='flag-5'>LwIP</b><b class='flag-5'>协议</b><b class='flag-5'>栈</b>浅析实战分析(<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>)