【应用笔记】AN1088_APM32F4xx系列ETH移植LWIP

1    引言

本应用笔记提供如何在APM32F4xx系列的EVAL Board上配置和应用ETH外设的指南,包括lwip协议栈的移植、代码实现和应用方法。
APM32F4xx微控制器提供了可配置、灵活的以太网外设,用以满足客户的各种应用需求。它支持与外部物理层相连的两个工业标准接口:默认情况下使用的MII和RMI,其中MII仅在IEEE 802.3规范中定义。它有多种应用领域,如交换机、网络接口卡等。且以太网可以借助外设按照IEEE 802.3-2002标准发送和接收数据。
以太网遵守以下标准:
用于以太网MAC的IEEE802.3-2002
用于规定联网时钟同步精度的IEEE1588-2008标准
用于AHB主/从端口的AMBA 2.0 
RMII联盟的RMII规范

2    开发环境介绍

本章主要介绍以太网、APM32F407的ETH外设以及EVAL板相关硬件设计。

2.1    以太网简介

以太网是一种计算机局域网技术,遵守IEEE 802.3 标准,IEEE 802.3规定了包括物理层的连线、电子信号和介质访问层协议的内容。它有多种应用领域,如交换机、网络接口卡等。

2.1.1    物理层

在物理层,由IEEE 802.3 标准规定了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,在实际开发过程中物理层一般是通过一个PHY芯片来实现物理层的功能,在本次应用中我们所使用的开发板APM32F407 EVAL板,板载的PHY芯片使用的是LAN8720A,这是一款体积小、功耗低、的以太网物理层收发器,接口方式仅支持RMII接口。

2.1.2    MAC子层

APM32F407/417xExG系列产品内部集成了介质访问控制(MAC 802.3),完成MAC子层功能,负责与物理层进行数据交接。

2.1.3    TCP/IP协议栈

TCP/IP是一种数据通信机制,协议栈的实现本质上就是对数据包进行处理,LwIP数据包管理提供了一种高效处理的机制。

2.1.3.1 LwIP的简介

LwIP是一款轻量化的TCP/IP协议,是瑞典计算机科学院(SICS)的AdamDunkels开发的一个小型开源的TCP/IP协议栈。在保持TCP协议主要功能的基础上减少对资源的占用。此外LwIP既可以移植到操作系统上运行,也可以在无操作系统的情况下独立运行。可以在网页http://savannah.nongnu.org/projects/lwip/,下载获取到LwIP的各个版本的源代码包和对应的contrib包。例程中使用的版本是lwip-1.4.1。

2.1.3.2 LwIP的主要特性

1. 支持ARP协议(以太网地址解析协议)。
2. 支持ICMP协议(控制报文协议),用于网络的调试与维护。
3. 支持IGMP协议(互联网组管理协议),可以实现多播数据的接收。
4. 支持UDP协议(用户数据报协议)。
5. 支持TCP协议(传输控制协议),包括阻塞控制、RTT估算、快速恢复和快速转发。
6. 支持PPP协议(点对点通信协议),支持PPPoE。
7. 支持DNS(域名解析)。
8. 支持DHCP协议,动态分配IP地址。
9. 支持IP协议,包括IPv4、IPv6协议,支持IP分片与重装功能,多网络接口下的数据包转发。
10. 支持SNMP协议(简单网络管理协议)。
11. 支持AUTOIP,自动IP地址配置。
12. 提供专门的内部回调接口(Raw API),用于提高应用程序性能。
13. 提供可选择的Socket API、NETCONN API(在多线程情况下使用)。

2.1.3.3 LwIP的编程接口

LwIP 提供了三种编程接口,分别为RAW/Callback API、NETCONN API、SOCKET API。SOCKET API的易用性最高相对执行效率也最低,而RAW/Callback API的易用性最低但执行效率最高,需要用户根据实际情况进行选择。

2.2    APM32的ETH外设

以太网外设包括带专用DMA控制器的MAC 802.3。它支持默认情况下使用的MII和RMII,并通过选择位切换。还包括用于与外部PHY通信的SMI。通过一配置寄存器可以选择MAC控制器和DMA控制器的模式和功能。
在发送数据时,先将数据由系统存储器以DMA的方式发送至TX FIFO缓冲后通过MAC内核发送。通过线路接收的以太网帧经过DMA发送到系统存储器之前由RX FIFO存储。

2.2.1    站管理接口(SMI)

SMI支持访问32个PHY,应用程序通过2线时钟和数据线从32个PHY中选择一个PHY,然后访问任意PHY寄存器。任意给定时间内只能对一个PHY中的一个寄存器进行寻址。
SMI写操作:当MAC_ADDR的MB位和MW位被应用程序置1时,SMI通过发送PHY地址、PHY中的寄存器地址以及写入数据来触发PHY寄存器的写操作。当执行写操作时,应用程序不能修改MAC_ADDR和MAC_DATA寄存器。完成写操作后,SMI将复位MB位。
SMI读操作:当设置MAC_ADDR中的MB位、且MW位清零时,SMI将通过发送PHY地址和PHY中的寄存器地址来触发PHY寄存器的读操作。当执行读操作时,应用程序不能修改MAC_ADDR和MAC_DATA寄存器。完成读操作后,SMI将复位MB位,然后将从PHY中读取的数据更新到MAC_DATA寄存器。

2.2.2    介质独立接口(MII)

MII定义了MAC子层与PHY在10Mbit/s和100Mbit/s的数据传输速率下的互连。信号如下:
MII_TX_EN:发送使能信号,MAC当前正针对MII发送半字节
MII_RX_DV:数据接收有效信号,PHY当前正针对MII接收已恢复并解码的半字节
MII_TXD[3:0]:数据发送信号
MII_RXD[3:0]:数据接收信号
MII_RX_ER:接收错误信号
MII_TX_CLK:连续时钟信号,为TX数据传输提供参考时序
MII_RX_CLK:连续时钟信号,为RX数据传输提供参考时序
MII_CRS:载波侦听信号
MII_COL:冲突检测信号
MII时钟源:必须向外部PHY提供25MHz时钟才能生成TX_CLK和RX_CLK时钟信号,通过MCO引脚输出该信号。此时必须配置PLL倍频才可以通过25MHz外部石英晶体在MCO引脚上获得所需频率。

2.2.3    精简介质独立接口(RMII)

RMII降低了以太网外设与外部PHY在10/100Mbit/s下微控制器的引脚数。根据IEEE 802.3u标准,MII有16个数据和控制信号的引脚。RMII将引脚数减少为7个。
RMII在MAC和PHY之间实例化。有助于将MAC的MII转换为RMII。RMII具有以下特性:
单独的2位宽的发送和接收数据路径
10-Mbit/s和100-Mbit/s的运行速率
参考时钟为50MHz
从外部提供相同的参考时钟给MAC和外部以太网PHY
RMII时钟源:使用外部50MHz时钟或嵌入式PLL生成50MHz频率信号驱动PHY。 

2.3    硬件设计

开发板使用APM32F407控制器通过RMII接口和SMI接口与LAN8720A以太网PHY进行连接。

 图 1 LAN8720A硬件电路

通过接下拉电阻把nINTSEL引脚设置为低电平,从而使能nINT/REFCLKO引脚的输出功能为RMII接口中REF_CLK信号线提供时钟信号,硬件上XTAL1 与XTAL2 之间接入提供25MHz时钟,经过LAN8720A内部PLL电路陪频后使得nINT/REFCLKO引脚的输出的时钟信号为50MHz时钟。

3    移植LwIP

本章主要介绍如何把LwIP移植到无操作系统的APM32F407裸机工程上并展示ping指令的实验演示。

3.1    PHY底层驱动

因为标准库中并没有ETH外设的相关文件,因此首先需要在裸机工程中添加ETH驱动库文件apm32f4xx_eth.c和apm32f4xx_eth.h用于实现ETH驱动。

 图 2 添加驱动库

新建底层驱动文件board_LAN8720A.c和board_LAN8720A.h实现对PHY相关驱动,初始化以太网所使用RMII接口的GPIO以及完成ETH的MAC和DMA的配置。最后通过在main函数中调用ConfigEthernet( )完成对网卡的驱动。

 图 3 新建底层驱动文件

3.2    添加LwIP源文件

在已写好以太网PHY驱动的工程中新建分组lwip添加以下文件进人工程,无需修改。

 图 4 LWIP源文件文件

3.3    移植头文件

移植完LWIP源文件后,我们的工程还需要一些相应的头文件支持把LWIP网站下载的contrib-1.4.1\ports\old\rtxc\include\arch中的整改arch文件夹复制到当前工程中并包含。

 图 5 LWIP头文件

因为我们使用Keil开发工具,需要对其中的cc.h文件进行简单修改,左边为修改后。

 图 6 cc.h文件

cc.h文件中包含处理器相关的变量类型、数据结构及字节对齐的相关宏。U16_F、S16_F、X16_F等等一系列名称用于LwIP的调试函数的调试信息输出格式。

 图 7添加 lwipopts.h文件

接着还需要对LwIP功能选项进行配置,把路径lwip-1.4.1\test\unit\下的文件lwipopts.h拷贝到工程,进行修改,lwipopts.h头文件可以对剪切LwIP功能进行裁剪,比如有无操作系统、内存空间分配、存储池分配、TCP功能、UDP功能选择,编程接口的使能等等。如果用户没有在lwipopts.h文件进行配置,那么LwIP就会使用opt.h默认的参数。

3.4    移植网卡驱动文件

 图 8移植网卡驱动文件

lwip-1.4.1中的ethernetif.c文件即为底层接口的驱动的模版,存放LwIP与ETH外设网络接口函数,在网卡接收或者发送数据的时候就会被调用,我们把此模块复制到工程中并根据使用到的网卡实现方式进行修改后LWIP的移植就基本完成了。
主要需要用户实现的函数有low_level_init、low_level_output和low_level_input分别用于初始化并使能MAC和DMA、物理层发送数据和物理层接收数据。

3.5    初始化协议栈

需要添加和修改的文件已经准备好了,在使用到LWIP协议栈之前,还需要先初始化LWIP。

void LwIP_Init(void)

{

struct ip_addr ipaddr;

struct ip_addr netmask;

    struct ip_addr gw;

    /** Initializes the dynamic memory heap */

    mem_init();

    /** Initializes the memory pools */

    memp_init();

    IP4_ADDR(&ipaddr, 192, 168, 73, 22);

    IP4_ADDR(&netmask, 255, 255 , 255, 0);

    IP4_ADDR(&gw, 192, 168, 73, 1);

    /** Config MAC Address */

    ETH_ConfigMACAddress(ETH_MAC_ADDRESS0, SetMACaddr);

    /** Add a network interface to the list of lwIP netifs */

    netif_add(&UserNetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);

    /** Registers the default network interface */

    netif_set_default(&UserNetif);

    /** When the netif is fully configured this function must be called */

    netif_set_up(&UserNetif);

}

首先完成内存管理的初始化,通过mem_init和memp_init完成对内存堆和内存池的初始化。接着通过IP4_ADDR对变量ipaddr、netmask和gw进行一个初始化,设置为本地IP地址、子网掩码和网关的地址,再使用netif_add添加以太网设备,把IP地址、子网掩码、网关、网卡设备初始化函数、太网帧接收函数的地址传入UserNetif变量,完成网卡的注册。并通过功能函数netif_set_default把网卡UserNetif设置为默认的网络通信设备。最后调用netif_set_up启动网卡就完成了LWIP的初始化了。需要注意的是IP地址的设置必须已路由器处于同一网关。比如我所使用的电脑IP为192.168.73.122。就需要把网关设置为192.168.73.1,掩码设置为255.255.255.0,IP地址为192.168.73.xx。

3.6    配置LwIP时基

在整个LWIP内核初始化后想要协议栈正常的运作起来,还需要给lwip配置一个时基,使内核可以处理各种定时事件如TCP定时、ARP定时任务,
采用SysTick作为LwIP的时基定时器,1ms触发一次中断,对全局变量变量ETHTimer进行加1,LwIP通过两次获取的时间就能判断是否有超时,从而处理对应的事件。
同时LwIP中也定义了一个功能函数用于实现定时事件sys_check_timeouts()。如果要使用到sys_check_timeouts()函数需要,在lwipopts.h头文件中设置NO_SYS_NO_TIMERS为0实现支持sys_timeout功能,并实现功能函数sys_now(),在函数中返回ETHTimer获取当前的tick值。

3.7    数据包的获取

至此,已经可以使用开发板获取网络的数据包了,一般使用轮询或者中断处理的方式,获取数据包。下面将举例在当前工程中通过轮询的方式进行数据包的获取,展示ping指令的实验现象,通过轮询的方式,只需要在mian函数中周期性使用ETH_ReadRxPacketSize判断是否有数据包到达,并在收到数据包时调用ethernetif_input接收函数即可。

3.8    实验现象

把工程编译并且将下载到开发板后,通过网线连接开发板和电脑并通过电脑的CMD控制台,在命令行中执行ipconfig,确定电脑的IP地址网关为192.168.73.1,并执行ping 192.168.73.22,看到如下图实验现象即可确定我们的移植工作结束了网卡驱动与协议栈可以正常工作。

 图 9 实验现象

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值