This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G1519:DL_Timer_initTimerMode 阻塞 CVAE 字段

Guru**** 2422790 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1505249/mspm0g1519-dl_timer_inittimermode-clobbers-cvae-field

器件型号:MSPM0G1519

工具/软件:

您好:

我有一个客户注意到将计时器设置为使用 DL_TIMER_TIMER_MODE_PERIOCY_UP 模式时无法正常工作、我们认为这是因为 CVAE 字段在 DL_Timer_initTimerMode ()函数中被复位。

void DL_Timer_initTimerMode(
    GPTIMER_Regs *gptimer, const DL_Timer_TimerConfig *config)
{
    DL_Timer_setLoadValue(gptimer, config->period);

    switch (config->timerMode) {
        /* All four cases below should set counter value to ZERO when enabled */
        case DL_TIMER_TIMER_MODE_ONE_SHOT_UP:
        case DL_TIMER_TIMER_MODE_PERIODIC_UP:
        case DL_TIMER_TIMER_MODE_ONE_SHOT_UP_DOWN:
        case DL_TIMER_TIMER_MODE_PERIODIC_UP_DOWN:
            DL_Timer_setCounterValueAfterEnable(
                gptimer, DL_TIMER_COUNT_AFTER_EN_ZERO);
            break;
        /* The two cases below should set counter value to LOAD when enabled */
        case DL_TIMER_TIMER_MODE_ONE_SHOT:
        case DL_TIMER_TIMER_MODE_PERIODIC:
            DL_Timer_setCounterValueAfterEnable(
                gptimer, DL_TIMER_COUNT_AFTER_EN_LOAD_VAL);
            break;
        default:
            /* Code should not reach this case */
            break;
    }

    DL_Timer_setCaptureCompareValue(
        gptimer, config->counterVal, DL_TIMER_CC_0_INDEX);

    DL_Timer_setCaptureCompareCtl(gptimer, (uint32_t) config->genIntermInt,
        DL_TIMER_CC_ACOND_TIMCLK, DL_TIMER_CC_0_INDEX);

    gptimer->COUNTERREGS.CTRCTL =
        ((uint32_t) config->timerMode | (uint32_t) config->startTimer);
}

如果您看一下、switch 语句将调用 DL_Timer_setCounterValueAfterEnable()、它将修改 gptimer->COUNTERREGS.CTRCTL:

__STATIC_INLINE void DL_Timer_setCounterValueAfterEnable(
    GPTIMER_Regs *gptimer, DL_TIMER_COUNT_AFTER_EN cvae)
{
    DL_Common_updateReg(&gptimer->COUNTERREGS.CTRCTL, (uint32_t) cvae,
        GPTIMER_CTRCTL_CVAE_MASK);
}

但随后、 DL_Timer_initTimerMode 的最后一行使用=分配来更新 CTRCTL 值。 这会导致 CVAE 值被覆盖。 此分配应作为|=或对寄存器的真正屏蔽写入来完成、以避免堵塞现有寄存器值。

Munan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这将影响计时器的第一个周期。

    客户可在 syscfg INIT 之后添加计时器 CTRCTL 寄存器写入操作。

    解决此问题。

    另外、感谢提供反馈、我将此问题更新为 MSPM0 SDK 错误报告。