色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

STM32之LWIP網絡協議棧移植步驟與方案

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

1.LWIP介紹

lwip是瑞典計算機科學院網絡嵌入式系統小組(SICS)的Adam Dunkels(亞當·鄧克爾) 開發的一個小型開源的TCP/IP協議棧。實現的重點是在保持 TCP 協議主要功能的基礎上減少對RAM的占用。
LwIP是Light Weight(輕型)IP 協議,有無操作系統的支持都可以運行。LwIP 實現的重點是在保持TCP協議 主要功能的基礎上減少對RAM的占用,它只需十幾KB的RAM和 40K左右的ROM就可以運行,這使LwIP協議棧適合在低端的嵌入式系統中使用。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驅動的工程,在工程中創建lwip文件夾,在lwip文件夾中創建src文件夾和lwip1.4_config文件夾:

在這里插入圖片描述

?3.將lwip-1.4.1源碼中的src中所有文件復制到用戶創建的src中:

在這里插入圖片描述

4.復制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文件,只保留下面函數,其它全部刪除。

pYYBAGKWsxmAP2UoAAFZIKW02nI396.png

10.修改lwipopts.h文件

poYBAGKWszmADeohAAHnlTW5XdQ273.png

11.修改ethernetif.c文件

poYBAGKWs1CAXw-KAAGb9naRI40456.pngpoYBAGKWs2mAX3f2AANJCTEk7UE965.pngpoYBAGKWs4WAb0MHAAOBUpvC74Q434.png

4.LWIP協議棧使用示例之 — 獲取動態IP

??在LWIP_confg目錄下創建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);//網卡初始化函數,原型在ethernetif.c中
extern void  ethernetif_input(struct netif *netif);
/**************LWIP協議棧初始化***********/
struct netif lwip_netif; //結構體原型在lwip/netif.h中
void LWIP_Config_Init(void)
{
	ip_addr_t ip_addr={0};//IP地址
	ip_addr_t netmask={0};//子網掩碼
	ip_addr_t gw={0};//網關
	/*靜態分配IP*/
//	IP4_ADDR(&ip_addr,192,168,12,23);//設置靜態IP
//	IP4_ADDR(&netmask,255,255,255,0);//子網掩碼
//	IP4_ADDR(&netmask,192,168,12,1);//網關	
	/*1.LWIP協議棧初始化*/
	lwip_init();	
	/*2.添加新的網卡設備到LWIP協議棧中*/
	/*err_t ethernet_input(struct pbuf *p, struct netif *netif)處理已經讀取從硬件接口發來的一個數據包*/
	netif_add(&lwip_netif,&ip_addr,&netmask,&gw,NULL,ethernetif_init,ethernet_input);
	/*3.設置網卡為LWIP協議棧默認設備*/
	netif_set_default(&lwip_netif);
	/*4.注冊網卡設備為默認接口*/
	netif_set_up(&lwip_netif);
	/*5.動態分配IP*/
	dhcp_start(&lwip_netif);
}
/*****DHCP定期數據處理函數(輪詢方式實現數據更新)****/

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 數據進行解析
	}	
	/*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); //讀取網卡的數據進行上報
	if(lwip_dhcp_stat==0)
	{
		LWIP_GetDHCP_Addr();
	}
}
/******獲取動態分配的IP地址*************/
void LWIP_GetDHCP_Addr(void)
{
	char buff[200];
	u32 ip_addr;//IP地址
	u32 netmask;//子網掩碼
	u32 gw;//網關
	ip_addr=lwip_netif.ip_addr.addr;//IP地址
	netmask=lwip_netif.netmask.addr;//子網掩碼
	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("子網掩碼:%d.%d.%d.%drn",(netmask>>0)&0xff,(netmask>>8)&0xff,(netmask>>16)&0xff,(netmask>>24)&0xff);
		snprintf(buff,sizeof(buff),"子網掩碼:%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);//子網掩碼
		printf("網關:%d.%d.%d.%drn",(gw>>0)&0xff,(gw>>8)&0xff,(gw>>16)&0xff,(gw>>24)&0xff);	
		snprintf(buff,sizeof(buff),"網關:%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);//子網掩碼
	}
}

5.主函數

#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,"網卡信息");//顯示字符串
	stat=DM9000_Get_SpeedAndDuplex();//獲取連接狀態和工作方式
	if(stat!=0xff)
	{
		printf("網卡速度:%d Mbps 模式:%srn",(stat&0x02)?10:100,(stat&0x01)?"全雙工":"半雙工");
		snprintf(buff,sizeof(buff),"網卡速度:%d MHZt %s",(stat&0x02)?10:100,(stat&0x01)?"全雙工":"半雙工");
		LCD_ShowStr(30,30+20*3,16,(u8 *)buff);//網卡速度
	}
	else 
	{
		printf("DM9000網卡狀態信息獲取失敗!rn");
		LCD_ShowStr(30,30+20*3,16,(u8 *)"獲取網卡信息失敗!");//網卡速度
	}
	LWIP_Config_Init();//LWIP協議棧初始化
	TIMx_Init(TIM6,72,1000);
	TIM6->CR1|=1<<0;
	while(1)
	{
		LWIP_DataUpdata();
	}
}

6.運行效果

pYYBAGKWs92AEhr7AAESZQ-rIDQ758.pngpYYBAGKWs_KACnf5AAV1_eHv-eM124.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355729
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1353

    瀏覽量

    79055
  • DHCP
    +關注

    關注

    0

    文章

    104

    瀏覽量

    19702
  • DM9000
    +關注

    關注

    0

    文章

    24

    瀏覽量

    16887
  • LwIP
    +關注

    關注

    2

    文章

    86

    瀏覽量

    27149
收藏 人收藏

    評論

    相關推薦

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

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

    Linux網絡協議的實現

    網絡協議是操作系統核心的一個重要組成部分,負責管理網絡通信中的數據包處理。在 Linux 操作系統中,網絡
    的頭像 發表于 09-10 09:51 ?299次閱讀
    Linux<b class='flag-5'>網絡</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b>的實現

    是否能將libwebsokets移植到ESP8266上利用libwebsokets進行網絡應用開發?

    使用 lwip開源協議,在實現相關的API時是否已經將 libwebsoket融入,如果已經融入,那我做的移植將是多此一舉。
    發表于 07-22 06:22

    調試ESP8266集成LWIP協議用UDP方式發送數據時,無法正常發送數據是哪里的問題?

    我在調試8266集成LWIP協議用UDP方式發送數據時,參考別的環境的UDP例程,發現無法正常發送數據,反復檢查了,并確認8266已經通過WIFI連上網了,但是使用LWIP
    發表于 07-12 07:44

    LwIP協議源碼詳解—TCP/IP協議的實現

    電子發燒友網站提供《LwIP協議源碼詳解—TCP/IP協議的實現.pdf》資料免費下載
    發表于 07-03 11:22 ?3次下載

    基于MM32F5270的Ethernet實現LwIP協議移植

    LwIP是輕量化的TCP/IP協議,由瑞典計算機科學院(SICS)的Adam Dunkels 開發的一個小型開源的TCP/IP協議。LwIP
    的頭像 發表于 06-21 10:28 ?1170次閱讀
    基于MM32F5270的Ethernet實現<b class='flag-5'>LwIP</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b><b class='flag-5'>移植</b>

    STM32F407移植LWIP協議總是進入硬件中斷的原因?

    在f407上移植LWIP協議 一到這個地方就進入硬件中斷 請問是我的指針沒初始化好嗎?還是其他原因?? /* entry point to the
    發表于 05-16 07:59

    STM32F756做以太網,移植LWIP協議MII通信只能收不能發是為什么?

    有誰做過stm32f756的以太網。移植swip協議mii通信的那種,發現只能接收到電腦發過來的數據,但發送不能成功。用示波器測量,只測到了前導碼。感覺是eth mac發送哪兒出了問
    發表于 05-07 06:42

    STM32F746-NUCLEO lwip協議只能接收5912個字節是怎么回事?如何解決?

    各位大神們好我在使用STM32F746-NUCLEO lwip協議裸跑udp server,接收PC端發來的約8000字節數據。但實驗中發現每次只能接收最大5912個字節,
    發表于 04-25 07:58

    基于MM32G5330的FlexCAN實現CANopenNode協議移植

    本文將介紹如何基于靈動MM32G5330的FlexCAN實現CANopenNode協議移植,并使用靈動官方提供的開發板Mini-G5333進行驗證。
    發表于 04-12 09:15 ?1464次閱讀
    基于MM32G5330的FlexCAN實現CANopenNode<b class='flag-5'>協議</b><b class='flag-5'>棧</b><b class='flag-5'>移植</b>

    ethernetif_input和tcpip協議線程的作用

    tcpip協議線程是lwIP協議的核心線程,負責處理TCP/IP協議
    的頭像 發表于 03-20 10:01 ?1316次閱讀

    基于嵌入式OS的LwIP協議

    設計通信協議程序,需要具備內存管理、任務管理、進程間通信、信號量、時鐘、定時處理等功能,從頭開始難度巨大,而且容易出錯。
    發表于 02-03 16:19 ?838次閱讀
    基于嵌入式OS的<b class='flag-5'>LwIP</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b>

    使用LwIP協議淺析實戰分析(i.MX RT)

    LWIP協議網絡分層 LwIP(Light weight IP),是一種輕量化且開源的TCP/IP協議
    的頭像 發表于 02-02 17:05 ?1705次閱讀
    使用<b class='flag-5'>LwIP</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b>淺析實戰分析(i.MX RT)

    通信網絡協議UDP協議技術解析

    在通常的網絡協議中,TCP/IP協議是一個常見的示例,其中UDP和TCP都是傳輸層協議。傳輸
    發表于 02-01 11:00 ?971次閱讀
    通信<b class='flag-5'>網絡</b><b class='flag-5'>協議</b><b class='flag-5'>棧</b><b class='flag-5'>之</b>UDP<b class='flag-5'>協議</b>技術解析

    lwip可以開幾個socket

    lwIP(Lightweight IP)是一個用于嵌入式系統的開源TCP/IP協議。它提供了一個輕量級的、可裁剪的實現,適用于各種嵌入式系統,包括單片機和小型處理器。lwIP的設計目
    的頭像 發表于 01-09 14:05 ?2088次閱讀
    主站蜘蛛池模板: 2019午夜福合集不打码| 内射一区二区精品视频在线观看| 粉嫩自拍 偷拍 亚洲| 99热精品在线视频观看| 最近中文字幕完整版高清| 亚洲熟女乱色一区二区三区| 侮辱丰满美丽的人妻| 我和妽妽在厨房里的激情区二区 | 中文字幕在线播放| 野草观看免费高清视频| 亚洲人成电影网站色2017| 亚洲国产成人精品青青草原100| 无码137片内射在线影院| 色婷婷粉嫩AV精品综合在线| 日韩人妻无码精品-专区| 色戒西瓜视频| 天天看高清影视在线18| 微福利92合集| 中文字幕成人| 97超视频在线观看| 99视频一区| 99热精品在线av播放| 99精品国产自在自线| 2019香蕉在线观看直播视频| 在线视频 国产精品 中文字幕| 亚洲国语在线视频手机在线| 色小姐电影qvod播放| 欧美亚洲精品真实在线| 日本不卡不码高清免费| 日本69xxxxx| 日本美女论坛| 色婷婷国产精品视频一区二区| 日本高清免费看| 日本熟妇多毛XXXXX视频| 日本亚洲精品无码区国产电影 | 91久久偷偷做嫩草影院免费看| 在线播放av欧美无码碰| 中文国产在线观看| 2019伊人查蕉在线观看| 99精品国产福利在线观看| xxx88中国|