stm32f4 lwIP开发笔记
RMII (Reduced Media Independent Interface) 简化媒体独立接口
MII :媒体独立接口,也叫介质无关接口。它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1)
PHY(英语:Port Physical Layer),中文可称之为端口物理层,是一个对OSI模型物理层的共同简称。
MAC介质访问控制(medium access control)。 是解决当局域网*用信道的使用产生竞争时,如何分配信道的使用权问题。
PHY是物理接口收发器,它实现物理层。包括MII/GMII(介质独立接口)子层、PCS(物理编码子层)、PMA(物理介质附加)子层、PMD(物理介质相关)子层、MDI子层。
1.3.2 添加及修改ST以太网库 -----------------芯片以太网库
1)添加以太网库 --- 文件在---》STM32F4x7_ETH_LwIP_V1.1.0-->>Libraries--->STM32F4x7_ETH_Driver
2)修改stm32f4x7_eth_conf.h
3) 修改stm32f4x7_eth.c文件 Rx_Buff[] Tx_Buff[] DMARxDscrTab[] 和 DMATxDscrTab[]
1.3.3 添加网卡驱动程序 ----------------网卡驱动
1)STM32F4以太网DMA描述符 两种结构:环形结构和链接结构
2)添加LAN8720 和MAC /DMA驱动
HARDWARE 添加 lan8720.c /lan8720.h FWLIB 添加stm32f4xx_syscfg.c
在此,俱体讲述lan8720.c里面的网卡驱动程序。
1.3.4 LWIP数据包和网络接口管理 -----------------
1)LWIP数据包管理
LWIP协议栈使用pbuf结构体来描述协议栈使用中的数据包,pbuf结构体在pbuf.h中有定议
具体说明这个结构体内容
3)LWIP网络接口管理
在LWIP中对于网络接口的描述是通过一个netif结构体完成的,netif结构体在netif.h文件
中有定义,定义如下,由于netif结构体比较大,
具体说明
1.3.5 添加LWIP源文件
新建LWIP文件夹 ——》在此新建文件夹中添加 lwip-1.4.1
在工程新建: LWIP-NETIF 路径: lwip-1.4.1 --> src --> netif 下 etharp.c 和 ethernetif.c
LWIP-API 路径: lwip-1.4.1 --> src --> api 下 所有文件
LWIP-CODE 路径1: lwip-1.4.1 --> src --> core ->ipv4 下 所有文件
路径2: lwip-1.4.1 --> src --> core 下 所有 .c 文件
添加头文件: ..\LWIP\lwip-1.4.1\src\include
..\LWIP\lwip-1.4.1\src\include\ipv4
..\LWIP\lwip-1.4.1\src\include\netif
1.3.6 添加中间文件
我们上面只是装LWIP源文件和以太网的驱动都添加到工程中,要装以太网驱动和LWIP连拉起来还需要一些
其他文件,而这些文件非常重要, 以下是讲解如何添加这些文件
1)添加arch文件
复制 LWIP文件夹 arch文件夹到自己工程 arch 内有5个文件:cc.h cpu.h perf.h sys_arch.h sys_arch.c
cc.h 主要完成了协议栈内部使用的数据类型的定义
cpu.h 用来定义cpu的大小端模式,因为STM32是小端模式,因此这里定义BYTE_ORDER为小端模式。
per.h 是和系统测量与统计相关的文件,我们不使用任何的测量和统计,因此这个文件中的两个宏定义为空的。
sys_arch.h 和 sys_arch.c 是在使用操作系统的时候才使用到的文件,在这里我们只是在
sys_arch.h文件中简单的实现了获取时间的函数,sys_now(),在lwip_localtime
为一个合局变量,用来为LWIP提供时钟。
在新建工程添加 LWIP-ARCH分组, 并将sys_arch.c文件添加到这个分组中并且添加相应的头文件路径。
2)添加LWIP通用文件
lwip_app文件夹用来放我们以后所有实验的代码:
lwip_app -> lwip_comm文件夹
lwip_comm -> lwip_comm.c lwip_comm.h lwipopts.h
lwip_comm.c 和 lwip_comm.h 是将LWIP源码 和 前面的以太网驱动库结合起来的 --》桥梁
这两个文件非常重要,这两个文件有ALIENTEK提供。
lwipopts.h是用来裁剪和配置LWIP的文件, 以后我们想要使用LWIP的什么功能的话,就在这个文件配置
在工程中,新建一个 LWIP -APP分组 ,并将 lwip_comm.c文件添加到这个分组
3)添加ethernetif.h文件
13.7 LWIP源码修改
1)修改LWIP源文件名字
路径: lwip-1.4.1 --> src --> core 下有个 sys.c文件
路径: lwip-1.4.1 --> src --> include-->lwip 下有个 sys.h文件
因与SYSTEM文件夹同名 因而改成
lwip_sys.c 与lwip_sys.c
同时也要改LWIP源码里的 #include "sys.h" 改成 #include "lwip_sys.h"
2)修改ethernetif.c文件
原: ethernetif.c文件路径: LWIP--> src --> netif
用我们网络实验1LWIP无操作系统植实验中的 ethernetif.c文件替代LWIP源码中的这个文件。
//--------------------------------------------------------------------------------
//用于初始化硬件 //netif :网卡结构体指针
static err_t low_level_init(struct netif *netif)
//用于发送数据包的最底层函数 网卡结构体指针, 数据结构体指针
static err_t low_level_output(struct netif *netif, struct pbuf *p)
//用于数据包的最底层函数
static struct pbuf * low_level_input(struct netif *netif)
//网卡接收数据(lwip直接调用
err_t ethernetif_input(struct netif *netif)
//初始化网络
err_t ethernetif_init(struct netif *netif)
//------------------------------------------------------------------------------------
3)修改mem.c 和 memp.c文件 // 路径: lwip-1.4.1 --> src --> core
LWIP动态内存管理技术,
LWIP有一个内存堆ram_heap 和 内存池 memp_memory 这两个是LWIP的内存来源
分别在 mem.c 和 memp.c文件
在mem.c文件中将ram_heap数组注销掉 , 定义为指向u8_t的指针
//u8_t ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT];
u8_t *ram_heap; //ram_heap 采用ALIENTEK进行分配,分配过程在 mem_init中
在memp.c文件中将memp_memory数组屏蔽掉,改为指针
//static u8_t memp_memory[MEM_ALIGNMENT - 1]
u8_t *memp_memory;
memp.c文件中添加memp_get_memorysize()函数 。 memp_memory 我们会在lwip_comm.c文件中使用动态内存管理函数为其分配内存
4)修改icmp.c文件
我们需要修改icmp.c文档使其支持硬件帧校验
//#if CHECKSUM_GEN_ICMP
// /* adjust the checksum */
// if (iecho->chksum >= PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
// iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1;
// } else {
// iecho->chksum += PP_HTONS(ICMP_ECHO << 8);
// }
//#else /* CHECKSUM_GEN_ICMP */
// iecho->chksum = 0;
//#endif /* CHECKSUM_GEN_ICMP */
改----------------------------------
#ifdef CHECKSUM_BY_HARDWARE
iecho->chksum = 0;
#else
/* adjust the checksum */
if (iecho->chksum >= htons(0xffff - (ICMP_ECHO << 8))) {
iecho->chksum += htons(ICMP_ECHO << 8) + 1;
} else {
iecho->chksum += htons(ICMP_ECHO << 8);
}
#endif
1.3.8 LWIP的裁剪与配置
在LWIP的源码中有个opt.h的文件,这个文件是裁剪和配置LWIP的,
因其是条件编译,在其实地方定议了,opt.h里面定义就不起作用
LWIP->lwip_app->lwip_comm 下有一个lwipopts.h的文件, 这个文件就是用来裁剪与配置lwipopt.h
1.4 软件设计