问题:
* 在边沿计数模式(向上)并 启用计数器的情况下、设置 TAPMR/TAMATCHR/TAPR/TAILR 时、我们将获得额外的计数。 意外计数的数量取决于所写入的寄存器。
预期行为:
*在更新匹配/最大值寄存器时、TAV/TAR 值应保持稳定-无论计数器是否被启用。
以下代码片段展示了我们正在执行的操作:
1. 配置
PRCMPowerDomainOn(PRCM_PERIPH_TIMER0);
PRCMPeripheralRunEnable(PRCM_PERIPH_TIMER0);
PRCMLoadSet();
while (!PRCMLoadGet()) {
continue;
}
IOCPortConfigureSet(15, IOC_PORT_MCU_PORT_EVENT0, IOC_IOPULL_UP | IOC_INPUT_ENABLE | IOC_IOCFG0_EDGE_DET_NEG);
/* next we enable IRQ15 / GPT0 in a platform specific way */
TimerDisable(GPT0_BASE_ADDR, TIMER_A);
HWREG(GPT0_BASE_ADDR + GPT_O_CFG) = GPT_CFG_CFG_16BIT_TIMER;
HWREG(GPT0_BASE_ADDR + GPT_O_CTL) |= GPT_CTL_TASTALL;
HWREG(GPT0_BASE_ADDR + GPT_O_TAMR) =
GPT_TAMR_TAMR_CAPTURE | GPT_TAMR_TACM_EDGCNT | GPT_TAMR_TAMIE | GPT_TAMR_TAMRSU_CYCLEUPDATE | GPT_TAMR_TACDIR_UP;
/* next we set initial top/match values see code snippet below */
TimerIntEnable(DT_TIMER_BASE_ADDR(0), TIMER_CAPA_MATCH);
2. 我们的代码更新最高/匹配值
uint32_t value = 14; uint8_t prescaleValue = 0xff & (value >> 16); HWREG(GPT0_BASE_ADDR + GPT_O_TAPR) = prescaleValue; // or GPT_O_TAPMR when updating the match value HWREG(GPT0_BASE_ADDR + GPT_O_TAILR) = value & 0xffff; // or GPT_O_TAMATCHR
3.重现问题的步骤
-如1所示设置定时器。
-当我们更新顶部/匹配值时启用定时器(请参阅2。) 然后、TAP/TAV 值立即计数1个或者更多额外计数、这取决于被写入的寄存器。
-当我们 在更新顶部/匹配值时禁用定时器时,没有记录对 TAP/TAV 值的变化。
临时禁用计时器以更新匹配值的变通办法不能令人满意。 我们更希望在计时器保持运行时更新匹配值、以确保在计时器禁用时不会出现边沿松动。
除此之外、边沿计数器运行良好、因此基本设置似乎没有问题。