STM32开发笔记47:STM32F4+DP83848以太网通信指南系列(一):知识储备

单片机型号:STM32F407VGT


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

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协议栈代码,毕竟这些现有成熟的代码还都是基于标准库函数进行编写的。

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

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

STM32F407内置了MAC层的处理能力,并且使用DMA技术强化了MAC层能力。

DMA(Direct Memory Access,直接内存存取),是现代处理器一个很重要的技术,它允许不同速度的硬件装置来沟通,也不需要依赖于CPU的大量中断负载。如果没有DMA,CPU需要从来源把输入数据复制到暂存器,然后把它们再次写回到需要使用的地方。在这个时间中,CPU对于其他的工作来说完全无法使用。

关于DMA的进一步理解:STM32F407的总线架构中,单独分配了一个MAC层的DMA数据总线,也就是无论你用不用,核心逻辑总会在固定的时间段释放对总线数据的访问,由一段MAC层控制器来对数据总线上的数据进行存取处理。这段处理,是独立于168MHz主频之外的。如图所示(图片来自RM0090ST官方STM32F4手册P50):

STM32开发笔记47:STM32F4+DP83848以太网通信指南系列(一):知识储备_第1张图片

拥有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自动忽略信号。

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,正好是我们使用的这一款。

这份文档里/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嵌入式以太网通信这个通用的问题,就我的能力讲解出来,帮助有需要的朋友。

 

 

 

你可能感兴趣的:(#,STM32快速开发,STM32快速开发)