初始化配置步驟
第一:硬件底層DMA緩存以及以太網(wǎng)內(nèi)存初始化
if(ETH_Mem_Malloc())return 1; //內(nèi)存申請失敗
if(lwip_comm_mem_malloc())return 1; //內(nèi)存申請失敗
u8 ETH_Mem_Malloc(void)
{
DMARxDscrTab=mymalloc(SRAMIN,ETH_RXBUFNB*sizeof(ETH_DMADESCTypeDef));//申請內(nèi)存
DMATxDscrTab=mymalloc(SRAMIN,ETH_TXBUFNB*sizeof(ETH_DMADESCTypeDef));//申請內(nèi)存
Rx_Buff=mymalloc(SRAMIN,ETH_RX_BUF_SIZE*ETH_RXBUFNB); //申請內(nèi)存
Tx_Buff=mymalloc(SRAMIN,ETH_TX_BUF_SIZE*ETH_TXBUFNB); //申請內(nèi)存
if(!DMARxDscrTab||!DMATxDscrTab||!Rx_Buff||!Tx_Buff)
{
ETH_Mem_Free();
return 1; //申請失敗
}
return 0; //申請成功
}
//lwip中mem和memp的內(nèi)存申請
//返回值:0,成功;
// 其他,失敗
u8 lwip_comm_mem_malloc(void)
{
u32 mempsize;
u32 ramheapsize;
mempsize=memp_get_memorysize(); //得到memp_memory數(shù)組大小
memp_memory=mymalloc(SRAMIN,mempsize); //為memp_memory申請內(nèi)存
ramheapsize=LWIP_MEM_ALIGN_SIZE(MEM_SIZE)+2*LWIP_MEM_ALIGN_SIZE(4*3)+MEM_ALIGNMENT;//得到ram heap大小
ram_heap=mymalloc(SRAMIN,ramheapsize); //為ram_heap申請內(nèi)存
if(!memp_memory||!ram_heap)//有申請失敗的
{
lwip_comm_mem_free();
return 1;
}
return 0;
}
第二步:網(wǎng)卡硬件初始化
LAN8720_Init()
第三步:以太網(wǎng)初始化
lwip_init();
第四步:設(shè)置IP地址
//靜態(tài):
IP4_ADDR(&ipaddr,192.168.1.100);
IP4_ADDR(&netmask,192.168.1.1);
IP4_ADDR(&gw,255.255.255.0);
//動態(tài)暫時為0,待會自動獲?。?p>IP4_ADDR(&ipaddr,0.0.0.0);
IP4_ADDR(&netmask,0.0.0.0);
IP4_ADDR(&gw,0.0.0.0);
第五步:添加網(wǎng)卡
Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,ðernet_input);
1
第六步:如果為動態(tài)IP則開啟動態(tài)IP服務(wù)
lwipdev.dhcpstatus=0; //DHCP標記為0
dhcp_start(&lwip_netif); //開啟DHCP服務(wù)
第七步:設(shè)置默認網(wǎng)口,并打開
netif_set_default(&lwip_netif); //設(shè)置netif為默認網(wǎng)口
netif_set_up(&lwip_netif); //打開netif網(wǎng)口
第八步:等待動態(tài)獲取IP,如果獲取失敗,則使用靜態(tài)IP
while((lwipdev.dhcpstatus!=2)&&(lwipdev.dhcpstatus!=0XFF))//等待DHCP獲取成功/超時溢出
{
lwip_periodic_handle();
}
//LWIP輪詢?nèi)蝿?wù)
void lwip_periodic_handle()
{
#if LWIP_TCP
//每250ms調(diào)用一次tcp_tmr()函數(shù)
if (lwip_localtime - TCPTimer >= TCP_TMR_INTERVAL)
{
TCPTimer = lwip_localtime;
tcp_tmr();
}
#endif
//ARP每5s周期性調(diào)用一次
if ((lwip_localtime - ARPTimer) >= ARP_TMR_INTERVAL)
{
ARPTimer = lwip_localtime;
etharp_tmr();
}
#if LWIP_DHCP //如果使用DHCP的話
//每500ms調(diào)用一次dhcp_fine_tmr()
if (lwip_localtime - DHCPfineTimer >= DHCP_FINE_TIMER_MSECS)
{
DHCPfineTimer = lwip_localtime;
dhcp_fine_tmr();
if ((lwipdev.dhcpstatus != 2)&&(lwipdev.dhcpstatus != 0XFF))
{
lwip_dhcp_process_handle(); //DHCP處理
}
}
//每60s執(zhí)行一次DHCP粗糙處理
if (lwip_localtime - DHCPcoarseTimer >= DHCP_COARSE_TIMER_MSECS)
{
DHCPcoarseTimer = lwip_localtime;
dhcp_coarse_tmr();
}
#endif
}
void lwip_dhcp_process_handle(void)
{
u32 ip=0,netmask=0,gw=0;
switch(lwipdev.dhcpstatus)
{
case 0: //開啟DHCP
dhcp_start(&lwip_netif);
lwipdev.dhcpstatus = 1; //等待通過DHCP獲取到的地址
printf("正在查找DHCP服務(wù)器,請稍等...........rn");
break;
case 1: //等待獲取到IP地址
{
ip=lwip_netif.ip_addr.addr; //讀取新IP地址
netmask=lwip_netif.netmask.addr;//讀取子網(wǎng)掩碼
gw=lwip_netif.gw.addr; //讀取默認網(wǎng)關(guān)
if(ip!=0) //正確獲取到IP地址的時候
{
lwipdev.dhcpstatus=2; //DHCP成功
printf("網(wǎng)卡en的MAC地址為:................%d.%d.%d.%d.%d.%drn",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);
//解析出通過DHCP獲取到的IP地址
lwipdev.ip[3]=(uint8_t)(ip>>24);
lwipdev.ip[2]=(uint8_t)(ip>>16);
lwipdev.ip[1]=(uint8_t)(ip>>8);
lwipdev.ip[0]=(uint8_t)(ip);
printf("通過DHCP獲取到IP地址..............%d.%d.%d.%drn",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
//解析通過DHCP獲取到的子網(wǎng)掩碼地址
lwipdev.netmask[3]=(uint8_t)(netmask>>24);
lwipdev.netmask[2]=(uint8_t)(netmask>>16);
lwipdev.netmask[1]=(uint8_t)(netmask>>8);
lwipdev.netmask[0]=(uint8_t)(netmask);
printf("通過DHCP獲取到子網(wǎng)掩碼............%d.%d.%d.%drn",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
//解析出通過DHCP獲取到的默認網(wǎng)關(guān)
lwipdev.gateway[3]=(uint8_t)(gw>>24);
lwipdev.gateway[2]=(uint8_t)(gw>>16);
lwipdev.gateway[1]=(uint8_t)(gw>>8);
lwipdev.gateway[0]=(uint8_t)(gw);
printf("通過DHCP獲取到的默認網(wǎng)關(guān)..........%d.%d.%d.%drn",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
}else if(lwip_netif.dhcp->tries>LWIP_MAX_DHCP_TRIES) //通過DHCP服務(wù)獲取IP地址失敗,且超過最大嘗試次數(shù)
{
lwipdev.dhcpstatus=0XFF;//DHCP超時失敗.
//使用靜態(tài)IP地址
IP4_ADDR(&(lwip_netif.ip_addr),lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
IP4_ADDR(&(lwip_netif.netmask),lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
IP4_ADDR(&(lwip_netif.gw),lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
printf("DHCP服務(wù)超時,使用靜態(tài)IP地址!rn");
printf("網(wǎng)卡en的MAC地址為:................%d.%d.%d.%d.%d.%drn",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);
printf("靜態(tài)IP地址........................%d.%d.%d.%drn",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
printf("子網(wǎng)掩碼..........................%d.%d.%d.%drn",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
printf("默認網(wǎng)關(guān)..........................%d.%d.%d.%drn",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
}
}
break;
default : break;
}
}
#endif
第九步:測試
udp_demo_test();
1
UDP協(xié)議測試的步驟
第一步:如果對方IP是動態(tài)的,則第一步為設(shè)置遠程IP
udp_demo_set_remoteip();
//部分代碼
/*前三一般較為固定,實際是只需設(shè)置第四部分*/
lwipdev.remoteip[0]=lwipdev.ip[0]; //192
lwipdev.remoteip[1]=lwipdev.ip[1]; //168
lwipdev.remoteip[2]=lwipdev.ip[2]; //1
while(1)
{
key=KEY_Scan(0);
if(key==WKUP_PRES)break;
else if(key)
{
if(key==KEY0_PRES)lwipdev.remoteip[3]++;//IP增加
if(key==KEY2_PRES)lwipdev.remoteip[3]--;//IP減少
LCD_ShowxNum(xoff,150,lwipdev.remoteip[3],3,16,0X80);//顯示新IP
}
}
第二步:創(chuàng)建DCP控制塊
udppcb=udp_new();
第三步:連接指定IP,指定端口
err=udp_connect(udppcb,&rmtipaddr,UDP_DEMO_PORT);//UDP客戶端連接到指定IP地址和端口號的服務(wù)器
第四步:綁定本地IP和端口號
err=udp_bind(udppcb,IP_ADDR_ANY,UDP_DEMO_PORT);//綁定本地IP地址與端口號
1
第五步:注冊接收回調(diào)函數(shù),只要接收到數(shù)據(jù),這個回調(diào)函數(shù)會被lwip內(nèi)核調(diào)用
udp_recv(udppcb,udp_demo_recv,NULL);//注冊接收回調(diào)函數(shù)
//回調(diào)函數(shù)的編寫
void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)
{
u32 data_len = 0;
struct pbuf *q;
if(p!=NULL) //接收到不為空的數(shù)據(jù)時
{
memset(udp_demo_recvbuf,0,UDP_DEMO_RX_BUFSIZE); //數(shù)據(jù)接收緩沖區(qū)清零
for(q=p;q!=NULL;q=q->next) //遍歷完整個pbuf鏈表
上一篇:STM32_IAP遠程升級及C#上位機
下一篇:STM32移植lwip之建立tcp客戶端
推薦閱讀
史海拾趣
2007年,Broadic在美國加州成立,以其前瞻性的視野和深厚的技術(shù)積累,迅速在電子行業(yè)中嶄露頭角。同年,公司開始著手研發(fā)創(chuàng)新的芯片技術(shù),奠定了其未來發(fā)展的堅實基礎(chǔ)。2008年,深圳市展恒電子有限公司應(yīng)運而生,作為Broadic在國內(nèi)的銷售公司,它的成立標志著Broadic正式進入中國市場,開始了其在國內(nèi)的快速發(fā)展之旅。
得力公司之所以能夠在電子行業(yè)中不斷發(fā)展壯大,離不開其持續(xù)創(chuàng)新的企業(yè)文化。公司鼓勵員工敢于嘗試、勇于創(chuàng)新,不斷挑戰(zhàn)自我和行業(yè)極限。同時,得力還注重知識產(chǎn)權(quán)保護,積極申請專利和商標,保護自己的創(chuàng)新成果。這種持續(xù)創(chuàng)新的企業(yè)文化不僅為得力公司帶來了源源不斷的創(chuàng)新動力,也為其在電子行業(yè)中樹立了良好的品牌形象。
EFINIX公司成立于2012年,由一群來自知名FPGA企業(yè)的創(chuàng)始人團隊創(chuàng)立。他們擁有豐富的FPGA設(shè)計經(jīng)驗,并致力于在可編程邏輯行業(yè)實現(xiàn)突破性的創(chuàng)新。公司總部位于美國加利福尼亞州圣克拉拉市,計劃采用一種全新的現(xiàn)場可編程門陣列(FPGA)技術(shù)——量子可編程技術(shù),來設(shè)計芯片。這種技術(shù)旨在實現(xiàn)芯片尺寸僅為傳統(tǒng)芯片的四分之一,能耗減少一半,同時結(jié)構(gòu)更加簡化。EFINIX公司相信,這種技術(shù)將推動人工智能和深度學(xué)習(xí)的發(fā)展,使數(shù)據(jù)處理更加高效。
德豐影業(yè)股份有限公司(簡稱“德豐影業(yè)”)成立于2013年,由李紀豐擔(dān)任董事長兼總經(jīng)理。公司自成立以來,一直致力于打造高品質(zhì)的影視文化產(chǎn)品,涵蓋了電影、電視劇、網(wǎng)劇等多個領(lǐng)域。德豐影業(yè)憑借對市場的敏銳洞察力和對影視藝術(shù)的執(zhí)著追求,成功投資并制作了一系列備受觀眾喜愛的影視作品。公司的發(fā)展壯大不僅為觀眾帶來了豐富的視覺盛宴,也為中國影視產(chǎn)業(yè)的繁榮發(fā)展做出了積極貢獻。
DLP綠色科技公司,積極響應(yīng)國家環(huán)保政策,致力于研發(fā)和生產(chǎn)綠色環(huán)保的DLP技術(shù)產(chǎn)品。公司采用先進的生產(chǎn)工藝和材料,降低產(chǎn)品能耗和排放。同時,DLP綠色科技還積極推廣節(jié)能環(huán)保的理念和技術(shù),倡導(dǎo)消費者使用環(huán)保產(chǎn)品。通過不懈的努力和實踐,DLP綠色科技在電子行業(yè)樹立了綠色環(huán)保的典范形象,為行業(yè)的可持續(xù)發(fā)展做出了積極貢獻。
請注意,以上故事均為虛構(gòu),旨在展示DLP Design公司在電子行業(yè)中的可能發(fā)展路徑和成就。實際情況可能因公司背景、市場環(huán)境等因素而有所不同。
在1995年,臺灣人章啟僑在美國加州創(chuàng)立了AFOP。當(dāng)時的電子行業(yè)正處于光纖通信技術(shù)的蓬勃發(fā)展時期,章啟僑憑借對市場的敏銳洞察,將公司的業(yè)務(wù)聚焦于光纖通信主被動元件的設(shè)計與制造。在創(chuàng)立初期,AFOP面臨著技術(shù)、資金和市場等多方面的挑戰(zhàn),但章啟僑帶領(lǐng)團隊不斷攻克難關(guān),逐漸在市場中站穩(wěn)腳跟。
linux系統(tǒng)控制兩個gprs modem進行tcp/ip通信的問題 有兩個gprs modem,都可以通過串口發(fā)送at命令撥上gprs,相當(dāng)建立了兩個連接。作為客戶端去連接服務(wù)端時,怎么控制選擇那個modem的連接去通信呢? 即是說怎樣選擇連接通道去建立套接字,好像socket建立只能指定ip和端口,沒有選擇物理接口的參數(shù)吧… 查看全部問答∨ |
在做CETK作業(yè)的時候,發(fā)現(xiàn)CETK的代碼有問題,想修改一下! 可是改過以后,發(fā)現(xiàn)竟不知道怎么編譯!哎! 請高手指點一下!怎么樣才能編譯CETK的代碼!… 查看全部問答∨ |
我現(xiàn)在在做一個nmea 和sirf 的轉(zhuǎn)換工具, 但是目前一直轉(zhuǎn)換不成功, 請各位分析一下原因。 根據(jù)NMEA Reference Manual.pdf 文章中提到, 從nmea 轉(zhuǎn)換到sirf 的命令如下: $PSRF100,0,9600,8,1,0*0C, 由于我機器上轉(zhuǎn)到到sirf 后的baunrate 是5760 ...… 查看全部問答∨ |
STM32串口收數(shù)后回發(fā)時出現(xiàn)問題 while (1) { if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { GPIO_ResetBits(GPIOB, GPIO_Pin_9); j = USART_ReceiveData(USART3);&n ...… 查看全部問答∨ |
P5DIR |= 0x02; // Set P5.1 to output direction 我要怎么才能知道P5DIR的方向,和 它指的是哪個端口呢; 0x02是00000010; P5DIR是0x0032,即00110010嗎; 那P5DIR就是 00000010 00110010 ------------- 00110010 ...… 查看全部問答∨ |
以前在實驗室移動信號在滿格和四格之間,自從聯(lián)通在相隔不到50米的地方的樓頂建的個信號發(fā)射設(shè)備(不知道是否基站),移動信號就幾乎沒信號(極少地方有點信號),求問是否有很大輻射,看到網(wǎng)上回答猜測是否阻塞式干擾 //GSM中,即使既不同頻也不鄰 ...… 查看全部問答∨ |
迄今為止,“光引擎”還沒有一個非常嚴格而又確切的定義,以致不少讀者還不知道到底什么是光引擎。有人把它定義為“LED光引擎(light engine)是指包含LED封裝(組件)或LED數(shù)組(模塊)、LED驅(qū)動器、以及其它亮度、熱學(xué)、機械和電氣組件的整體組合。該裝 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 高性能電動滑板車 BLDC 電機驅(qū)動器:技術(shù)解析與應(yīng)用展望
- 5G工業(yè)網(wǎng)關(guān)的“邊緣計算+AI推理”一體化設(shè)計,PLC協(xié)議解析與缺陷檢測的實時聯(lián)動
- AR眼鏡的“工業(yè)指令投射”系統(tǒng),SLAM的空間定位、PLC數(shù)據(jù)實時疊加顯示
- 多光譜氣體傳感器的抗交叉干擾設(shè)計
- 多模態(tài)融合感知的“語義-幾何”聯(lián)合建模
- 工業(yè)觸摸屏的“壓感-手勢”多模態(tài)交互設(shè)計
- 工業(yè)機器人高精度力控的“雙模融合”傳感器設(shè)計
- 工業(yè)機器人集群的“數(shù)字孿生-物理實體”閉環(huán)優(yōu)化
- 工業(yè)以太網(wǎng)交換機的“時間敏感網(wǎng)絡(luò)(TSN)”改造
- 工業(yè)現(xiàn)場信號測試:耦合方式選擇實戰(zhàn)案例
- TI 高精度實驗室信號鏈精品課大作戰(zhàn)——你學(xué)習(xí)我送禮!
- TI 嵌入式處理器最新產(chǎn)品發(fā)布會 全程在線直播 4月16日精彩為您呈現(xiàn)!預(yù)報名、看直播、享好禮
- 【TI 嵌入式研討會集錦】小站添加了很多新內(nèi)容,歡迎提貨!
- 《帶您了解ADI數(shù)字健康生物傳感器系列》有獎直播
- 解鎖【W(wǎng)5500-EVB-Pico】,探秘以太網(wǎng)底層,得捷Follow me第4期來襲!
- 免費下載Vishay最新汽車解決方案
- 答題贏京東卡|《安森美和安富利物聯(lián)網(wǎng)創(chuàng)新設(shè)計大賽作品集》
- 有獎?wù){(diào)查:ST MEMS 傳感器論壇用戶問卷調(diào)查,參與有驚喜
- 答題贏好禮:ADI MEMS工業(yè)監(jiān)測助力機器大健康發(fā)展
- 推進“兩網(wǎng)”融合發(fā)展 助推企業(yè)轉(zhuǎn)型升級
- 發(fā)揮信托優(yōu)勢 創(chuàng)新融入泛在電力物聯(lián)網(wǎng)建設(shè)
- 改革創(chuàng)新 擔(dān)當(dāng)作為 加快“三型兩網(wǎng)”建設(shè)
- 打造直流精品工程 推動“三型兩網(wǎng)”建設(shè)
- “泛在電力物聯(lián)網(wǎng)”充電設(shè)施互聯(lián)互通
- 混動技術(shù)之戰(zhàn):自主品牌如何打破合資技術(shù)壟斷?(上)
- 參加世界智能大會,Graphcore要傳遞哪些信息
- “缺芯”困局難破 第三季度恐最缺貨
- “缺芯”浪潮下 全球芯片廠商一季度收入創(chuàng)歷史新高
- 全球芯片短缺可能持續(xù)數(shù)月,甚至數(shù)年