0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在i.MX RT微控制器上初始化LWIP協(xié)議棧

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 2024-10-12 11:48 ? 次閱讀

在i.MX RT微控制器上初始化LWIP協(xié)議棧是一個復雜但有趣的過程,它涉及多個步驟和關(guān)鍵組件的配置。以下是該初始化流程的介紹:

LWIP協(xié)議棧與開發(fā)平臺簡介

LWIP(Light Weight IP),是一種輕量化且開源的TCP/IP協(xié)議棧。LwIP在有限的RAMROM條件下,實現(xiàn)了一個完整的TCP/IP 協(xié)議棧,并且LwIP在MCU平臺上得到了非常廣泛的應(yīng)用。此外,它既可以基于操作系統(tǒng)運行,也可以在裸機情況下運行。

TCP/IP協(xié)議棧的模型結(jié)構(gòu)如下圖所示:

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

本篇文章基于i.MX RT四位數(shù)跨界MCU平臺,RT四位數(shù)跨界MCU最高主頻可達1Ghz,并且搭載了很多性能強勁的外設(shè),廣泛的應(yīng)用于工業(yè),自動化,IoT,消費電子等領(lǐng)域,并且NXP官方提供免費的IDE,開發(fā)工具以及SDK軟件包等,為開發(fā)者提供了全面的支持。

以太網(wǎng)接口及PHY管理接口硬件初始化

Ethernet MAC與PHY之間通過以太網(wǎng)接口連接,常見的接口有RMII,MII等。與此同時,RT四位數(shù)上的EthernetMAC外設(shè)也配備了PHY管理接口,可通過MDC MDIO來實現(xiàn)PHY相關(guān)寄存器的讀寫。

此處以RT1060舉例,在RT1060 EVK上默認使用的是RMII以太網(wǎng)接口,對照原理圖完成RMII相關(guān)管腳的初始化。

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

至此,以太網(wǎng)接口,PHY管理接口等硬件配置基本初始化完成。

LWIP時基初始化與超時事件注冊

在LWIP中,經(jīng)常會進行一些超時判定,例如ARP緩存表的時間管理,IP分片數(shù)據(jù)報的重裝等待超時等等,并且LwIP也提供了超時事件注冊函數(shù)sys_timeout,在RT1060官方SDK的ping bm demo中就是通過超時事件來發(fā)送ping請求。

而超時的判定需要一個時基,MCU中一般會用系統(tǒng)滴答定時器來作為時基,且時間間隔設(shè)置為1ms并開啟中斷。每一次進中斷都會將當前時間加1。設(shè)置滴答定時器的代碼如下圖所示。

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

在LWIP協(xié)議棧初始化時,也需要注冊一些超時事件,通過調(diào)用sys_timeout函數(shù),該函數(shù)中又會調(diào)用sys_timeout_abs函數(shù)。

在sys_timeout_abs函數(shù)中會計算出超時事件即將超時的時間,并且根據(jù)超時時間將這些超時事件連接成一個鏈表,如下圖所示。當超時發(fā)生時就會調(diào)用對應(yīng)的處理函數(shù)。

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

SDK中會把需要注冊的超時事件都放在一個數(shù)組中,在初始化時調(diào)用注冊函數(shù)去一個個注冊這些超時事件。超時事件數(shù)組如下圖所示。

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

LWIP內(nèi)存堆內(nèi)存池初始化

在LwIP中,內(nèi)存分配策略一般有兩種,一種是分配固定大小的內(nèi)存塊。如TCP 首部、UDP 首部,IP 首部,以太網(wǎng)首部等都是固定的數(shù)據(jù)結(jié)構(gòu),其大小就是一個固定的值,那么我們就能采用這種方式分配這些固定大小的內(nèi)存空間,這樣子的效率就會大大提高。另一種是利用內(nèi)存堆進行動態(tài)分配,屬于可變長度的內(nèi)存塊。

在LWIP協(xié)議棧初始化時一定要對這兩種內(nèi)存分配方式進行初始化,方便后續(xù)協(xié)議棧進行相關(guān)內(nèi)存分配。內(nèi)存堆初始化代碼如下所示,其中LWIP_RAM_HEAP_POINTER實際上就是分配的內(nèi)存堆數(shù)組首地址。

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

內(nèi)存堆數(shù)組大小為想要分配的內(nèi)存堆大小對齊后再加上兩倍的mem結(jié)構(gòu)體對齊后的大小,mem結(jié)構(gòu)體中會存放一些內(nèi)存堆相關(guān)管理信息,宏定義如下圖所示。

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

不難看出在內(nèi)存堆初始化代碼中實際上就是初始化了兩個mem結(jié)構(gòu)體。第一個mem結(jié)構(gòu)體在內(nèi)存堆起始地址處,next成員為MEM_SIZE_ALIGNED, prev和used成員皆初始化為0。

第二個mem結(jié)構(gòu)體ram_end設(shè)置為內(nèi)存堆首地址偏移MEM_SIZE_ALIGNED處,used變量設(shè)置為1,next和prev皆指向偏移MEM_SIZE_ALIGNED的位置。

內(nèi)存池初始化函數(shù)為memp_init,如下圖所示。它使用輪詢的方式調(diào)用memp_init_pool去初始化每一類內(nèi)存池,memp_pools數(shù)組中存放了初始化過的memp結(jié)構(gòu)體。

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

在memp_init_pool中會根據(jù)初始化過的memp結(jié)構(gòu)體中的一些參數(shù),比如下圖中所示的num,num代表有多少個內(nèi)存塊,memp_init_pool中會根據(jù)num將內(nèi)存塊連接成單鏈表。

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

網(wǎng)卡掛載及初始化

調(diào)用netif_add來掛載網(wǎng)卡,netif結(jié)構(gòu)體是抽象出來的網(wǎng)卡結(jié)構(gòu)體,IP地址,網(wǎng)關(guān),子網(wǎng)掩碼等都會保存在該結(jié)構(gòu)體中。網(wǎng)卡初始化函數(shù)也會作為參數(shù)之一傳入netif_add函數(shù),并在netif_add函數(shù)中被調(diào)用。在該初始化函數(shù)中最終會完成以下幾部分初始化:

1.以太網(wǎng)相關(guān)數(shù)據(jù)結(jié)構(gòu)的初始化,包括rx_buffer,tx_buffer, buffer descriptor,buffer descriptor ring。初始化這些數(shù)據(jù)結(jié)構(gòu),以便在接收發(fā)送以太網(wǎng)數(shù)據(jù)時使用。

2.phy的初始化,初始化以太網(wǎng)外設(shè)中的MDC MDIO,如下圖所示。

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

通過MDC MDIO去操作PHY相關(guān)的寄存器,例如去配置PHY的百兆千兆模式,軟復位PHY,檢查自動協(xié)商,連接狀態(tài)以及配置LED等等。確保PHY工作在想要的狀態(tài)下,部分初始化PHY的代碼如下所示。

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

3.設(shè)置netif相關(guān)參數(shù),例如MAC地址長度,MTU,flags,以及網(wǎng)絡(luò)接口層輸入,網(wǎng)絡(luò)接口層輸出函數(shù)等。

4.初始化Ethernet MAC外設(shè),去配置以太網(wǎng)外設(shè)中的接口類型,速度,工作模式,中斷等等。部分配置代碼如下所示。

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

LWIP不同API初始化

在完成上述初始化流程之后,還需要調(diào)用一些LwIP提供的API,LwIP常用的API有RAW API, Socket API, NETCONN API三種,前者是不需要基于操作系統(tǒng)的,后兩者需要基于操作系統(tǒng)運行。這三種API在初始化時也是不同的,Socket API和NETCONN API類似,此處以RT1060 SDK中的ping demo來舉例說明。

首先是RAW API,在raw.c中定義了一個raw_pcb結(jié)構(gòu)體,初始化時會定義一個新的raw_pcb結(jié)構(gòu)體并插入raw_pcbs鏈表。并且給新定義的raw_pcb賦初值,如下圖所示,通過raw_recv綁定ping_recv函數(shù)。通過raw_bind綁定IP地址,并且注冊一個超時事件,超時時就調(diào)用ping_timeout函數(shù),參數(shù)為ping_pcb。在ping_timeout函數(shù)中會發(fā)送ping請求。

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

當LWIP跑在操作系統(tǒng)上時,LWIP協(xié)議棧是作為一個獨立線程存在的。因此,在初始化時要創(chuàng)建tcpip_thread線程。用戶代碼與tcpip_thread線程之間是通過郵箱進行數(shù)據(jù)的交互的。因此,在初始化時也需要創(chuàng)建一個郵箱。

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

在使用Socket API時,首先要調(diào)用lwip_socket函數(shù)向內(nèi)核申請一個套接字,然后調(diào)用setsockopt設(shè)置套接字的一些選項。接著就可以調(diào)用lwip_sendto函數(shù)去發(fā)送數(shù)據(jù)包。調(diào)用recvfrom函數(shù)接收數(shù)據(jù)包。

至此,在i.MX RT使用LwIP協(xié)議棧初始化流程介紹完畢,通過理解和實踐這些步驟,開發(fā)者可以在i.MX RT微控制器上成功初始化LWIP協(xié)議棧,并實現(xiàn)網(wǎng)絡(luò)通信功能。

總體看來,整個初始化流程還是相對復雜的,這個過程不僅涉及硬件驅(qū)動編程和TCP/IP協(xié)議棧的配置,還需要對內(nèi)存管理、中斷處理、超時檢查等關(guān)鍵知識點有深入的理解。感興趣的讀者可以下載RT四位數(shù)的SDK深入了解。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7464

    瀏覽量

    150876
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1348

    瀏覽量

    78934
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    85

    瀏覽量

    27058
  • 協(xié)議棧
    +關(guān)注

    關(guān)注

    2

    文章

    140

    瀏覽量

    33601

原文標題:在i.MX RT使用LWIP協(xié)議棧的初始化流程

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【大聯(lián)大品佳 NXP i.MX RT1050試用申請】i.MX RT1050 3D打印機控制器

    項目名稱:i.MX RT1050 3D打印機控制器試用計劃:申請理由本人在開源硬件行業(yè)有五年多的學習和開發(fā)經(jīng)驗,曾設(shè)計多款FDM,SLA,LCD 3D打印機控制板,參與公司3D打印機的
    發(fā)表于 08-10 18:23

    i.MX RT1050平臺的相關(guān)資料推薦

    的首款跨界處理。該處理器具備應(yīng)用處理的高性能與高度集成的優(yōu)勢,更具有微控制器的易用性和實時功能。NXP Semiconductors(恩智浦半導體)公司根據(jù)用戶成本需求,在 i.MX
    發(fā)表于 11-29 07:19

    如何使用sdphost的ROM引導加載程序中區(qū)分i.MX RT1062和i.MX RT 1064?

    有什么方法可以通過讀取特定寄存來確定微控制器類型,而不是系列或 UID?我想在使用 sdphost 的 ROM 引導加載程序中區(qū)分 i.MX RT1062 和
    發(fā)表于 04-27 08:37

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

    恩智浦半導體近日宣布i.MX RT600跨界微控制器 (MCU) 上市,這是一款面向音頻、語音和機器學習等超低功耗、安全邊緣應(yīng)用的理想解決方案。
    的頭像 發(fā)表于 03-15 14:29 ?2716次閱讀

    恩智浦i.MX RT1170開創(chuàng)GHz MCU時代

    自2017年上市以來,i.MX RT系列取得了優(yōu)秀的市場表現(xiàn)。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發(fā)表于 03-22 11:14 ?3413次閱讀

    恩智浦i.MX RT1170在將該系列帶上了更高的層面

    自2017年上市以來,i.MX RT系列取得了優(yōu)秀的市場表現(xiàn)。i.MX RT1170跨界MCU是恩智浦i.MX
    的頭像 發(fā)表于 05-18 11:15 ?3733次閱讀

    i.MX RT開發(fā)筆記-01 | 初識 i.MX RT1062 跨界MCU

    一、跨界處理i.MX RT 系列 MCU 是由 NXP 推出的跨界處理,跨界是指該系列MCU的定位既非傳統(tǒng)的微控制器、也非傳統(tǒng)的微處理
    發(fā)表于 10-29 10:21 ?28次下載
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>開發(fā)筆記-01 | 初識 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062 跨界MCU

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

    的首款跨界處理。該處理器具備應(yīng)用處理的高性能與高度集成的優(yōu)勢,更具有微控制器的易用性和實時功能。NXP Semiconductors(恩智浦半導體)公司根據(jù)用戶成本需求,在 i.MX
    發(fā)表于 11-19 12:51 ?14次下載
    【044】SylixOS 正式支持 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1050平臺

    i.MX RT開發(fā)筆記-08 | i.MX RT1062嵌套中斷向量控制器NVIC(按鍵中斷檢測)

    系列文章目錄i.MX RT開發(fā)筆記-01 | 初識 i.MX RT1062 跨界MCUi.MX RT
    發(fā)表于 12-01 13:51 ?2次下載
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>開發(fā)筆記-08 | <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062嵌套中斷向量<b class='flag-5'>控制器</b>NVIC(按鍵中斷檢測)

    RT-Thread & NXP 發(fā)布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界處理系列。該系列下又包括 i.MX RT1020、i.MX
    發(fā)表于 12-07 13:06 ?2次下載
    <b class='flag-5'>RT</b>-Thread & NXP 發(fā)布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    何在i.MX RT1050使用FlexIO模塊模擬XY2-100振鏡通信協(xié)議接口

    一、概述 本文介紹了如何使用i.MX RT系列芯片的FlexIO實現(xiàn)XY2-100激光振鏡控制協(xié)議。FlexIO模塊是NXP Kineti
    的頭像 發(fā)表于 05-18 09:22 ?3557次閱讀
    如<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'>協(xié)議</b>接口

    i.MX RT10xx使用FlexIO實現(xiàn)XY2-100振鏡控制協(xié)議

    本文介紹了如何使用i.MX RT系列芯片的FlexIO實現(xiàn)XY2-100激光振鏡控制協(xié)議。FlexIO模塊是NXP Kinetis和
    的頭像 發(fā)表于 05-18 09:21 ?5708次閱讀
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>10xx使用FlexIO實現(xiàn)XY2-100振鏡<b class='flag-5'>控制</b><b class='flag-5'>協(xié)議</b>

    i.MX RT的FlexRAM配置問題

    i.MX RT的FlexRAM配置問題
    的頭像 發(fā)表于 10-24 15:46 ?767次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置問題

    基于NXP微控制器i.MX RT1170的多人體實時檢測算法和系統(tǒng)

    基于NXP微控制器i.MX RT1170的多人體實時檢測算法和系統(tǒng)
    的頭像 發(fā)表于 10-26 16:27 ?1005次閱讀
    基于NXP<b class='flag-5'>微控制器</b><b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1170的多人體實時檢測算法和系統(tǒng)

    使用LwIP協(xié)議淺析實戰(zhàn)分析(i.MX RT

    LWIP協(xié)議與網(wǎng)絡(luò)分層 LwIP(Light weight IP),是一種輕量化且開源的TCP/IP協(xié)議,它可以在有限的RAM和ROM條件
    的頭像 發(fā)表于 02-02 17:05 ?1527次閱讀
    使用<b class='flag-5'>LwIP</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>淺析實戰(zhàn)分析(<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>)