STM32F4+DP83848以太网通信指南系列(一):知识储备

丁丁的博客:https://www.hexcode.cn/article/show/stm32-ethernet1

2017-12-09 17:32:19

STM32F4+DP83848以太网通信指南系列(一):知识储备

前言:项目需求使用STM32F407进行以太网通信,并涉及到数据链路层的工业以太网通信,使用LWIP协议栈并不能满足需求,因此需要自己摸清STM32F407调用外部PHY进行网络收发包的过程,并在此基础上尝试自己构建适用于项目的网络协议栈。我基本上是从零开始着手这个项目的,之前只有一些STC51系列和STM32F1系列单片机开发的经验,项目开发过程中学习、参考、借鉴了很多网络上的教程和博客,在此尤其感谢正点原子团队发布的相关视频教程。公司买的开发板主芯片是一颗STM32F407,搭配了一颗DP83848的PHY,因此本系列教程将使用DP83848进行适配,同时原子哥的学习板和教程中是使用LAN8720这颗PHY进行适配的,本系列指南也会花一些篇幅介绍各种PHY与STM32芯片进行适配的方法。

为了您更好地阅读本系列,请点击原创连接进行浏览:

本章为系列指南第一章,主要是介绍一下项目思路,并且尽可能列出从零开始着手开发这个项目过程中,所需要理解的各类知识点,关于这些知识点,如果需要更详细的介绍,请列为看官自行百度谷歌。

STM32F407简介

  • STM32F407主频168MHz,主频这个数值的意义可以这么理解:每秒执行168,000,000步简单指令,也就是每毫秒168,000次,每微妙168次。我们工业以太网进入实时通信后的数据传输周期大概每2ms交互4次,每次60个Byte,最差的算法复杂度计算下来需要每毫秒4 / 2 * 60byte = 120步(事实上用不了这么多步),而这颗STM32F07的芯片提供每毫秒168,000次操作,相差3个数量级,因此大致上看来这颗芯片是完全可以胜任的。

  • STM32F407可以通过多个时钟配置方案达到最高168MHz,一般是使用外部8MHz晶振,通过锁相环倍频到168MHz,这个我们后面章节会讲。

  • 目前STM32芯片有三种代码编写的方案:第一是寄存器方案,通过内部各种地址定义的宏来操作,晦涩难懂,需要不停地查资料才能理解;第二种是标准库函数方案,沿用一份很久没有更新的标准库进行开发,标准库ST公司已经不打算维护升级了,但是网络上资料非常丰富;第三种是HAL库函数方案,继标准库推出多年之后,ST公司推出了HAL库函数版本的SDK,这份SDK保持维护和更新,并且ST公司在F7系列芯片上只允许这使用HAL库函数编程,目前为止该库函数版本的书籍资料并不是很丰富,值得庆幸的是正点原子团队也率先推出了STM32F1,F4,F7全系列的HAL库函数教程,参见:http://openedv.com/thread-13912-1-1.html 。但是针对本项目,我们依然使用标准库函数进行开发,理由是可以参考借鉴大量的以太网通信实验代码,以及ST官方的LWIP协议栈代码,毕竟这些现有成熟的代码还都是基于标准库函数进行编写的。

  • STM32文档资料方面,请自行下载以下文件:

  1. ST-RM0090 STM32F4参考手册中文版.pdf
  2. 正点原子-STM32F4开发指南-标准库函数中文版.pdf
  3. 正点原子-STM32F4标准库函数例程.rar

以太网层次的理解,白话版

以太网分为很多层(按照OSI模型有七层,按照TCP/IP协议有五层),我们只需要了解其中这么几个:

  1. 最底下的PHY物理层:发送和接受光、电、电磁波等各类模拟量的信号,使其在介质上传输,尽最大可能保证其完整和准确。
  2. PHY上方的MAC层:构建有意义的帧格式,提供一定能力的校验功能。
  3. 网络层:为整个网络拓扑服务,一般运行在后台,用户无感知,为网络结构提供路由(ARP)、通路测试(ICMP:Ping)等基础服务。
  4. 除了上述三个层,其余的层我们可以一并理解为应用层,因为其余各层都是由应用程序根据不同的协议自行构建报文的。应用层所有的报文可分为两个大类,TCP和UDP,TCP提供三次握手+四次挥手,因此网络资源消耗比较大,但是提供了确切的成功或者不成功的信息;UDP只需要发送方发送一次报文就可以,因此发送和接受成功与否并不可知。构建于TCP之上的协议有著名的HTTP、FTP、Telnet等;构建于UDP之上的协议相对来说不是很常见,像SNMP、TFTP这些简单协议基本上都用不到,原因很简单,UDP提供的是不确定的网络通信,一般网络交互都需要非常确切的成功失败的返回结果,记得曾几何时OICQ(暴露年龄)的聊天信息就是通过UDP协议传送的,现在估计早就换成TCP了。

STM32F407以太网架构

有了以上以太网层次的理解后,我们将STM32F407的网络架构与之对照理解。

  • STM32F407内置了MAC层的处理能力,并且使用DMA技术强化了MAC层能力。
  • DMA(Direct Memory Access,直接内存存取),是现代处理器一个很重要的技术,它允许不同速度的硬件装置来沟通,也不需要依赖于CPU的大量中断负载。如果没有DMA,CPU需要从来源把输入数据复制到暂存器,然后把它们再次写回到需要使用的地方。在这个时间中,CPU对于其他的工作来说完全无法使用。—以上节选自百度百科
  • 关于DMA的进一步理解:STM32F407的总线架构中,单独分配了一个MAC层的DMA数据总线,也就是无论你用不用,核心逻辑总会在固定的时间段释放对总线数据的访问,由一段MAC层控制器来对数据总线上的数据进行存取处理。这段处理,是独立于168MHz主频之外的。如图所示(图片来自RM0090ST官方STM32F4手册P50):
  • 拥有DMA能力的MAC层,可以在用户代码完全不干预的情况下,将DMA中的数据发送给PHY,同时在PHY接到数据后,将PHY的数据读取到DMA中,并通知中断。以上操作的前提是:用户提前配置好MAC,PHY,DMA,以及中断向量,这部分工作是这个系列的核心内容,涉及到的内容比较多,会在后续章节逐一介绍。

PHY模块

  • STM32F407内置的MAC层让使用者封装字节数据为网络帧结构,但STM32F407并没有能力将其发送到电缆上去,特别是涉及到光电电磁等模拟量的信号,没法处理,因此需要外部PHY模块进行辅助。我们知道STM32F407是一个纯数字电路芯片,而PHY需要处理的又是模拟信号,功耗比纯数字电路大很多(摸上去发烫)。因此从成本、体积、工艺等各方面考虑,ST公司并未在STM32系列芯片中增加PHY模块,而是建议用户在PCB板上自行增加PHY模块。目前已经有一些芯片公司推出了内置PHY的芯片,不过比较少,可自行百度谷歌或者,淘宝,对,你没听错,搜这方面资料时有时候淘宝比较厉害。
  • PHY芯片可选型号比较丰富,有纯粹的PHY芯片(DP83848,LAN8720),也有集成MAC层+PHY层的芯片(ENC28J60,DM9000),还有内置TCP/IP协议栈硬解码的MAC+PHY芯片(W5500)。这里要注意的是,我们这个项目涉及到工业以太网协议,IO数据通过OSI模型中的链路层收发,因此千万不能选择集成TCP/IP协议栈的PHY芯片,那种芯片通过I2C或者SPI将TCP/UDP报文抽象出来发送给上位机,已经将链路层不符合TCP/UPD规则的过滤掉了。
  • MAC跟PHY通信是使用RMII或者MII接口,前者引脚使用少,频率高;后者引脚使用多,频率低。一般使用前者。DP83848可以使用RMII或者MII,LAN8720只可以使用RMII。无论RMII还是MII,你都只需要做个了解,在配置时根据电路引脚的接法,配置好。具体的时序图不需要看,不需要你直接控制,有现成的函数帮忙。
  • PHY有地址的概念,MAC理论上最多能控制32个PHY(可以自己做一个32端口的交换机了)。DP83848的42-46引脚读入自己的ADDR,MAC在通信时可以指定其中某一ADDR进行通信,ADDR不匹配的PHY自动忽略信号。
  • DP83848的datesheet下载:DP83848C.pdf

Ethernet库函数

  • STM32的开发环境是Keil5,通过配置Keil5,可以下载获得STM32F4系列的SDK,也就是标准库函数的SDK,但是这份标准库函数里面是没有有关Ethernet方面的函数的,为什么?因为ST公司认为PHY都没集成到CPU里面,库函数就更没办法集成进去了,包括PHYADDR,MII,RMII的选择,有的PHY甚至不使用MII或者RMII接口,而是高度封装后使用SPI进行通信。因此ST没法为所有用户提供一个通用的函数库,但是官方提供了一个DEMO程序,该程序作用非常大,到ST官网,搜索框输入LWIP就能搜到这个DEMO,官方文档编号是STSW-STM32070,适用于STM32F4系列的以太网通信DEMO,使用LWIP协议栈,适配PHY为DP83848,正好是我们使用的这一款。
  • 上述页面下载时需要注册ST,用户名密码登录,而ST的响应速度超慢,可能还需要科学上网,列位可以到我上传的地址下载:en.stsw-stm32070.zip
  • 这份文档里/STM32F4x7_ETH_LwIP_V1.1.1/Libraries/STM32F4x7_ETH_Driver下面的stm32f4x7_eth.c以及配套的.h文件是比较关键的,类似于标准库提供的那些I2C,UART,SPI等库函数文件。该文件的使用方法和理解,后续章节会详细介绍。

LWIP协议栈

  • LWIP是一个精简版的TCP/IP协议栈,广泛用于嵌入式设备中,占用内存少。
  • LWIP通过调用MAC层来实现网络通信,调用的库函数就定义在上述的STM32F4x7_ETH_Driver文件中。
  • LWIP可以解决大多数应用层场景的通信需求,比如TCP和UDP。
  • LWIP无法解决链路层的通信问题,因此我们本项目并没有移植LWIP,而是参考借鉴LWIP调用MAC层部分的代码,从而自己构建协议栈,完成收发包任务。

总结

以上就是整个STM32以太网通信的基础知识,知识点比较零碎,我尽量用白话文把他们罗列出来,因为我也是从零开始学着做的,期间看过不少晦涩难懂的文档。在着手写这个系列的时候,我们公司的这个项目已经被我搞定了,虽然具体实现的协议,应用的场景需要保密无法透露,但我仍然希望就STM32嵌入式以太网通信这个通用的问题,就我的能力讲解出来,帮助有需要的朋友。

猜你喜欢

转载自blog.csdn.net/m0_37777700/article/details/83620671