[MCAN] 硬件时间戳TSU使用PTPC注意事项

一、前言

在实际开发中,当使用 PLL 作为外设时钟源时,PTPC 硬件时间戳会出现 100 μs 以上的抖动,定时器定时精度也存在偏差;而切换至外部 24 MHz 晶振后,抖动可控制在 3 μs 以内,表现符合预期。针对这一现象,进行了相关验证实验。

本次实验使用的 MCU 型号为先楫 HPM5321ICF1(48 引脚封装)。

二、实验效果

环境搭建主要使用hpm sdk1.11.0的samples drivers的gptmr/timer_basic和mcan两个demo。

测试方法如下:

1、使用 GPTMR 定时器产生精确 1 秒 中断

2、断触发后通过 mcan_transmit_via_txfifo_nonblocking 发送固定 8 字节 CAN 帧(ID=0x123)

3、主循环中通过 mcan_read_tx_evt_fifo 读取 TX Event FIFO

4、调用 mcan_get_timestamp_from_tx_event 获取硬件时间戳

5、计算相邻帧的 delta_us(帧间隔),评估抖动

CAN波特率为1M/8M,定时器上定时1S,1S中断触发发送CAN帧(8字节),使用pcan接收CAN帧,然后while循环读取发送事件获取发送时间戳,然后将发送时间戳进行打印。

image.png

简易代码如下:

image.png

可以看到MCU端获取的发送时间戳两帧抖动均在1到2us之内。

image.png

PCAN接收端的两帧接收抖动也比较稳定,受限于显示位数。

image.png

三、配置注意点

(一)需配置外部晶振作为PLL参考时钟

在先楫某些MCU型号封装上,内部并不会启动外部24M晶振,而是直接使用内部RC24M作为PLL参考时钟。这部分在HPM5300用户参考手册中被提起。

image.png

比如在 HPM5300 中,对于 48 脚和 64 脚的封装,如果 ROM 代码没有启动外部晶振或者写入 PLL 参考时钟选择,在高精度时序分析场景下建议默认使用外部 24M 晶振。

在 HPM5301EVKLite 这块板子默认是使用 48 脚封装的 HPM5301,hpm_sdk 上就有做了外部晶振切换为 PLL 参考时钟配置

image.png

对于一些要求精度的场合建议使用外部晶振作为参考时钟。比如定时器定时,使用内部RC24M作为参考时钟可能存在抖动不稳定的情况,比如1S定时发送CAN帧,接收端接收到的定时抖动相对比较大。

image.png

(二)PTPC的时钟源配置

在HPM5300使用PTPC作为CAN的时间戳时,发现时间戳打印都是960ms左右,跟1s定时有所差距。

11597891cbc59f3c1c7ed156abc41efc.png

在打印PTPC的时钟源发现是160M频率,也就是1tick是6.25ns,而ptpc的纳秒递增只能是整数,6.25ns会截断为6ns,每个Tiick都会少了0.25ns,累计误差就会是0.25/6.25=4%,1000ms * (1 - 0.04) = 960ms。

因此需要把 PTPC 的时钟源配置改成可以整数配置的频率,比如进行降频或者升频到 100M、200M。或者微调 PTPC 的纳秒配置。

本文使用降频到 100MHz 的方案,比如取 pll0clk2 400M 为时钟源,AHB 四分频即可得到 100MHz:

image.png

image.png

100MHz 下每 tick = 10ns,整数无截断,PTPC 纳秒递增精确。

image.png

四、总结

先楫的MCAN的CANFD 时间戳是可以达到 ±1us 精度,但需要满足三个条件:

1、 PLL 参考时钟使用外部 XTAL24M;

2、时间戳模式使用外部TSU(PTPC),如果有这个PTPC外设

3、PTPC 时钟频率可被10的9次方整除(如100M/200M)

0
0

订阅

发表回复 0

Your email address will not be published. Required fields are marked *

captcha
Enter the characters shown in the image:
Reload

This CAPTCHA helps ensure that you are human. Please enter the requested characters.