From 5b9495137c9d81d16c96e8ad815953585f50f693 Mon Sep 17 00:00:00 2001 From: jzlv Date: Fri, 16 Jul 2021 16:19:35 +0800 Subject: [PATCH] [fix][timer] fix timing that cause inaccurate --- .../bl702_driver/std_drv/src/bl702_timer.c | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/drivers/bl702_driver/std_drv/src/bl702_timer.c b/drivers/bl702_driver/std_drv/src/bl702_timer.c index f12d7d99..0dec73f1 100644 --- a/drivers/bl702_driver/std_drv/src/bl702_timer.c +++ b/drivers/bl702_driver/std_drv/src/bl702_timer.c @@ -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);