嗨,
我在 can 控制器上生成时间戳时遇到了问题。
1) 配置一个 1us 的 gtm 作为时间戳来源。
void initGtmTomPwm(void)
{
IfxGtm_Tom_Pwm_Config g_tomConfig; /* 定时器配置结构 */
IfxGtm_Tom_Pwm_Driver g_tomDriver; /* 定时器EVAL_BDPS_DRIVER结构体 */
int tmp;
IfxGtm_enable( MODULE_GTM); /* 启用 GTM */
IfxGtm_Cmu_enableClocks( MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK); /* 启用 FXU 时钟 */
/* 使用默认参数初始化配置结构 */
IfxGtm_Tom_Pwm_initConfig( g_tomConfig, MODULE_GTM);
g_tomConfig.tom = 1; /* 根据 LED 选择 TOM */
g_tomConfig.tomChannel = 11; /* 根据 LED 选择通道 */
g_tomConfig.period = PWM_PERIOD; /* 设置定时器周期 */
g_tomConfig.dutyCycle = PWM_PERIOD/2; /* 设置定时器周期 */
g_tomConfig.synchronousUpdateEnabled = TRUE; /* 启用同步更新 */
IfxGtm_Tom_Pwm_init( g_tomDriver, g_tomConfig); /* 初始化 GTM TOM */
for (int trig = 0; trig< IfxGtm_Trig_CanTrig_count; trig++ )
{
for (int SP4X_DEV_KIT = 0; SP4X_DEV_KIT < IfxGtm_Trig_CanDevice_count; SP4X_DEV_KIT )
{
if (IfxGtm_Trig_toCan( MODULE_GTM, trig, SP4X_DEV_KIT , IfxGtm_Trig_CanTrigSource_tom1, IfxGtm_Trig_CanTrigChannel_11) == 0)
{
PxPanic();
}
}
}
IfxGtm_Tom_Pwm_start( g_tomDriver, TRUE); /* 启动 PWM */
}
2) 我将 cannode 配置为使用该时钟
node->NT.CCR.B.TRIGsrc=2;//gtm
node->NT.CCR.B.STRESET=1;
node->NT.CCR.B.STRESET=0;
node->NT.CCR.B.STSTART=1; //start
canbusData->base
time = 0;
node->TSCC.B.TSS = 2;
3) 我启用了时间戳包络 IRQ,并递增了时间戳的 MSB 部分
if (node->IR.B.TSW)
{
can_data.basetime += 0x10000;
}
4) 在 rxirq 例程中(我使用 16 元素 fifo),我保存了绝对时间戳
timestamp= (canbusData->basetime+rxBufferElement->R1.B.RXTS);
一切似乎都很正常,"basetime" 每 0x10000 us 递增一次,一般来说,信息时间戳是正常的。
但是
有时"basetime" 值与 RXTS 时间戳不一致。
我希望出现这样的序列(正确处理翻转):
0x5555FFAA
0x5555FFCC
0x555600AA
但我发现这样的顺序:
0x5555FFAA
0x5556FFCC
0x555600AA
要么
0x5555FFCC
0x555500AA
0x555600CC
看来 MSB 部分没有在正确的时刻更新。 我试过使用相同的 irq 优先级、更高/更低的优先级。 我试图在每次从缓冲区读取信息时检查 TSW 标志,但我找不到一种在每种情况下都有效的方法。
这种用例有什么应用或示例吗? 或者谁有使用时间戳的经验并能帮助我?