貌似简单的协议,实现却不易
IEEE1588/PTP协议对于实时通信非常重要。打算在STM32H750 art PI 上测试一下,可惜RT-Thread OS 没有支持IEEE1588/PTP 协议,网络上介绍IEEE1588 PTP 协议的很多,但是真正在一个MCU 上实现的资料却很少。 于是自己动手移植一个,结果发现并不简单。
记得几年前曾经在STM32F207 上使用以太网MAC 支持IEEE588 功能做过以太网层的时间同步测试。以为既然后续的STM32F4,H7 都支持MAC IEEEE1588 .大概会比较方便了。结果发现,不仅RT-Thread OS 没有支持IEEE1588/PTP 协议,就连STM32F4_HAL 库以及STM32H7XX_HAL库中的eth.c 都明确指出目前不支持IEEE1588/PTP.网络上的资料依然停留在STM32F107 没有新的内容。
Github 上有一个STM32F4 的项目(https://github.com/mpthompson/stm32_ptpd)。不过它是在nucleo stm32F429 上实现的。使用的是CMSIS-RTOS,将其修改到RT-Thread H7 ,改动非常大,尝试了几天几乎要放弃了。
在万般无奈之际,发现了这个项目
https://github.com/hasseb/stm32h7_atsame70_ptpd
它是基于mpthompson 的项目基础上做的项目,这个项目的优点是
1 将STM32H7 的PTP 底层驱动直接地通过访问底层硬件寄存器完成,没有使用STM32H7xxx_HAL 库。避免了HAL 兼容性的问题。
2 软件以函数库的形式实现,避免了与OS 线程之间的不兼容性。
3 支持lwIP 2.0 ,使用UDP 组播方式(IGMP 协议) 实现PTPD 协议。
4 好像没有实现tick 定时器和TIM2 定时器调整。但是也有好处,避免了与RT-Thread OS 的兼容性问题。
PTP 协议
移植PTP 协议还是需要了解PTP 协议和PTPD 的程序结构。
PTP 报文
PTP协议定义了4种多点传送的报文类型和管理报文
-同步报文(Sync)
由主设备发送给从设备(一到两秒发一次) , 消息中可以包含 Sync 发送时间标签 , 也可以在后续的Follow UP 消息中包含
-跟随报文(Follow_up)
用于传送Sync 消息的发送时间
-延迟请求报文(Delay_Req)
-延迟应答报文(Delay_Resp)
一般报文和事件报文
报文有一般报文和事件报文两种类型。跟随报文和延迟应答报文属于一般报文,一般报文本身不进行时戳处理,它可以携带事件报文的准确发送或接收时刻值信息。同步报文和延迟请求报文属于事件报文,事件报文是时间敏感消息,需要加盖精确的时间戳。
报文收发流程

1. 主时钟周期性的发出 sync 报文,并记录下 sync 报文离开主时钟的精确发送时间 t1;
(此处 sync 报文是周期性发出,可以携带或者不携带发送时间信息,因为就算携带也只能是预估发送时间戳 originTimeStamp)
2. 主时钟将精确发送时间 t1 封装到 Follow_up 报文中,发送给从时钟;
(由于 sync 报文不可能携带精确的报文离开时间,所以我们在之后的 Follow_up 报文中,将 sync 报文精确的发送时间戳 t1 封装起来,发给从时钟)
3. 从时钟记录 sync 报文到达从时钟的精确时到达时间 t2;
4. 从时钟发出 delay_req 报文并且记录下精确发送时间 t3;
5. 主时钟记录下 delay_req 报文到达主时钟的精确到达时间 t4;
6. 主时钟发出携带精确时间戳信息 t4 的 delay_resp 报文给从时钟;
实现IEEE1588 的几种方法
IEEE1588 的基本思想是由一个主时钟设备周期性地发送时间标签,从时钟设备根据主时钟发来的时间标签来调整本地时钟,达到时间同步的目的。
具体实现时,可以使用下面三种方式
1 软件方式
在以太网的帧队列中插入时间标签.显然,由于软件执行的不确定性和队列中帧数量,网络负载等因素,会造成时间标签的不精准。

2 在MAC 控制器内实现
当PTP 帧到达MAC 控制器时,由硬件插入一个时间标签。显然在MAC 控制器内部,有一个时间计数器。并且能够过滤PTP 帧。在STM32 等MCU 中表明支持IEEE1588 就是指MAC 控制器中具备这种功能。

3 在以太网物理层实现
例如TI 公司的DP83640 芯片,据说这是精度最高的方式。但是需要软件访问Phy 器件的串行管理接口。DP83640 的另一个优点是它能够产生硬件时钟信号。可以直接产生硬件同步信号。

本文详细介绍了在STM32H750artPI和STM32F429上移植IEEE1588/PTP协议的过程及遇到的问题。包括对PTP协议的理解、不同实现方式的探讨、实际编程中遇到的具体挑战及其解决方案。
206

被折叠的 条评论
为什么被折叠?



