日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

STM32之LWIP網(wǎng)絡(luò)協(xié)議棧移植步驟與方案

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-06-01 08:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.LWIP介紹

lwip是瑞典計算機科學(xué)院網(wǎng)絡(luò)嵌入式系統(tǒng)小組(SICS)的Adam Dunkels(亞當·鄧克爾) 開發(fā)的一個小型開源的TCP/IP協(xié)議棧。實現(xiàn)的重點是在保持 TCP 協(xié)議主要功能的基礎(chǔ)上減少對RAM的占用。
LwIP是Light Weight(輕型)IP 協(xié)議,有無操作系統(tǒng)的支持都可以運行。LwIP 實現(xiàn)的重點是在保持TCP協(xié)議 主要功能的基礎(chǔ)上減少對RAM的占用,它只需十幾KB的RAM和 40K左右的ROM就可以運行,這使LwIP協(xié)議棧適合在低端的嵌入式系統(tǒng)中使用。lwip提供三種API

  • RAW API
  • (NETCONN)lwip API
  • BSD API

2.LWIP源碼下載

源碼下載地址:LWIP源碼

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASVRf6Zi_5rC0,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center

3 LWIP源碼移植

??這里以1.4.1為例。
?1.解壓文件

poYBAGKWtFqAIMcPAABt5gNzwUI607.png#pic_center

2.打開已完成DM9000驅(qū)動的工程,在工程中創(chuàng)建lwip文件夾,在lwip文件夾中創(chuàng)建src文件夾和lwip1.4_config文件夾:

在這里插入圖片描述

?3.將lwip-1.4.1源碼中的src中所有文件復(fù)制到用戶創(chuàng)建的src中:

在這里插入圖片描述

4.復(fù)制contrib中文件

在這里插入圖片描述pYYBAGKWsfaAAE0UAADwUORUrHs992.png

5.刪除不必要文件

pYYBAGKWslaAHj_1AAGki7Paihs964.pngpoYBAGKWsmeAftq_AAFmzEhEIOM076.png

?6.打開工程,添加.c文件到工程中

pYYBAGKWsoaALzP2AAEk789YQFw702.pngpYYBAGKWsqKAE4plAAUI-Dg7LFY417.pngpoYBAGKWsrSAMKOhAAHbTpSzIEw265.png

7.添加.h文件路徑

pYYBAGKWstuAOcRBAAH4aJdhJSc766.png

8.編譯工程

poYBAGKWsvWAIrjlAAMQBLj2Co8795.png

9.修改sys_arch.c文件,只保留下面函數(shù),其它全部刪除。

pYYBAGKWsxmAP2UoAAFZIKW02nI396.png

10.修改lwipopts.h文件

poYBAGKWszmADeohAAHnlTW5XdQ273.png

11.修改ethernetif.c文件

poYBAGKWs1CAXw-KAAGb9naRI40456.pngpoYBAGKWs2mAX3f2AANJCTEk7UE965.pngpoYBAGKWs4WAb0MHAAOBUpvC74Q434.png

4.LWIP協(xié)議棧使用示例之 — 獲取動態(tài)IP

??在LWIP_confg目錄下創(chuàng)建lwip_config.c和lwip_config.h文件
??lwip_config.c文件:

#include "lwip_config.h"
#include "lwip/ip_addr.h"
#include "lwip/init.h"
#include "lwip/netif.h"
#include "netif/etharp.h"
#include "lwip/dhcp.h"
#include "lwip/tcp_impl.h"
extern err_t ethernetif_init(struct netif *netif);//網(wǎng)卡初始化函數(shù),原型在ethernetif.c中
extern void  ethernetif_input(struct netif *netif);
/**************LWIP協(xié)議棧初始化***********/
struct netif lwip_netif; //結(jié)構(gòu)體原型在lwip/netif.h中
void LWIP_Config_Init(void)
{
	ip_addr_t ip_addr={0};//IP地址
	ip_addr_t netmask={0};//子網(wǎng)掩碼
	ip_addr_t gw={0};//網(wǎng)關(guān)
	/*靜態(tài)分配IP*/
//	IP4_ADDR(&ip_addr,192,168,12,23);//設(shè)置靜態(tài)IP
//	IP4_ADDR(&netmask,255,255,255,0);//子網(wǎng)掩碼
//	IP4_ADDR(&netmask,192,168,12,1);//網(wǎng)關(guān)	
	/*1.LWIP協(xié)議棧初始化*/
	lwip_init();	
	/*2.添加新的網(wǎng)卡設(shè)備到LWIP協(xié)議棧中*/
	/*err_t ethernet_input(struct pbuf *p, struct netif *netif)處理已經(jīng)讀取從硬件接口發(fā)來的一個數(shù)據(jù)包*/
	netif_add(&lwip_netif,&ip_addr,&netmask,&gw,NULL,ethernetif_init,ethernet_input);
	/*3.設(shè)置網(wǎng)卡為LWIP協(xié)議棧默認設(shè)備*/
	netif_set_default(&lwip_netif);
	/*4.注冊網(wǎng)卡設(shè)備為默認接口*/
	netif_set_up(&lwip_netif);
	/*5.動態(tài)分配IP*/
	dhcp_start(&lwip_netif);
}
/*****DHCP定期數(shù)據(jù)處理函數(shù)(輪詢方式實現(xiàn)數(shù)據(jù)更新)****/

u32 LWIP_TCP_TIME_CNT=0;
u32 LWIP_ARP_TIME_CNT=0;
u32 LWIP_DHCP_TIME_CNT=0;
u32 LWIP_UPDATE_DHCP_TIME_CNT=0;
u8 lwip_dhcp_stat=0;
void LWIP_DataUpdata(void)
{
	/*250MS 更新一次*/
	if(LWIP_TCP_TIME_CNT>=TCP_TMR_INTERVAL)
	{
		LWIP_TCP_TIME_CNT=0;
		tcp_tmr(); //對 TCP 數(shù)據(jù)進行解析
	}	
	/*5000ms 更新一次*/
	if(LWIP_ARP_TIME_CNT>=ARP_TMR_INTERVAL)
	{
		LWIP_ARP_TIME_CNT=0;
		etharp_tmr();//清理 ARP 緩存表
	}	
	//500ms獲取一次
	if(LWIP_DHCP_TIME_CNT>=DHCP_FINE_TIMER_MSECS )
	{
		LWIP_DHCP_TIME_CNT=0;
		dhcp_fine_tmr(); //解析 DHCP 請求,判斷 IP 地址是否獲取成功
	}
	/*60S 更新一次*/
	if(LWIP_UPDATE_DHCP_TIME_CNT>=DHCP_COARSE_TIMER_MSECS)
	{
		LWIP_UPDATE_DHCP_TIME_CNT=0;
		dhcp_coarse_tmr(); //更新檢查 DHCP 的租約時間
	}	
	ethernetif_input(&lwip_netif); //讀取網(wǎng)卡的數(shù)據(jù)進行上報
	if(lwip_dhcp_stat==0)
	{
		LWIP_GetDHCP_Addr();
	}
}
/******獲取動態(tài)分配的IP地址*************/
void LWIP_GetDHCP_Addr(void)
{
	char buff[200];
	u32 ip_addr;//IP地址
	u32 netmask;//子網(wǎng)掩碼
	u32 gw;//網(wǎng)關(guān)
	ip_addr=lwip_netif.ip_addr.addr;//IP地址
	netmask=lwip_netif.netmask.addr;//子網(wǎng)掩碼
	gw=lwip_netif.gw.addr;
	if(ip_addr!=0)
	{
		lwip_dhcp_stat=1;//成功獲取到IP地址
		printf("IP地址:%d.%d.%d.%drn",(ip_addr>>0)&0xff,(ip_addr>>8)&0xff,(ip_addr>>16)&0xff,(ip_addr>>24)&0xff);
		snprintf(buff,sizeof(buff),"IP地址:%d.%d.%d.%d",(ip_addr>>0)&0xff,(ip_addr>>8)&0xff,(ip_addr>>16)&0xff,(ip_addr>>24)&0xff);
		LCD_ShowStr(30,30+20*4,16,(u8 *)buff);//IP地址
		printf("子網(wǎng)掩碼:%d.%d.%d.%drn",(netmask>>0)&0xff,(netmask>>8)&0xff,(netmask>>16)&0xff,(netmask>>24)&0xff);
		snprintf(buff,sizeof(buff),"子網(wǎng)掩碼:%d.%d.%d.%drn",(netmask>>0)&0xff,(netmask>>8)&0xff,(netmask>>16)&0xff,(netmask>>24)&0xff);
		LCD_ShowStr(30,30+20*5,16,(u8 *)buff);//子網(wǎng)掩碼
		printf("網(wǎng)關(guān):%d.%d.%d.%drn",(gw>>0)&0xff,(gw>>8)&0xff,(gw>>16)&0xff,(gw>>24)&0xff);	
		snprintf(buff,sizeof(buff),"網(wǎng)關(guān):%d.%d.%d.%drn",(gw>>0)&0xff,(gw>>8)&0xff,(gw>>16)&0xff,(gw>>24)&0xff);	
		LCD_ShowStr(30,30+20*6,16,(u8 *)buff);//子網(wǎng)掩碼
	}
}

5.主函數(shù)

#include "dm9000.h"
#include "lwip_config.h"
u8 dm9000_tx_buff[64]={0x11,0x22,0x33,0x44,0x55};
u8 dm9000_rx_buff[1024];
int main()
{
	char buff[200];
	u8 stat;
	Beep_Init();
	Led_Init();
	Key_Init();
	W25Q64_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	IIC_Init();
	printf("初始化完成rn");
	NT35310_Init();
	/*DM9000初始化*/
	LCD_ShowStr(30,30,16,"DM9000初始化中。。。");//顯示字符串
	if(DM9000_Init()==0)
	{
		printf("DM9000初始化成功rn");
		LCD_ShowStr(30,30+20,16,"DM9000t OK!");//顯示字符串
	}
	else 
	{
		printf("DM9000初始化失敗rn");
		LCD_ShowStr(30,30+20,16,"DM9000t ERR!");//顯示字符串
	}
	/*獲取DM9000工作模式*/
	LCD_ShowStr(128,30+20*2,16,"網(wǎng)卡信息");//顯示字符串
	stat=DM9000_Get_SpeedAndDuplex();//獲取連接狀態(tài)和工作方式
	if(stat!=0xff)
	{
		printf("網(wǎng)卡速度:%d Mbps 模式:%srn",(stat&0x02)?10:100,(stat&0x01)?"全雙工":"半雙工");
		snprintf(buff,sizeof(buff),"網(wǎng)卡速度:%d MHZt %s",(stat&0x02)?10:100,(stat&0x01)?"全雙工":"半雙工");
		LCD_ShowStr(30,30+20*3,16,(u8 *)buff);//網(wǎng)卡速度
	}
	else 
	{
		printf("DM9000網(wǎng)卡狀態(tài)信息獲取失敗!rn");
		LCD_ShowStr(30,30+20*3,16,(u8 *)"獲取網(wǎng)卡信息失敗!");//網(wǎng)卡速度
	}
	LWIP_Config_Init();//LWIP協(xié)議棧初始化
	TIMx_Init(TIM6,72,1000);
	TIM6->CR1|=1<<0;
	while(1)
	{
		LWIP_DataUpdata();
	}
}

6.運行效果

pYYBAGKWs92AEhr7AAESZQ-rIDQ758.pngpYYBAGKWs_KACnf5AAV1_eHv-eM124.png

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

    關(guān)注

    2313

    文章

    11195

    瀏覽量

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

    關(guān)注

    8

    文章

    1434

    瀏覽量

    83784
  • DHCP
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    20938
  • DM9000
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    17323
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    91

    瀏覽量

    29776
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    BLDC 驅(qū)動板 FOC 矢量控制算法移植與參數(shù)調(diào)試(工程實用版)

    這是一篇可直接用于項目開發(fā)、量產(chǎn)調(diào)試的 FOC 移植與調(diào)試指南,面向STM32/GD32 + 三相 BLDC/PMSM 無刷馬達驅(qū)動板,包含移植步驟、關(guān)鍵參數(shù)、調(diào)試流程、波形判斷、常見
    的頭像 發(fā)表于 04-27 15:32 ?873次閱讀

    OCA認證只認整機——為什么OCPP協(xié)議放在哪里不重要?

    認證是對“某個部件”(如通信主控板、協(xié)議模塊)的認可。實際上,OCA認證的核心規(guī)則非常明確——證書只頒發(fā)給整機,至于OCPP協(xié)議具體跑在主控板上、獨立通信模組
    的頭像 發(fā)表于 04-10 15:38 ?2435次閱讀
    OCA認證只認整機——為什么OCPP<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>放在哪里不重要?

    極海APM32F427 MCU在RT-Thread系統(tǒng)上使用LwIP網(wǎng)絡(luò)功能

    下面是基于RT-Thread的ENV命令行開發(fā)環(huán)境,在APM32F427上使用LwIP網(wǎng)絡(luò)協(xié)議實現(xiàn)網(wǎng)絡(luò)通信功能的。
    的頭像 發(fā)表于 04-02 15:19 ?8865次閱讀
    極海APM32F427 MCU在RT-Thread系統(tǒng)上使用<b class='flag-5'>LwIP</b><b class='flag-5'>網(wǎng)絡(luò)</b>功能

    米爾:新法規(guī)歐標AC樁一站式技術(shù)實現(xiàn)方案

    選用: RMII接口方案:通過核心板的ETH1控制器直接連接,實現(xiàn)MAC層通信。我們提供完整的設(shè)備樹(myb-stm32mp135x-base.dtsi)修改與引腳復(fù)用配置指南,確保網(wǎng)絡(luò)鏈路穩(wěn)定
    發(fā)表于 01-30 20:32

    車載以太網(wǎng)通信協(xié)議如何測?UT和SP聯(lián)手!

    引言在汽車以太網(wǎng)的通信測試中,面對復(fù)雜的協(xié)議分層與交互,一個核心挑戰(zhàn)在于:如何高效、直接地對ECU內(nèi)部的網(wǎng)絡(luò)層、傳輸層等協(xié)議實現(xiàn)進行驗證?僅僅通過外部
    的頭像 發(fā)表于 01-21 10:04 ?1856次閱讀
    車載以太網(wǎng)通信<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>如何測?UT和SP聯(lián)手!

    RDMA設(shè)計12:融合以太網(wǎng)協(xié)議設(shè)計1

    本文主要交流設(shè)計思路,在本博客已給出相關(guān)博文90多篇,希望對初學(xué)者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設(shè)計。 融合以太網(wǎng)協(xié)議負責(zé)用戶請求與 RDMA 數(shù)據(jù)包的轉(zhuǎn)換、管理
    發(fā)表于 12-25 11:39

    IPv6 Only 進入倒計時 ,單替代雙網(wǎng)絡(luò)演進必然選擇

    2025年末,中國工程院院士鄔賀銓在“2026ICT行業(yè)趨勢年會”上強調(diào)“雙是過去的妥協(xié),IPv6Only才是未來的必然”,這一判斷精準點出了全球網(wǎng)絡(luò)協(xié)議演進的核心方向。隨著技術(shù)兼容方案
    的頭像 發(fā)表于 12-23 09:59 ?1746次閱讀
    IPv6 Only 進入倒計時 ,單<b class='flag-5'>棧</b>替代雙<b class='flag-5'>棧</b>成<b class='flag-5'>網(wǎng)絡(luò)</b>演進必然選擇

    studio建立f429工程使用 lwip運行錯誤的原因?

    tcpip線程大小還是崩潰,一直沒找到原因 2.如果同時使能 lwip 和 at(4G) ,應(yīng)用程序中該如何切換 網(wǎng)卡 呢?
    發(fā)表于 09-18 07:30

    rtthread網(wǎng)絡(luò)接口設(shè)備 輕量級tcp/ip 堆棧 這兩個沖突嗎?

    需要使用 lwip 上圖中 網(wǎng)絡(luò)接口設(shè)備 需要使能么? 上圖中 網(wǎng)絡(luò)接口設(shè)備 是干嘛用的?是一個比lwip 功能弱的tcp/ip 協(xié)議
    發(fā)表于 09-18 06:16

    移植CANfestival,發(fā)現(xiàn)can無法接收數(shù)據(jù),為什么?

    最近在研究Canopen協(xié)議,在f407的板子上移植了canfestival協(xié)議 移植成功后遇到一些問題,總線上我在沒有發(fā)數(shù)據(jù)的情況下還是
    發(fā)表于 09-11 07:46

    讓開發(fā)板暢游網(wǎng)絡(luò):RT-Thread CherryUSB 驅(qū)動 RNDIS 模塊詳解 | 技術(shù)集結(jié)

    本文通過在RT-Thread操作系統(tǒng)上,使用CherryUSB軟件包作為USBHost協(xié)議,驅(qū)動AIR780E4GCat.1模塊的RNDIS功能,并成功接入lwIP網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-02 17:04 ?3820次閱讀
    讓開發(fā)板暢游<b class='flag-5'>網(wǎng)絡(luò)</b>:RT-Thread CherryUSB 驅(qū)動 RNDIS 模塊詳解 | 技術(shù)集結(jié)

    機智云配網(wǎng)教程第三期:單片機代碼移植實戰(zhàn)

    前言本篇文章將分享單片機移植的經(jīng)驗。可以下載并按步驟移植,也可以直接使用已移植好的工程文件。文中將介紹我在移植過程中遇到的問題,并提供解決
    的頭像 發(fā)表于 07-01 17:32 ?2201次閱讀
    機智云配網(wǎng)教程第三期:單片機代碼<b class='flag-5'>移植</b>實戰(zhàn)

    STM32與機智云連接實現(xiàn)步驟與技巧(下篇):機智云代碼移植與優(yōu)化

    在《STM32與機智云連接實現(xiàn)步驟與技巧(上篇)》中,我們介紹了硬件連接和通信協(xié)議配置。本篇將重點講解如何將機智云相關(guān)代碼移植STM32
    的頭像 發(fā)表于 05-23 18:10 ?1370次閱讀
    <b class='flag-5'>STM32</b>與機智云連接實現(xiàn)<b class='flag-5'>步驟</b>與技巧(下篇):機智云代碼<b class='flag-5'>移植</b>與優(yōu)化

    STM32與機智云連接實現(xiàn)步驟與技巧(上篇)

    通過STM32與機智云的連接,開發(fā)者可以實現(xiàn)設(shè)備的遠程控制和數(shù)據(jù)管理,提升物聯(lián)網(wǎng)應(yīng)用的智能化水平。本文將介紹STM32與機智云連接的具體步驟,涵蓋硬件連接、通信協(xié)議配置、數(shù)據(jù)傳輸及云平
    的頭像 發(fā)表于 05-23 18:10 ?1397次閱讀
    <b class='flag-5'>STM32</b>與機智云連接實現(xiàn)<b class='flag-5'>步驟</b>與技巧(上篇)

    NVMe協(xié)議分析提交隊列

    NVMe指令提交與完成機制是NVMe協(xié)議的核心,該機制制定了NVMe指令的交互流程和處理步驟。
    的頭像 發(fā)表于 05-15 23:25 ?788次閱讀
    NVMe<b class='flag-5'>協(xié)議</b>分析<b class='flag-5'>之</b>提交隊列
    德安县| 仲巴县| 舞阳县| 彰化市| 萨嘎县| 专栏| 上饶市| 孟州市| 故城县| 天柱县| 天全县| 青冈县| 德惠市| 舞钢市| 商丘市| 辽宁省| 新闻| 洪湖市| 五寨县| 日土县| 定兴县| 阳江市| 秀山| 道孚县| 思茅市| 金湖县| 万州区| 敖汉旗| 崇义县| 互助| 清河县| 汉中市| 都兰县| 龙游县| 城固县| 板桥市| 墨脱县| 江山市| 罗源县| 洞口县| 新野县|