LwIP学习笔记——STM32 ENC28J60移植与入门
static void
low_level_init(struct netif *netif)
{struct ethernetif *ethernetif = netif->state;/* set MAC hardware address length */netif->hwaddr_len = ETHARP_HWADDR_LEN;/* set MAC hardware address */netif->hwaddr[0] = 'A';netif->hwaddr[1] = 'R';netif->hwaddr[2] = 'M';netif->hwaddr[3] = 'N';netif->hwaddr[4] = 'E';netif->hwaddr[5] = 'T';/* maximum transfer unit */netif->mtu = 1500;/* device capabilities *//* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;/* Do whatever else is needed to initialize interface. */enc28j60_init(netif->hwaddr); // 【1】
}
static err_t
low_level_output(struct netif *netif, struct pbuf *p)
{struct ethernetif *ethernetif = netif->state;struct pbuf *q;enc28j60_init_send(p->tot_len); //【1】initiate transfer();#if ETH_PAD_SIZEpbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
#endiffor(q = p; q != NULL; q = q->next) {/* Send the data from the pbuf to the interface, one pbuf at atime. The size of the data in each pbuf is kept in the ->lenvariable. */enc28j60_writebuf( q->payload, q->len ); //【2】send data from(q->payload, q->len);}enc28j60_start_send(); //【3】signal that packet should be sent();#if ETH_PAD_SIZEpbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
#endifLINK_STATS_INC(link.xmit);return ERR_OK;
}
static struct pbuf *
low_level_input(struct netif *netif)
{struct ethernetif *ethernetif = netif->state;struct pbuf *p, *q;u16_t len;len = enc28j60_packet_getlen(); // 【1】#if ETH_PAD_SIZElen += ETH_PAD_SIZE; /* allow room for Ethernet padding */
#endif/* We allocate a pbuf chain of pbufs from the pool. */p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);if (p != NULL) {#if ETH_PAD_SIZEpbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
#endiffor(q = p; q != NULL; q = q->next) {enc28j60_readbuf (q->payload, q->len ); //【2】read data into(q->payload, q->len);}enc28j60_finish_receive(); //【3】acknowledge that packet has been read();#if ETH_PAD_SIZEpbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
#endifLINK_STATS_INC(link.recv);} else {enc28j60_finish_receive(); //【4】drop packet();LINK_STATS_INC(link.memerr);LINK_STATS_INC(link.drop);}return p;
}
#ifndef __LWIPOPTS_H__
#define __LWIPOPTS_H__#define SYS_LIGHTWEIGHT_PROT 0#define NO_SYS 1#define NO_SYS_NO_TIMERS 1/* ---------- Memory options ---------- */
/* MEM_ALIGNMENT: should be set to the alignment of the CPU for whichlwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2byte alignment -> define MEM_ALIGNMENT to 2. */
#define MEM_ALIGNMENT 4/* MEM_SIZE: the size of the heap memory. If the application will send
a lot of data that needs to be copied, this should be set high. */
#define MEM_SIZE (5*1024)/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the applicationsends a lot of data out of ROM (or other static memory), thisshould be set high. */
#define MEMP_NUM_PBUF 10
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. Oneper active UDP "connection". */
#define MEMP_NUM_UDP_PCB 6
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCPconnections. */
#define MEMP_NUM_TCP_PCB 10
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCPconnections. */
#define MEMP_NUM_TCP_PCB_LISTEN 6
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCPsegments. */
#define MEMP_NUM_TCP_SEG 12
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously activetimeouts. */
#define MEMP_NUM_SYS_TIMEOUT 3/* ---------- Pbuf options ---------- */
/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
#define PBUF_POOL_SIZE 10/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
#define PBUF_POOL_BUFSIZE 1500/* ---------- TCP options ---------- */
#define LWIP_TCP 1
#define TCP_TTL 255/* Controls if TCP should queue segments that arrive out oforder. Define to 0 if your device is low on memory. */
#define TCP_QUEUE_OOSEQ 0/* TCP Maximum segment size. */
#define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) *//* TCP sender buffer space (bytes). */
#define TCP_SND_BUF (2*TCP_MSS)/* TCP sender buffer space (pbufs). This must be at least = 2 *TCP_SND_BUF/TCP_MSS for things to work. */
#define TCP_SND_QUEUELEN (6 * TCP_SND_BUF)/TCP_MSS/* TCP receive window. */
#define TCP_WND (2*TCP_MSS)/* ---------- ICMP options ---------- */
#define LWIP_ICMP 1/* ---------- DHCP options ---------- */
/* Define LWIP_DHCP to 1 if you want DHCP configuration ofinterfaces. DHCP is not implemented in lwIP 0.5.1, however, soturning this on does currently not work. */
#define LWIP_DHCP 0/* ---------- UDP options ---------- */
#define LWIP_UDP 1
#define UDP_TTL 255/* ---------- Statistics options ---------- */
#define LWIP_STATS 0
#define LWIP_PROVIDE_ERRNO 1/*** LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)*/
#define LWIP_NETCONN 0/*** LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)*/
#define LWIP_SOCKET 0#endif /* __LWIPOPTS_H__ */
void LwIP_Config (void)
{struct ip_addr ipaddr;struct ip_addr netmask;struct ip_addr gw;// 调用LWIP初始化函数lwip_init();IP4_ADDR(&ipaddr, 192, 168, 1, 16); // 设置网络接口的ip地址IP4_ADDR(&netmask, 255, 255, 255, 0); // 子网掩码IP4_ADDR(&gw, 192, 168, 1, 1); // 网关// 初始化enc28j60与LWIP的接口,参数为网络接口结构体、ip地址、// 子网掩码、网关、网卡信息指针、初始化函数、输入函数netif_add(&enc28j60, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);// 把enc28j60设置为默认网卡netif_set_default(&enc28j60);netif_set_up(&enc28j60);
}
timer_typedef tcp_timer, arp_timer;/* 设定查询定时器 ARP定时器 */timer_set(&tcp_timer, CLOCK_SECOND / 10); // tcp处理定时器 100mstimer_set(&arp_timer, CLOCK_SECOND * 5); // arp处理定时器 5swhile (1) {if (enc28j60_packet_getcount() != 0) {ethernetif_input(&enc28j60);}// TCP 定时处理if (timer_expired(&tcp_timer)) {timer_set(&tcp_timer, CLOCK_SECOND / 4);tcp_tmr();}// ARP 定时处理if (timer_expired(&arp_timer)) {timer_set(&arp_timer, CLOCK_SECOND * 5);etharp_tmr();}}
LwIP学习笔记——STM32 ENC28J60移植与入门相关推荐
- Java 学习笔记:第一章 Java入门
Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...
- Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】
Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...
- JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】
黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...
- 《Go语言圣经》学习笔记 第一章 Go语言入门
Go语言圣经学习笔记 第一章 Go语言入门 目录 Hello, World 命令行参数 查找重复的行 GIF动画 获取URL 并发获取多个URL Web服务 本章要点 注:学习<Go语言圣经&g ...
- 【LWIP】LWIP协议|相关知识汇总|LWIP学习笔记
这里作为一个汇总帖把,把以前写过的LWIP相关的博客文章汇总到一起,方便自己这边查找一些资料. 收录于: [LWIP]LWIP协议|相关知识汇总|LWIP学习笔记 LWIP协议 [LWIP]LWIP网 ...
- Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)
Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...
- 嵌入式学习笔记——STM32的USART通信概述
文章目录 前言 常用通信协议分类及其特征介绍 通信协议 通信协议分类 1.同步异步通信 2.全双工/半双工/单工 3.现场总线/板级总线 4. 串行/并行通信 5. 有线通信.无线通信 STM32通信 ...
- 【学习笔记】网络流算法简单入门
[学习笔记]网络流算法简单入门 [大前言] 网络流是一种神奇的问题,在不同的题中你会发现各种各样的神仙操作. 而且从理论上讲,网络流可以处理所有二分图问题. 二分图和网络流的难度都在于问题建模,一般不 ...
- Redis学习笔记①基础篇_Redis快速入门
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...
最新文章
- 前 Google 工程师总结的算法面试指南
- 邬贺铨:5G资费便宜10倍 WiFi覆盖更为重要
- 用python操作MySQL
- 2021的第一封拒信来自2021年年度青年活动家本科生奖!
- SonarQube 代码扫描任务集成
- 1.1 lambda表达式
- 伪异步 I/O 编程
- 市场主流单片机的介绍和选择指南
- Windows10添加英文输入法
- 21天攻克PET核心词汇,加油!
- 数据可视化与大数据分析
- MATLAB 2019 快速入门教程(官方手册翻译)(1/4)
- ZYNQ学习笔记(五)---按键控制LED灯亮灭实验
- 维特比译码算法(Viterbi decoding algorithm)
- python识别图片中数字_Python图像处理之图片验证码识别
- IDEA下载GIT分支代码
- 21考研:一研为定,定为研一
- acl 影响因子_计算机系部分会议级别和影响因子(DB、AI相关方向)
- AWS知识图谱大赛之networkx图算法
- 微纳制造技术必会知识以及基本介绍
热门文章
- 百度快照优化推广五大坑
- 瑞幸点燃导火索,兄弟公司神州租车迎大变局
- 购房新政:减免住房交易税 放宽还迁房上市条件
- 外媒 MacRumors 报道,Mac Otakara 发布了最新报告
- keil4怎么移植其他人的程序_遗传性脱发怎么自救,头发稀少掉发的原因?怎么办?...
- MIT TR 35揭晓:阿里巴巴王刚、吴翰清等六位华人当选,Ian Goodfellow上榜
- 由PVID引起的故障现象
- mysql+下周,sql统计本周,本月,下周,下月sql语句
- 信息安全专家李钊博士| 个人信息
- windows 音频编程