mirror of
https://github.com/apache/nuttx.git
synced 2026-08-01 20:28:58 +00:00
arch/nrf{52|53|91}: fix timer for small intervals and correct CC overflow check
This commit is contained in:
parent
3ef23f594c
commit
6c070330b2
3 changed files with 24 additions and 12 deletions
|
|
@ -46,10 +46,14 @@
|
|||
#define NRF52_TIMER_CC (NRF52_TIM_CC0)
|
||||
#define NRF52_TIMER_INT (NRF52_TIM_INT_COMPARE0)
|
||||
#define NRF52_TIMER_RES (NRF52_TIM_WIDTH_32B)
|
||||
#define NRF52_TIMER_MAX (0xffffffff)
|
||||
#define NRF52_TIMER_MAX (4294967295ul)
|
||||
#define NRF52_TIMER_PRE (NRF52_TIM_PRE_1000000)
|
||||
#define NRF52_TIMER_PER (1000000)
|
||||
|
||||
/* Maximum supported timeout */
|
||||
|
||||
#define NRF52_TIMER_MAXTIMEOUT (NRF52_TIMER_MAX * 1000000 / NRF52_TIMER_PER)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
|
@ -350,7 +354,7 @@ static int nrf52_timer_settimeout(struct timer_lowerhalf_s *lower,
|
|||
{
|
||||
struct nrf52_timer_lowerhalf_s *priv =
|
||||
(struct nrf52_timer_lowerhalf_s *)lower;
|
||||
uint64_t cc = 0;
|
||||
uint32_t cc = 0;
|
||||
int ret = OK;
|
||||
|
||||
DEBUGASSERT(priv);
|
||||
|
|
@ -361,13 +365,13 @@ static int nrf52_timer_settimeout(struct timer_lowerhalf_s *lower,
|
|||
goto errout;
|
||||
}
|
||||
|
||||
if (timeout > NRF52_TIMER_MAX)
|
||||
if (timeout > NRF52_TIMER_MAXTIMEOUT)
|
||||
{
|
||||
ret = -EINVAL;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
cc = (timeout / 1000000) * NRF52_TIMER_PER;
|
||||
cc = (timeout * NRF52_TIMER_PER / 1000000);
|
||||
NRF52_TIM_SETCC(priv->tim, NRF52_TIMER_CC, cc);
|
||||
|
||||
errout:
|
||||
|
|
|
|||
|
|
@ -46,10 +46,14 @@
|
|||
#define NRF53_TIMER_CC (NRF53_TIM_CC0)
|
||||
#define NRF53_TIMER_INT (NRF53_TIM_INT_COMPARE0)
|
||||
#define NRF53_TIMER_RES (NRF53_TIM_WIDTH_32B)
|
||||
#define NRF53_TIMER_MAX (0xffffffff)
|
||||
#define NRF53_TIMER_MAX (4294967295ul)
|
||||
#define NRF53_TIMER_PRE (NRF53_TIM_PRE_1000000)
|
||||
#define NRF53_TIMER_PER (1000000)
|
||||
|
||||
/* Maximum supported timeout */
|
||||
|
||||
#define NRF53_TIMER_MAXTIMEOUT (NRF53_TIMER_MAX * 1000000 / NRF53_TIMER_PER)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
|
@ -350,7 +354,7 @@ static int nrf53_timer_settimeout(struct timer_lowerhalf_s *lower,
|
|||
{
|
||||
struct nrf53_timer_lowerhalf_s *priv =
|
||||
(struct nrf53_timer_lowerhalf_s *)lower;
|
||||
uint64_t cc = 0;
|
||||
uint32_t cc = 0;
|
||||
int ret = OK;
|
||||
|
||||
DEBUGASSERT(priv);
|
||||
|
|
@ -361,13 +365,13 @@ static int nrf53_timer_settimeout(struct timer_lowerhalf_s *lower,
|
|||
goto errout;
|
||||
}
|
||||
|
||||
if (timeout > NRF53_TIMER_MAX)
|
||||
if (timeout > NRF53_TIMER_MAXTIMEOUT)
|
||||
{
|
||||
ret = -EINVAL;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
cc = (timeout / 1000000) * NRF53_TIMER_PER;
|
||||
cc = (timeout * NRF53_TIMER_PER / 1000000);
|
||||
NRF53_TIM_SETCC(priv->tim, NRF53_TIMER_CC, cc);
|
||||
|
||||
errout:
|
||||
|
|
|
|||
|
|
@ -46,10 +46,14 @@
|
|||
#define NRF91_TIMER_CC (NRF91_TIM_CC0)
|
||||
#define NRF91_TIMER_INT (NRF91_TIM_INT_COMPARE0)
|
||||
#define NRF91_TIMER_RES (NRF91_TIM_WIDTH_32B)
|
||||
#define NRF91_TIMER_MAX (0xffffffff)
|
||||
#define NRF91_TIMER_MAX (4294967295ul)
|
||||
#define NRF91_TIMER_PRE (NRF91_TIM_PRE_1000000)
|
||||
#define NRF91_TIMER_PER (1000000)
|
||||
|
||||
/* Maximum supported timeout */
|
||||
|
||||
#define NRF91_TIMER_MAXTIMEOUT (NRF91_TIMER_MAX * 1000000 / NRF91_TIMER_PER)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
|
@ -350,7 +354,7 @@ static int nrf91_timer_settimeout(struct timer_lowerhalf_s *lower,
|
|||
{
|
||||
struct nrf91_timer_lowerhalf_s *priv =
|
||||
(struct nrf91_timer_lowerhalf_s *)lower;
|
||||
uint64_t cc = 0;
|
||||
uint32_t cc = 0;
|
||||
int ret = OK;
|
||||
|
||||
DEBUGASSERT(priv);
|
||||
|
|
@ -361,13 +365,13 @@ static int nrf91_timer_settimeout(struct timer_lowerhalf_s *lower,
|
|||
goto errout;
|
||||
}
|
||||
|
||||
if (timeout > NRF91_TIMER_MAX)
|
||||
if (timeout > NRF91_TIMER_MAXTIMEOUT)
|
||||
{
|
||||
ret = -EINVAL;
|
||||
goto errout;
|
||||
}
|
||||
|
||||
cc = (timeout / 1000000) * NRF91_TIMER_PER;
|
||||
cc = (timeout * NRF91_TIMER_PER / 1000000);
|
||||
NRF91_TIM_SETCC(priv->tim, NRF91_TIMER_CC, cc);
|
||||
|
||||
errout:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue