cubemx版本:6.1.2
stm32型号:stm32f429zit6
phy芯片:lan8720a
LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。
lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。
lwip项目地址:http://git.savannah.nongnu.org/cgit/lwip.git
以太网外设使 STM32F4xx 能够通过以太网发送和接收符合 IEEE 802.3-2002 标准的数据。
以太网提供了一个可配置的、灵活的外设来满足各种应用和客户的需求。 它支持到外部物理层 (PHY) 的两个行业标准接口:IEEE 802.3 规范中定义的默认媒体独立接口 (MII) 和简化的媒体独立接口 (RMII)。 它可用于多种应用,例如交换机、网络接口卡等。
以太网符合以下标准:
• 用于以太网 MAC 的 IEEE 802.3-2002
• 用于精确网络时钟同步的 IEEE 1588-2008 标准
• 用于 AHB 主/从端口的 AMBA 2.0
• RMII 联盟的 RMII 规范
• 使用外部 PHY 接口支持 10/100 Mbit/s 数据传输速率
• 符合 IEEE 802.3 的 MII 接口与外部快速以太网 PHY 通信
• 支持全双工和半双工操作
– 支持 CSMA/CD 协议 双工操作
– 支持用于全双工操作的 IEEE 802.3x 流控制
– 在全双工操作中可选地将接收到的暂停控制帧转发到用户应用程序
– 对半双工操作的背压支持
– 在取消断言时自动传输零量子暂停帧 全双工操作中的流量控制输入
• 发送中的前导码和帧起始数据 (SFD) 插入,以及接收路径中的删除
• 自动 CRC 和填充生成可在每帧基础上进行控制
• 自动填充/CRC 选项 接收帧上的剥离
• 可编程帧长度以支持大小高达 16 KB 的标准帧
• 可编程帧间间隙(40-96 位时间,以 8 为步长)
• 支持各种灵活的地址 ss 过滤模式:
– 最多四个 48 位完美 (DA) 地址过滤器,每个字节带有掩码
– 最多三个 48 位 SA 地址比较检查,每个字节带有掩码
– 64 位哈希过滤器(可选)用于多播和 单播 (DA) 地址
– 传递所有多播寻址帧的选项
– 混杂模式支持传递所有帧而不进行任何网络监控过滤
– 传递所有传入数据包(根据过滤器)并带有状态报告
• 返回用于传输的单独 32 位状态 和接收数据包
• 支持接收帧的 IEEE 802.1Q VLAN 标记检测
• 应用程序的单独传输、接收和控制接口
• 支持使用 RMON/MIB 计数器 (RFC2819/RFC2665) 的强制性网络统计
• 用于 PHY 设备配置和管理的 MDIO 接口
• 检测 LAN 唤醒帧和 AMD Magic Packet™ 帧
• 接收功能,用于对接收的 IPv4 和以太网帧封装的 TCP 数据包进行校验和卸载
• 增强的接收功能 用于检查 IPv4 报头校验和封装在 IPv4 或 IPv6 数据报中的 TCP、UDP 或 ICMP 校验和
• 支持 IEEE 1588-2008 中所述的以太网帧时间戳。 在每个帧的发送或接收状态中给出了 64 位时间戳
• 两组 FIFO:具有可编程阈值功能的 2 KB 发送 FIFO 和具有可配置阈值的 2 KB 接收 FIFO(默认为 64 字节)
• 在 EOF 传输后插入接收 FIFO 的接收状态向量可在接收 FIFO 中启用多帧存储,而无需另一个 FIFO 来存储这些帧的接收状态
• 在接收时过滤所有错误帧的选项,而不是将它们转发到应用程序
• 可选择转发尺寸不足的良好帧
• 通过为接收 FIFO 中丢失或损坏(由于溢出)的帧生成脉冲来支持统计
• 支持存储和转发机制以传输到 MAC 内核
• 自动生成暂停帧控制或返回 基于接收 FIFO 填充(阈值可配置)级别向 MAC 内核发送压力信号
• 处理冲突帧的自动重传以进行传输
• 在后期冲突、过度冲突、过度延迟和欠载情况下丢弃帧
• 用于刷新 Tx FIFO 的软件控制
• 计算 并在存储转发模式传输的帧中插入 IPv4 报头校验和 TCP、UDP 或 ICMP 校验和
• 支持 MII 内部环回以进行调试
• 支持AHB Slave 接口中的所有AHB 突发类型。
• 软件可以在AHB Master 接口中选择AHB 突发类型(固定或无限突发)。
• 从 AHB 主端口选择地址对齐突发的选项
• 使用帧分隔符优化面向数据包的 DMA 传输
• 字节对齐寻址以支持数据缓冲区
• 双缓冲区(环)或链表(链式)描述符链接
• 描述符 架构,允许以最少的 CPU 干预进行大数据块传输;
• 每个描述符最多可传输 8 KB 的数据
• 针对正常操作和错误传输的综合状态报告
• 发送和接收 DMA 引擎的单独可编程突发大小,以实现最佳主机总线利用率
• 针对不同操作条件的可编程中断选项
• 每帧 发送/接收完成中断控制
• 接收和发送引擎之间的循环或固定优先级仲裁
• 启动/停止模式
• 当前 Tx/Rx 缓冲区指针作为状态寄存器
• 当前 Tx/Rx 描述符指针作为状态寄存器
• 接收和发送帧的时间戳
• 粗细修正方法
• 当系统时间大于目标时间时触发中断
• 每秒脉冲输出(产品交替功能输出)
排针没有引出复位引脚,外部有一个50MHz的有源晶振给lan8720提供时钟,PHYAD0接上拉电阻,地址为1。
PHY是IEEE802.3中定义的一个标准模块,STA(station management entity,管理实体,一般为MAC或CPU)通过SMI(Serial Manage Interface)对PHY的行为、状态进行管理和控制,而具体管理和控制动作是通过读写PHY内部的寄存器实现的。PHY寄存器的地址空间为5位,从0到31最多可以定义32个寄存器(随着芯片功能不断增加,很多PHY芯片采用分页技术来扩展地址空间以定义更多的寄存器,在此不作讨论),IEEE802.3定义了地址为0-15这16个寄存器的功能,地址16-31的寄存器留给芯片制造商自由定义。
配置PHY时,PHY Address Value为phy的地址,lan8720通过PHYAD[0],即PHYAD0引脚的电平决定地址是1还是0。PHYAD0引脚的配置用于设置收发器的SMI地址,我的这个引脚接的高电平,所以地址为1。
通用的寄存器不需要修改,需要检查厂商扩展的寄存器是否与cubemx的默认配置一致。
CMSIS-RTOS是ARM公司为统一操作系统、降低嵌入式门槛而发布的操作系统标准软件接口。通俗讲,CMSIS-RTOS将操作系统(不管是FREE-RTOS还是RTX等)屏蔽起来,然后提供CMSIS-RTOS API给最终使用者调用。如此以来,最终使用者只需要学习CMSIS-ROTS即可,从而降低学习门槛。(不过,目前只有FREE-RTOS和RTX能够支持CMSIS-RTOS)。
ST将FreeRTOS封装到CMSIS-RTOS(操作系统标准软件接口),选择v1版本。
hal的时基选择TIM1,操作系统和hal硬件层使用两套时基,可以参考https://blog.csdn.net/u010020404/article/details/106375690
添加串口重定向的代码,并在keil中使能microlib。
int fputc(int ch, FILE* stream)
{
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,100);
return ch;
}
在cubemx下载好的hal库中找到tcp回显的demo,添加到keil工程中,并且添加好头文件,编译和下载。
需要注意的是,默认没有开启LWIP_DEBUG,lwip各个模块的调试也没有使能。
在debug.h的开头定义LWIP_DEBUG,并在opt.h中添加如下的代码,需要打印什么模块的调试信息就去掉相应的注释。
//#define ETHARP_DEBUG LWIP_DBG_ON
//#define NETIF_DEBUG LWIP_DBG_ON
//#define PBUF_DEBUG LWIP_DBG_ON
//#define API_LIB_DEBUG LWIP_DBG_ON
//#define API_MSG_DEBUG LWIP_DBG_ON
//#define SOCKETS_DEBUG LWIP_DBG_ON
//#define ICMP_DEBUG LWIP_DBG_ON
//#define IGMP_DEBUG LWIP_DBG_ON
//#define INET_DEBUG LWIP_DBG_ON
//#define IP_DEBUG LWIP_DBG_ON
//#define IP_REASS_DEBUG LWIP_DBG_ON
//#define RAW_DEBUG LWIP_DBG_ON
//#define MEM_DEBUG LWIP_DBG_ON
//#define MEMP_DEBUG LWIP_DBG_ON
//#define SYS_DEBUG LWIP_DBG_ON
#define TCP_DEBUG LWIP_DBG_ON
//#define TCP_INPUT_DEBUG LWIP_DBG_ON
//#define TCP_FR_DEBUG LWIP_DBG_ON
//#define TCP_RTO_DEBUG LWIP_DBG_ON
//#define TCP_CWND_DEBUG LWIP_DBG_ON
//#define TCP_WND_DEBUG LWIP_DBG_ON
//#define TCP_OUTPUT_DEBUG LWIP_DBG_ON
//#define TCP_RST_DEBUG LWIP_DBG_ON
//#define TCP_QLEN_DEBUG LWIP_DBG_ON
//#define UDP_DEBUG LWIP_DBG_ON
//#define TCPIP_DEBUG LWIP_DBG_ON
//#define PPP_DEBUG LWIP_DBG_ON
//#define SLIP_DEBUG LWIP_DBG_ON
//#define DHCP_DEBUG LWIP_DBG_ON
//#define AUTOIP_DEBUG LWIP_DBG_ON
//#define SNMP_MSG_DEBUG LWIP_DBG_ON
//#define SNMP_MIB_DEBUG LWIP_DBG_ON
//#define DNS_DEBUG LWIP_DBG_ON