From 90800edb90ad0fcf8e7f53e5d32a4df9a0c62c6c Mon Sep 17 00:00:00 2001 From: Stephane D'Alu Date: Sat, 6 Feb 2016 02:15:26 +0100 Subject: [PATCH] fixed tickless for RTC, removed it for TIMER --- os/hal/ports/NRF51/NRF51822/st_lld.c | 48 +--------------------------- os/hal/ports/NRF51/NRF51822/st_lld.h | 45 ++++---------------------- 2 files changed, 7 insertions(+), 86 deletions(-) diff --git a/os/hal/ports/NRF51/NRF51822/st_lld.c b/os/hal/ports/NRF51/NRF51822/st_lld.c index 51f942bb..e3ae3f24 100644 --- a/os/hal/ports/NRF51/NRF51822/st_lld.c +++ b/os/hal/ports/NRF51/NRF51822/st_lld.c @@ -129,30 +129,6 @@ OSAL_IRQ_HANDLER(Vector6C) { OSAL_IRQ_EPILOGUE(); } #endif - -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) -/** - * @brief System Timer vector. (TIMER0) - * @details This interrupt is used for freerunning mode (tick-less) - * if selected with NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER - * - * @isr - */ -OSAL_IRQ_HANDLER(Vector60) { - - OSAL_IRQ_PROLOGUE(); - - /* Clear timer compare event */ - if (NRF_TIMER0->EVENTS_COMPARE[0] != 0) - NRF_TIMER0->EVENTS_COMPARE[0] = 0; - - osalSysLockFromISR(); - osalOsTimerHandlerI(); - osalSysUnlockFromISR(); - - OSAL_IRQ_EPILOGUE(); -} -#endif #endif /*===========================================================================*/ @@ -172,34 +148,12 @@ void st_lld_init(void) { NRF_RTC0->PRESCALER = (NRF51_LFCLK_FREQUENCY / OSAL_ST_FREQUENCY) - 1; NRF_RTC0->EVTENCLR = RTC_EVTEN_COMPARE0_Msk; NRF_RTC0->EVENTS_COMPARE[0] = 0; + NRF_RTC0->INTENSET = RTC_INTENSET_COMPARE0_Msk; /* Start timer */ nvicEnableVector(RTC0_IRQn, 8); NRF_RTC0->TASKS_START = 1; #endif - -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) - NRF_TIMER0->TASKS_CLEAR = 1; - - /* - * Using 32-bit mode with prescaler 16 configures this - * timer with a 1MHz clock. - */ - NRF_TIMER0->BITMODE = 3; - NRF_TIMER0->PRESCALER = 4; - - /* - * Configure timer 0 compare capture 1 to generate interrupt - * for overflow according to ST_OVERFLOW_VALUE - */ - NRF_TIMER0->CC[0] = (1000000 / OSAL_ST_FREQUENCY) - 1; - NRF_TIMER0->SHORTS = 1; - NRF_TIMER0->INTENSET = 0x10000; - - /* Start timer */ - nvicEnableVector(TIMER0_IRQn, 8); - NRF_TIMER0->TASKS_START = 1; -#endif #endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ #if OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC diff --git a/os/hal/ports/NRF51/NRF51822/st_lld.h b/os/hal/ports/NRF51/NRF51822/st_lld.h index 3f47a115..412f4fd2 100644 --- a/os/hal/ports/NRF51/NRF51822/st_lld.h +++ b/os/hal/ports/NRF51/NRF51822/st_lld.h @@ -70,8 +70,9 @@ #error "CH_CFG_ST_TIMEDELTA is too low" #endif -#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) -#error "Freeruning (tick-less) mode currently not working" +#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) && \ + (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) +#error "Freeruning (tick-less) mode not supported with TIMER, use RTC" #endif /*===========================================================================*/ @@ -106,13 +107,7 @@ extern "C" { * @notapi */ static inline systime_t st_lld_get_counter(void) { -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) return (systime_t)NRF_RTC0->COUNTER; -#endif -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) - NRF_TIMER0->TASKS_CAPTURE[1] = 1; - return (systime_t)NRF_TIMER0->CC[1]; -#endif } /** @@ -125,16 +120,9 @@ static inline systime_t st_lld_get_counter(void) { * @notapi */ static inline void st_lld_start_alarm(systime_t abstime) { -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) NRF_RTC0->CC[0] = abstime; NRF_RTC0->EVENTS_COMPARE[0] = 0; - NRF_RTC0->EVTENSET = RTC_EVTEN_COMPARE0_Msk; -#endif -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) - NRF_TIMER0->CC[0] = abstime; - NRF_TIMER0->EVENTS_COMPARE[0] = 0; - NRF_TIMER0->INTENSET = TIMER_INTENSET_COMPARE0_Msk; -#endif + NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk; } /** @@ -143,14 +131,8 @@ static inline void st_lld_start_alarm(systime_t abstime) { * @notapi */ static inline void st_lld_stop_alarm(void) { -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) - NRF_RTC0->EVTENCLR = RTC_EVTEN_COMPARE0_Msk; + NRF_RTC0->EVTENCLR = RTC_EVTENCLR_COMPARE0_Msk; NRF_RTC0->EVENTS_COMPARE[0] = 0; -#endif -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) - NRF_TIMER0->INTENCLR = TIMER_INTENCLR_COMPARE0_Msk; - NRF_TIMER0->EVENTS_COMPARE[0] = 0; -#endif } /** @@ -161,12 +143,7 @@ static inline void st_lld_stop_alarm(void) { * @notapi */ static inline void st_lld_set_alarm(systime_t abstime) { -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) NRF_RTC0->CC[0] = abstime; -#endif -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) - NRF_TIMER0->CC[0] = abstime; -#endif } /** @@ -177,12 +154,7 @@ static inline void st_lld_set_alarm(systime_t abstime) { * @notapi */ static inline systime_t st_lld_get_alarm(void) { -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) return (systime_t)NRF_RTC0->CC[0]; -#endif -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) - return (systime_t)NRF_TIMER0->CC[0]; -#endif } /** @@ -195,12 +167,7 @@ static inline systime_t st_lld_get_alarm(void) { * @notapi */ static inline bool st_lld_is_alarm_active(void) { -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_RTC) - return NRF_RTC0->EVTEN & RTC_INTENSET_COMPARE0_Msk; -#endif -#if (NRF51_SYSTEM_TICKS == NRF51_SYSTEM_TICKS_AS_TIMER) - return false; -#endif + return NRF_RTC0->EVTEN & RTC_EVTEN_COMPARE0_Msk; } #endif /* _ST_LLD_H_ */