单片机/MCU论坛
直播中

李建设

7年用户 1379经验值
私信 关注
[问答]

关于在can控制器上生成时间戳时遇到的疑问求解

嗨,
我在 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->basetime = 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 标志,但我找不到一种在每种情况下都有效的方法。

这种用例有什么应用或示例吗? 或者谁有使用时间戳的经验并能帮助我?


回帖(1)

郑成枝

2024-3-4 16:06:33
IfxGtm_Tom_Pwm_Config g_tomConfig;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分