娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

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

發(fā)布者:EnchantedHeart最新更新時(shí)間:2024-04-30 來源: elecfans關(guān)鍵字:STM32  LWIP  網(wǎng)絡(luò)協(xié)議棧  移植步驟 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

1.LWIP介紹

lwip是瑞典計(jì)算機(jī)科學(xué)院網(wǎng)絡(luò)嵌入式系統(tǒng)小組(SICS)的Adam Dunkels(亞當(dāng)·鄧克爾) 開發(fā)的一個小型開源的TCP/IP協(xié)議棧。實(shí)現(xiàn)的重點(diǎn)是在保持 TCP 協(xié)議主要功能的基礎(chǔ)上減少對RAM的占用。
LwIP是Light Weight(輕型)IP 協(xié)議,有無操作系統(tǒng)的支持都可以運(yùn)行。LwIP 實(shí)現(xiàn)的重點(diǎn)是在保持TCP協(xié)議 主要功能的基礎(chǔ)上減少對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ū)動的工程,在工程中創(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é)議棧默認(rèn)設(shè)備*/

netif_set_default(&lwip_netif);

/*4.注冊網(wǎng)卡設(shè)備為默認(rèn)接口*/

netif_set_up(&lwip_netif);

/*5.動態(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(); //對 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 請求,判斷 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();

}

}

/******獲取動態(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ù)

復(fù)制

#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

關(guān)鍵字:STM32  LWIP  網(wǎng)絡(luò)協(xié)議棧  移植步驟 引用地址:STM32之LWIP網(wǎng)絡(luò)協(xié)議棧移植步驟與方案

上一篇:基于STM32F103C8T6的心率血壓手表設(shè)計(jì)
下一篇:STM32CubeMX之RTC電子鐘

推薦閱讀最新更新時(shí)間:2025-06-25 15:51

基于和欣嵌入式操作系統(tǒng)的構(gòu)件化網(wǎng)絡(luò)協(xié)議棧
嵌入式Internet是隨著嵌入式系統(tǒng)的廣泛應(yīng)用和計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的發(fā)展而產(chǎn)生的一種新概念和技術(shù)。嵌入式系統(tǒng)以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),且軟硬件可裁剪,現(xiàn)已贏得了巨大的市場。隨著 Internet的發(fā)展,各種設(shè)備都產(chǎn)生了連接性的需求,從冰箱到電表,似乎所有電器都需要連入互聯(lián)網(wǎng)。通過為現(xiàn)有嵌入式系統(tǒng)增加因特網(wǎng)接入能力來擴(kuò)展其功能,以Internet為介質(zhì)實(shí)現(xiàn)信息交互,從而產(chǎn)生了嵌入式Internet 技術(shù)。要實(shí)現(xiàn)嵌入式設(shè)備的網(wǎng)絡(luò)化,需要實(shí)現(xiàn)TCP/IP網(wǎng)絡(luò)協(xié)議棧,但由于Internet上各種通信協(xié)議對計(jì)算機(jī)存儲器、運(yùn)算速度等的要求比較高,使得嵌入式系統(tǒng)協(xié)議棧的開發(fā)實(shí)現(xiàn)并不順利。 目前有兩個關(guān)鍵因素影響網(wǎng)絡(luò)協(xié)議棧的開發(fā),一是性能和效
[嵌入式]
VxWorks網(wǎng)絡(luò)協(xié)議棧的MUX接口
??? 摘要: 嵌入式系統(tǒng)網(wǎng)絡(luò)協(xié)議棧的靈活性在應(yīng)用上是一個重要指標(biāo)。介紹嵌入式實(shí)操作系統(tǒng)VxWorks網(wǎng)絡(luò)協(xié)議棧的MUX(Mutiplexer)接口及其使用方法。 ??? 關(guān)鍵詞: VxWorks 網(wǎng)絡(luò)協(xié)議棧 MUX VxWorks是美國Wind River System公司(風(fēng)河公司)推出的一個運(yùn)行在目標(biāo)機(jī)上的高性能、可裁減的嵌入式實(shí)時(shí)操作系統(tǒng)。它以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中,如衛(wèi)星通信、軍事演習(xí)、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。VxWorks操作系統(tǒng)包括進(jìn)程管理、存儲管理、設(shè)備管理、文件系統(tǒng)管理、網(wǎng)絡(luò)協(xié)議及系統(tǒng)應(yīng)用等幾個部分。VxWorks只占
[網(wǎng)絡(luò)通信]
通過STM32cubeMX將STM32F767+LAN8720+LwIP+FreeRTOS的以太網(wǎng)實(shí)現(xiàn)
本文使用了正點(diǎn)原子的阿波羅開發(fā)板,接下來我將粗略的對STM32F767通過STM32cubeMX進(jìn)行以太網(wǎng)協(xié)議配置。 具體步驟 1.首先使能ETH,模式選擇RMII; 2.使能LWIP和FREERTOS; 因?yàn)榘⒉_的開發(fā)板PHY芯片的ETH_DXT1和ETH_DXT0用的是PG13,PG14引腳,和默認(rèn)的不同,所以這里改一下 3.配置時(shí)鐘,在這里我放上我自己的時(shí)鐘配置圖,只要不標(biāo)紅就行,我用的是25MHz外部晶振作時(shí)鐘源 ; 4.配置ETH,由于阿波羅開發(fā)板的LAN8720芯片的PHYAD0引腳懸空,故PHY Address設(shè)置為0; 5.由于我用的STM32cubeMX的版本是將LAN8742A
[單片機(jī)]
通過STM32cubeMX將STM32F767+LAN8720+<font color='red'>LwIP</font>+FreeRTOS的以太網(wǎng)實(shí)現(xiàn)
STM32CubeMX 生成的LWIP 調(diào)試問題
用STM32CubeMX V4.22.1 生成了一個包含 EHT ,Lwip 的項(xiàng)目,調(diào)試一直不正常,經(jīng)仔細(xì)檢查存在以下問題: 1.硬件采用了LAN8720A ,但是STM32CubeMX 生成的是 LAN8742A的代碼,必須根據(jù)硬件連接更改地址。 解決辦法: 在 ..\Src\ethernetif.c 修改如下: heth.Instance = ETH; heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE; // heth.Init.PhyAddress = LAN8742A_PHY_ADDRESS; heth.Init.PhyAddress = LAN8720A_P
[單片機(jī)]
一種基于STM32的PID直流電機(jī)控制系統(tǒng)
近年來,隨著微機(jī)控制技術(shù)、電力電子技術(shù)等迅速發(fā)展,直流電機(jī)因?yàn)槠湔{(diào)速性能好、起動性能好,被廣泛應(yīng)用在高精度、可調(diào)速的場合,如航天、工業(yè)自動化、數(shù)字化控制、工業(yè)機(jī)器人、醫(yī)療設(shè)備等。 1 增量式PID算法與位置式PID算法對比 PID 控制是指比例、積分、微分控制。將系統(tǒng)的輸出經(jīng)過比例、積分、微分三種運(yùn)算后,疊加至輸入中,達(dá)到控制調(diào)速目的。由于其原理簡單、易于實(shí)現(xiàn)等優(yōu)點(diǎn),被應(yīng)用于多種領(lǐng)域。 1.1 位置式PID算法 位置式PID 算法的表達(dá)式為 其中Kp 為比例放大系數(shù),Ti 為積分時(shí)間常量,Td為微分時(shí)間常量。 位置式PID 算法是根據(jù)當(dāng)前實(shí)際位置與要達(dá)到的預(yù)期位置的偏差,進(jìn)行PID 控制。將每一次的誤差進(jìn)行累加作為積分,其運(yùn)
[單片機(jī)]
一種基于<font color='red'>STM32</font>的PID直流電機(jī)控制系統(tǒng)
STM32Cumebx HAL庫實(shí)現(xiàn)STM32 USB虛擬串口的收發(fā)
  這里記錄一下用STM32Cumebx實(shí)現(xiàn)USB虛擬串口的過程,以F072為例大家可以一起學(xué)習(xí)討論一下。 1.新建工程      這里選擇SW燒錄調(diào)試,看個人習(xí)慣,如果不習(xí)慣用SW的你們可以換其他的也行。   我這里因?yàn)橹苯邮褂肕CU的內(nèi)部時(shí)鐘就沒有勾選RCC了,然后直接配置時(shí)鐘樹,具體如下:   最后一點(diǎn)比較重要點(diǎn)的就是要配置USB堆的大小,把它改大一點(diǎn),不然容易出現(xiàn)電腦實(shí)現(xiàn)出現(xiàn)黃色感嘆號情況,這里選的編譯軟件是MDK-ARM。   最后編譯生成代碼 2.用keil打開工程編輯   找到usb_cdc_if.c文件,在文件開始處添加接收USB轉(zhuǎn)串口數(shù)
[單片機(jī)]
STM32Cumebx HAL庫實(shí)現(xiàn)<font color='red'>STM32</font> USB虛擬串口的收發(fā)
STM32的ID號地址
在STM32的全系列MCU中均有一個96位的唯一設(shè)備標(biāo)識符。在ST的相關(guān)資料中,對其功能的描述有3各方面: 用作序列號(例如 USB 字符串序列號或其它終端應(yīng)用程序) 在對內(nèi)部 Flash 進(jìn)行編程前將唯一 ID 與軟件加密原語和協(xié)議結(jié)合使用時(shí)用作安全密鑰以提高 Flash 中代碼的安全性 激活安全自舉過程等 在資料中對其特性的描述是:96 位的唯一設(shè)備標(biāo)識符提供了一個對于任何設(shè)備和任何上下文都唯一的參考號碼。用戶永遠(yuǎn)不能改變這些位。96 位的唯一設(shè)備標(biāo)識符也可以以單字節(jié)/半字/字等不同方式讀取,然后使用自定義算法連接起來。 想要讀取唯一ID,就需要知道它的存儲地址,在不同系列的MCU中地址是有差別的,我們查詢了部分MCU的資料并
[單片機(jī)]
STM32一文通(8) 串口通訊
一.原生串口通訊 原生的串口通信主要是控制器跟串口的設(shè)備或者傳感器通信,不需要經(jīng)過電平轉(zhuǎn)換芯片來轉(zhuǎn)換電平,直接就用TTL電平通信 比如: GPS模塊、GSM模塊、串口轉(zhuǎn)WIFI模塊、HC04藍(lán)牙模塊 二. 串口與PC通訊 USB轉(zhuǎn)串口主要用于設(shè)備跟電腦通信 電平轉(zhuǎn)換芯片一般有CH340、PL2303、CP2102、FT232 使用的時(shí)候電腦端需要安裝電平轉(zhuǎn)換芯片的驅(qū)動 三. RS232標(biāo)準(zhǔn)串口通訊 RS232標(biāo)準(zhǔn)串口主要用于工業(yè)設(shè)備直接通信 電平轉(zhuǎn)換芯片一般有MAX3232,SP3232 四. STM32串口 1. 內(nèi)部結(jié)構(gòu) 寄存器 功能 TX 數(shù)據(jù)發(fā)送 RX 數(shù)據(jù)接收 SC
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 那曲县| 张家港市| 扬州市| 泰安市| 黄梅县| 远安县| 交城县| 武定县| 湘潭县| 金川县| 邯郸县| 松溪县| 霍山县| 东源县| 台中市| 望城县| 弥勒县| 区。| 迁安市| 莲花县| 南丹县| 长泰县| 平顶山市| 淮北市| 阳信县| 龙门县| 荣昌县| 东台市| 金寨县| 滦南县| 南木林县| 时尚| 宁河县| 南投市| 玛曲县| 托里县| 伊宁县| 凤庆县| 龙里县| 桃源县| 永城市|