[fix][timer] fix timing that cause inaccurate

This commit is contained in:
jzlv 2021-07-16 16:19:35 +08:00
parent 673ba04e8e
commit 5b9495137c

View file

@ -368,10 +368,6 @@ BL_Err_Type TIMER_Init(TIMER_CFG_Type *timerCfg)
CHECK_PARAM(IS_TIMER_PRELOAD_TRIG_TYPE(timerCfg->plTrigSrc));
CHECK_PARAM(IS_TIMER_COUNTMODE_TYPE(timerCfg->countMode));
if (timerCfg->matchVal0 < 2 || timerCfg->matchVal1 < 2 || timerCfg->matchVal2 < 2) {
return ERROR;
}
/* Configure timer clock source */
tmpVal = BL_RD_REG(TIMER_BASE, TIMER_TCCR);
@ -403,12 +399,45 @@ BL_Err_Type TIMER_Init(TIMER_CFG_Type *timerCfg)
if (timerCfg->countMode == TIMER_COUNT_PRELOAD) {
/* Configure timer preload value */
TIMER_SetPreloadValue(timerCh, timerCfg->preLoadVal);
}
/* Configure match compare values */
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_0, timerCfg->matchVal0 - 2);
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_1, timerCfg->matchVal1 - 2);
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_2, timerCfg->matchVal2 - 2);
/* Configure match compare values */
if (timerCfg->matchVal0 > 1 + timerCfg->preLoadVal) {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_0, timerCfg->matchVal0 - 2);
} else {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_0, timerCfg->matchVal0);
}
if (timerCfg->matchVal1 > 1 + timerCfg->preLoadVal) {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_1, timerCfg->matchVal1 - 2);
} else {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_1, timerCfg->matchVal1);
}
if (timerCfg->matchVal2 > 1 + timerCfg->preLoadVal) {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_2, timerCfg->matchVal2 - 2);
} else {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_2, timerCfg->matchVal2);
}
} else {
/* Configure match compare values */
if (timerCfg->matchVal0 > 1) {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_0, timerCfg->matchVal0 - 2);
} else {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_0, timerCfg->matchVal0);
}
if (timerCfg->matchVal1 > 1) {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_1, timerCfg->matchVal1 - 2);
} else {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_1, timerCfg->matchVal1);
}
if (timerCfg->matchVal2 > 1) {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_2, timerCfg->matchVal2 - 2);
} else {
TIMER_SetCompValue(timerCh, TIMER_COMP_ID_2, timerCfg->matchVal2);
}
}
#ifndef BFLB_USE_HAL_DRIVER
Interrupt_Handler_Register(TIMER_CH0_IRQn, TIMER_CH0_IRQHandler);