请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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