在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-06-01 08:35 ? 次閱讀

1.LWIP介紹

lwip是瑞典計(jì)算機(jī)科學(xué)院網(wǎng)絡(luò)嵌入式系統(tǒng)小組(SICS)的Adam Dunkels(亞當(dāng)·鄧克爾) 開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議棧。實(shí)現(xiàn)的重點(diǎn)是在保持 TCP 協(xié)議主要功能的基礎(chǔ)上減少對(duì)RAM的占用。
LwIP是Light Weight(輕型)IP 協(xié)議,有無操作系統(tǒng)的支持都可以運(yùn)行。LwIP 實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議 主要功能的基礎(chǔ)上減少對(duì)RAM的占用,它只需十幾KB的RAM和 40K左右的ROM就可以運(yùn)行,這使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ū)動(dòng)的工程,在工程中創(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é)議棧使用示例之 — 獲取動(dòng)態(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ā)來的一個(gè)數(shù)據(jù)包*/
	netif_add(&lwip_netif,&ip_addr,&netmask,&gw,NULL,ethernetif_init,ethernet_input);
	/*3.設(shè)置網(wǎng)卡為L(zhǎng)WIP協(xié)議棧默認(rèn)設(shè)備*/
	netif_set_default(&lwip_netif);
	/*4.注冊(cè)網(wǎng)卡設(shè)備為默認(rèn)接口*/
	netif_set_up(&lwip_netif);
	/*5.動(dòng)態(tài)分配IP*/
	dhcp_start(&lwip_netif);
}
/*****DHCP定期數(shù)據(jù)處理函數(shù)(輪詢方式實(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(); //對(duì) TCP 數(shù)據(jù)進(jìn)行解析
	}	
	/*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 請(qǐng)求,判斷 IP 地址是否獲取成功
	}
	/*60S 更新一次*/
	if(LWIP_UPDATE_DHCP_TIME_CNT>=DHCP_COARSE_TIMER_MSECS)
	{
		LWIP_UPDATE_DHCP_TIME_CNT=0;
		dhcp_coarse_tmr(); //更新檢查 DHCP 的租約時(shí)間
	}	
	ethernetif_input(&lwip_netif); //讀取網(wǎng)卡的數(shù)據(jù)進(jìn)行上報(bào)
	if(lwip_dhcp_stat==0)
	{
		LWIP_GetDHCP_Addr();
	}
}
/******獲取動(dòng)態(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.運(yùn)行效果

pYYBAGKWs92AEhr7AAESZQ-rIDQ758.pngpYYBAGKWs_KACnf5AAV1_eHv-eM124.png

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

    關(guān)注

    2281

    文章

    10976

    瀏覽量

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

    關(guān)注

    8

    文章

    1393

    瀏覽量

    79993
  • DHCP
    +關(guān)注

    關(guān)注

    0

    文章

    105

    瀏覽量

    20054
  • DM9000
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    17032
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    89

    瀏覽量

    27855
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    三種藍(lán)牙架構(gòu)實(shí)現(xiàn)方案(藍(lán)牙協(xié)議方案

    藍(lán)牙架構(gòu)實(shí)現(xiàn)方案有哪幾種?我們一般把整個(gè)藍(lán)牙實(shí)現(xiàn)方案叫做藍(lán)牙協(xié)議,因此這個(gè)問題也可以這么闡述:藍(lán)牙協(xié)議
    的頭像 發(fā)表于 04-08 15:35 ?222次閱讀
    三種藍(lán)牙架構(gòu)實(shí)現(xiàn)<b class='flag-5'>方案</b>(藍(lán)牙<b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>方案</b>)

    移植LWIP+FREERTOS時(shí)遇到的問題怎么解決?

    :將ST官網(wǎng)的LWIP1.4.1 的例子(關(guān)于LWIP的部分)移植步驟1 的FreeRTOS 系統(tǒng)的工程里面,只是添加LWIP初始化的任務(wù)
    發(fā)表于 03-11 06:48

    LwIP應(yīng)用開發(fā)實(shí)戰(zhàn)指南—基于野火STM32

    LwIP應(yīng)用開發(fā)實(shí)戰(zhàn)指南—基于野火STM32—20210122
    發(fā)表于 01-17 14:34 ?7次下載

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

    在i.MX RT微控制器上初始化LWIP協(xié)議是一個(gè)復(fù)雜但有趣的過程,它涉及多個(gè)步驟和關(guān)鍵組件的配置.
    的頭像 發(fā)表于 10-12 11:48 ?612次閱讀
    如何在i.MX RT微控制器上初始化<b class='flag-5'>LWIP</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>

    Linux網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)

    網(wǎng)絡(luò)協(xié)議是操作系統(tǒng)核心的一個(gè)重要組成部分,負(fù)責(zé)管理網(wǎng)絡(luò)通信中的數(shù)據(jù)包處理。在 Linux 操作系統(tǒng)中,網(wǎng)絡(luò)
    的頭像 發(fā)表于 09-10 09:51 ?493次閱讀
    Linux<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b>的實(shí)現(xiàn)

    是否能將libwebsokets移植到ESP8266上利用libwebsokets進(jìn)行網(wǎng)絡(luò)應(yīng)用開發(fā)?

    使用 lwip開源協(xié)議,在實(shí)現(xiàn)相關(guān)的API時(shí)是否已經(jīng)將 libwebsoket融入,如果已經(jīng)融入,那我做的移植將是多此一舉。
    發(fā)表于 07-22 06:22

    ESP32S3如何移植PJSIP協(xié)議用于使用SIP通話?

    ESP32S3 如何移植PJSIP協(xié)議用于使用SIP通話
    發(fā)表于 07-19 06:56

    調(diào)試ESP8266集成LWIP協(xié)議用UDP方式發(fā)送數(shù)據(jù)時(shí),無法正常發(fā)送數(shù)據(jù)是哪里的問題?

    我在調(diào)試8266集成LWIP協(xié)議用UDP方式發(fā)送數(shù)據(jù)時(shí),參考別的環(huán)境的UDP例程,發(fā)現(xiàn)無法正常發(fā)送數(shù)據(jù),反復(fù)檢查了,并確認(rèn)8266已經(jīng)通過WIFI連上網(wǎng)了,但是使用LWIP
    發(fā)表于 07-12 07:44

    LwIP協(xié)議源碼詳解—TCP/IP協(xié)議的實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《LwIP協(xié)議源碼詳解—TCP/IP協(xié)議的實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 07-03 11:22 ?3次下載

    基于MM32F5270的Ethernet實(shí)現(xiàn)LwIP協(xié)議移植

    LwIP是輕量化的TCP/IP協(xié)議,由瑞典計(jì)算機(jī)科學(xué)院(SICS)的Adam Dunkels 開發(fā)的一個(gè)小型開源的TCP/IP協(xié)議LwIP
    的頭像 發(fā)表于 06-21 10:28 ?1718次閱讀
    基于MM32F5270的Ethernet實(shí)現(xiàn)<b class='flag-5'>LwIP</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>棧</b><b class='flag-5'>移植</b>

    求助,大家開發(fā)以太網(wǎng)時(shí)候使用什么協(xié)議比較多?

    UIP由瑞典計(jì)算機(jī)科學(xué)學(xué)院(網(wǎng)絡(luò)嵌入式系統(tǒng)小組)的Adam Dunkels開發(fā)。 1) 代碼非常少,其協(xié)議代碼不到 6K,很方便閱讀和移植。 2) 占用的內(nèi)存數(shù)非常少,RAM 占用僅
    發(fā)表于 05-16 08:01

    STM32F407移植LWIP協(xié)議總是進(jìn)入硬件中斷的原因?

    在f407上移植LWIP協(xié)議 一到這個(gè)地方就進(jìn)入硬件中斷 請(qǐng)問是我的指針沒初始化好嗎?還是其他原因?? /* entry point to the
    發(fā)表于 05-16 07:59

    STM32F756做以太網(wǎng),移植LWIP協(xié)議MII通信只能收不能發(fā)是為什么?

    有誰做過stm32f756的以太網(wǎng)。移植swip協(xié)議mii通信的那種,發(fā)現(xiàn)只能接收到電腦發(fā)過來的數(shù)據(jù),但發(fā)送不能成功。用示波器測(cè)量,只測(cè)到了前導(dǎo)碼。感覺是eth mac發(fā)送哪兒出了問
    發(fā)表于 05-07 06:42

    STM32F746-NUCLEO lwip協(xié)議只能接收5912個(gè)字節(jié)是怎么回事?如何解決?

    各位大神們好我在使用STM32F746-NUCLEO lwip協(xié)議裸跑udp server,接收PC端發(fā)來的約8000字節(jié)數(shù)據(jù)。但實(shí)驗(yàn)中發(fā)現(xiàn)每次只能接收最大5912個(gè)字節(jié),
    發(fā)表于 04-25 07:58

    STM32F207 CubeMx FreeRtos Lwip無法建立多個(gè)端口怎么解決?

    剛剛轉(zhuǎn)入Freertos陣營(yíng),就遇到了問題,卡住了,在此懸賞200-500大洋求助。 項(xiàng)目信息: CPU:STM32F207VC PHY:KSZ8041NL 協(xié)議LWIP OS:F
    發(fā)表于 04-23 07:40
    主站蜘蛛池模板: 高清不卡毛片免费观看 | 久久精品99无色码中文字幕 | 日韩种子| 天天爱天天做天天爽 | 五月丁香啪啪 | 亚洲影院手机版777点击进入影院 | 性欧美xxxxhd | 亚洲jizzjizz妇女 | 天天干网站 | 97国内精品久久久久久久影视 | 韩日一级毛片 | 手机在线精品视频 | 国模无水印一区二区三区 | 爱操综合 | 欧美色图综合网 | 91午夜在线观看 | 添人人躁日日躁夜夜躁夜夜揉 | 速度与激情10 | 中文免费观看视频网站 | 奇米影视一区 | 亚洲视频在线一区二区三区 | 椎名空中文字幕一区二区 | 亚洲免费在线观看视频 | 国产特黄1级毛片 | 日操| 新网球王子u17世界杯篇免费观看 | 国产一区二区在线观看免费 | 国产一区二区三区美女图片 | 欧美女同在线 | 精品在线视频一区 | 国内真实实拍伦视频在线观看 | 激情综合激情五月 | 久久综合97色综合网 | 国产高清视频免费最新在线 | 1314酒色网 | 乱子伦xxx欧美 | 欧美在线网站 | 99久久婷婷免费国产综合精品 | 久久免费99精品久久久久久 | 伊人久久大香线蕉影院95 | 欧美大胆一级视频 |