本帖最后由 Sam131208 于 2024-12-30 11:14 编辑
lptimer用作时间同步,比较寄存器(LPTIMER_CMPV)用来定时触发,自动重载寄存器(LPTIMER_CAR)固定为0xFFFFFFFF,LPTIMER_CAR 和LPTIMER_CMPV 影子寄存器禁止使能。
当lptimer在计时中,插入一个新的定时器,更新LPTIMER_CMPV 失败,中断丢失:
1). 定时器已经设定在0x78000触发比较中断。
2). (假设)定时器在计时到0x76000时, 更新比较定时器到0x76020.
3). 定时器中断丢失,停止debug, 查看比较定时器设定为0x78000,没有被更新为0x76020,而且也没有在0x78000处触发中断(定时器计数器已经远远大于它)。
比较寄存器更新操作指令:
static void timer_clock_set_timeout(int32_t ticks, bool idle){
do{
last_count_read = LPTIMER_CNT(LPTIMERN);
}while(last_count_read != LPTIMER_CNT(LPTIMERN));
LPTIMER_CMPV(LPTIMERN) = (uint32_t)(last_count_read + CLAMP(ticks, LPTIM_GUARD_VALUE, 0x7FFFFFFF));
}
|