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
    +关注

    关注

    2305

    文章

    11121

    浏览量

    371175
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1418

    浏览量

    83020
  • DHCP
    +关注

    关注

    0

    文章

    107

    浏览量

    20697
  • DM9000
    +关注

    关注

    0

    文章

    24

    浏览量

    17259
  • LwIP
    +关注

    关注

    2

    文章

    89

    浏览量

    29269
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    rtthread网络接口设备 轻量级tcp/ip 堆栈 这两个冲突吗?

    需要使用 lwip 上图中 网络接口设备 需要使能么? 上图中 网络接口设备 是干嘛用的?是一个比lwip 功能弱的tcp/ip 协议
    发表于 09-18 06:16

    让开发板畅游网络:RT-Thread CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    本文通过在RT-Thread操作系统上,使用CherryUSB软件包作为USBHost协议,驱动AIR780E4GCat.1模块的RNDIS功能,并成功接入lwIP网络
    的头像 发表于 07-02 17:04 2977次阅读
    让开发板畅游<b class='flag-5'>网络</b>:RT-Thread CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    机智云配网教程第三期:单片机代码移植实战

    前言本篇文章将分享单片机移植的经验。可以下载并按步骤移植,也可以直接使用已移植好的工程文件。文中将介绍我在移植过程中遇到的问题,并提供解决
    的头像 发表于 07-01 17:32 965次阅读
    机智云配网教程第三期:单片机代码<b class='flag-5'>移植</b>实战

    STM32与机智云连接实现步骤与技巧(下篇):机智云代码移植与优化

    在《STM32与机智云连接实现步骤与技巧(上篇)》中,我们介绍了硬件连接和通信协议配置。本篇将重点讲解如何将机智云相关代码移植STM32
    的头像 发表于 05-23 18:10 809次阅读
    <b class='flag-5'>STM32</b>与机智云连接实现<b class='flag-5'>步骤</b>与技巧(下篇):机智云代码<b class='flag-5'>移植</b>与优化

    STM32与机智云连接实现步骤与技巧(上篇)

    通过STM32与机智云的连接,开发者可以实现设备的远程控制和数据管理,提升物联网应用的智能化水平。本文将介绍STM32与机智云连接的具体步骤,涵盖硬件连接、通信协议配置、数据传输及云平
    的头像 发表于 05-23 18:10 855次阅读
    <b class='flag-5'>STM32</b>与机智云连接实现<b class='flag-5'>步骤</b>与技巧(上篇)

    STM32G431移植FreeModbus

    STM32G431移植FreeModbus 的代码已通过验证,在WeActStudio的STM32G431CoreBoard上进行多次测试,均可正常读取寄存器数值。STM32G431C
    发表于 04-19 16:50 1次下载

    智多晶LWIP网络通信系统介绍

    在物联网蓬勃兴起的当下,嵌入式设备的网络通信能力如同为其插上了腾飞的翅膀,使其能够自由穿梭于信息的浩瀚海洋。而 LWIP,宛如一位身姿矫健的轻骑兵,在资源有限的嵌入式系统中飞驰,轻松完成各种复杂的网络通信任务。西安智多晶微电子有
    的头像 发表于 04-10 16:27 1670次阅读
    智多晶<b class='flag-5'>LWIP</b><b class='flag-5'>网络</b>通信系统介绍

    深入浅出解析低功耗蓝牙协议

    Bluetooth LE协议为什么要分层?怎么理解Bluetooth LE“连接”?如果Bluetooth LE协议只有ATT层没有GATT层会发生什么? 一、协议
    的头像 发表于 04-09 14:49 1009次阅读
    深入浅出解析低功耗蓝牙<b class='flag-5'>协议</b><b class='flag-5'>栈</b>

    三种蓝牙架构实现方案(蓝牙协议方案

    蓝牙架构实现方案有哪几种?我们一般把整个蓝牙实现方案叫做蓝牙协议,因此这个问题也可以这么阐述:蓝牙协议
    的头像 发表于 04-08 15:35 1190次阅读
    三种蓝牙架构实现<b class='flag-5'>方案</b>(蓝牙<b class='flag-5'>协议</b><b class='flag-5'>栈</b><b class='flag-5'>方案</b>)

    移植LWIP+FREERTOS时遇到的问题怎么解决?

    :将ST官网的LWIP1.4.1 的例子(关于LWIP的部分)移植步骤1 的FreeRTOS 系统的工程里面,只是添加LWIP初始化的任务
    发表于 03-11 06:48

    stm32cubeide生成的lwip网络通讯任务跑起来都很正常,为什么一旦加独立看门狗之后就会卡死呢?

    stm32cubeide生成的lwip网络通讯任务跑起来都很正常,为什么一旦加独立看门狗之后就会卡死?
    发表于 03-10 07:29

    《DNESP32S3使用指南-IDF版_V1.6》第四十七章 lwIP初探

    实现与外部网络的通信,包括发送和接收数据包、处理网络连接等。因此,ESP32-S3是基于lwIP来实现网络功能的。章将分为如下几个部分:47.1 TCP/IP
    发表于 02-07 09:28

    LwIP应用开发实战指南—基于野火STM32

    LwIP应用开发实战指南—基于野火STM32—20210122
    发表于 01-17 14:34 9次下载

    STM32WL55JC到STM32WLE5CC的LoRaWAN_FUOTA移植

    电子发烧友网站提供《从STM32WL55JC到STM32WLE5CC的LoRaWAN_FUOTA移植.pdf》资料免费下载
    发表于 01-15 15:24 1次下载
    从<b class='flag-5'>STM32</b>WL55JC到<b class='flag-5'>STM32</b>WLE5CC的LoRaWAN_FUOTA<b class='flag-5'>移植</b>

    Model系列:基于RT-Thread freemodbus主从协议

    ,因而文本将详细介绍Model系列芯片基于RT-Threadfreemodbus主从协议的配置与应用,涵盖主机和从机测试的详细步骤,希望通过本文能够帮助各位开发者快
    的头像 发表于 12-30 17:32 1027次阅读
    Model系列:基于RT-Thread freemodbus主从<b class='flag-5'>协议</b><b class='flag-5'>栈</b>