diff --git a/boards/common/arduino-mkr/include/periph_conf_common.h b/boards/common/arduino-mkr/include/periph_conf_common.h index c5f22f62d9..97cdc606d8 100644 --- a/boards/common/arduino-mkr/include/periph_conf_common.h +++ b/boards/common/arduino-mkr/include/periph_conf_common.h @@ -189,24 +189,13 @@ static const i2c_conf_t i2c_config[] = { #define I2C_NUMOF ARRAY_SIZE(i2c_config) /** @} */ -/** - * @name RTC configuration - * @{ - */ -#define RTC_DEV RTC->MODE2 -/** @} */ - /** * @name RTT configuration * @{ */ -#define RTT_DEV RTC->MODE0 -#define RTT_IRQ RTC_IRQn -#define RTT_IRQ_PRIO 10 -#define RTT_ISR isr_rtc -#define RTT_MAX_VALUE (0xffffffff) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ -#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +#endif /** @} */ /** diff --git a/boards/common/arduino-zero/include/periph_conf.h b/boards/common/arduino-zero/include/periph_conf.h index 1114acadba..1f4610bfb2 100644 --- a/boards/common/arduino-zero/include/periph_conf.h +++ b/boards/common/arduino-zero/include/periph_conf.h @@ -267,24 +267,13 @@ static const i2c_conf_t i2c_config[] = { #define I2C_NUMOF ARRAY_SIZE(i2c_config) /** @} */ -/** - * @name RTC configuration - * @{ - */ -#define RTC_DEV RTC->MODE2 -/** @} */ - /** * @name RTT configuration * @{ */ -#define RTT_DEV RTC->MODE0 -#define RTT_IRQ RTC_IRQn -#define RTT_IRQ_PRIO 10 -#define RTT_ISR isr_rtc -#define RTT_MAX_VALUE (0xffffffff) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ -#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +#endif /** @} */ /** diff --git a/boards/common/saml1x/include/periph_conf.h b/boards/common/saml1x/include/periph_conf.h index 4eeb305e03..77ee6a21e8 100644 --- a/boards/common/saml1x/include/periph_conf.h +++ b/boards/common/saml1x/include/periph_conf.h @@ -145,8 +145,9 @@ static const i2c_conf_t i2c_config[] = { * @name RTT configuration * @{ */ +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) -#define RTT_MAX_VALUE (0xffffffffU) +#endif /** @} */ /** diff --git a/boards/common/sodaq/include/cfg_rtt_default.h b/boards/common/sodaq/include/cfg_rtt_default.h index a73c1a135c..0a6230a7bd 100644 --- a/boards/common/sodaq/include/cfg_rtt_default.h +++ b/boards/common/sodaq/include/cfg_rtt_default.h @@ -32,13 +32,9 @@ extern "C" { * @name RTT configuration * @{ */ -#define RTT_DEV RTC->MODE0 -#define RTT_IRQ RTC_IRQn -#define RTT_IRQ_PRIO 10 -#define RTT_ISR isr_rtc -#define RTT_MAX_VALUE (0xffffffff) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ -#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +#endif /** @} */ #ifdef __cplusplus diff --git a/boards/feather-m0/include/periph_conf.h b/boards/feather-m0/include/periph_conf.h index ce3f6c37b8..9b4dec9af2 100644 --- a/boards/feather-m0/include/periph_conf.h +++ b/boards/feather-m0/include/periph_conf.h @@ -248,23 +248,12 @@ static const i2c_conf_t i2c_config[] = { /** @} */ /** - * @name RTC configuration + * @name RTT configuration * @{ */ -#define RTC_DEV RTC->MODE2 -/** @} */ - -/** - * @name RTT configuration - * @{ - */ -#define RTT_DEV RTC->MODE0 -#define RTT_IRQ RTC_IRQn -#define RTT_IRQ_PRIO 10 -#define RTT_ISR isr_rtc -#define RTT_MAX_VALUE (0xffffffff) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ -#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +#endif /** @} */ /** diff --git a/boards/hamilton/include/periph_conf.h b/boards/hamilton/include/periph_conf.h index 7cfda8f8db..e8b169c14a 100644 --- a/boards/hamilton/include/periph_conf.h +++ b/boards/hamilton/include/periph_conf.h @@ -88,23 +88,12 @@ extern "C" { /** @} */ /** - * @name RTC configuration + * @name RTT configuration * @{ */ -#define RTC_DEV RTC->MODE2 -/** @} */ - -/** - * @name RTT configuration - * @{ - */ -#define RTT_DEV RTC->MODE0 -#define RTT_IRQ RTC_IRQn -#define RTT_IRQ_PRIO 10 -#define RTT_ISR isr_rtc -#define RTT_MAX_VALUE (0xffffffff) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ -#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +#endif /** @} */ /** diff --git a/boards/samd21-xpro/include/periph_conf.h b/boards/samd21-xpro/include/periph_conf.h index 7d451ea421..a6613925ee 100644 --- a/boards/samd21-xpro/include/periph_conf.h +++ b/boards/samd21-xpro/include/periph_conf.h @@ -316,24 +316,13 @@ static const i2c_conf_t i2c_config[] = { #define I2C_NUMOF ARRAY_SIZE(i2c_config) /** @} */ -/** - * @name RTC configuration - * @{ - */ -#define RTC_DEV RTC->MODE2 -/** @} */ - /** * @name RTT configuration * @{ */ -#define RTT_DEV RTC->MODE0 -#define RTT_IRQ RTC_IRQn -#define RTT_IRQ_PRIO 10 -#define RTT_ISR isr_rtc -#define RTT_MAX_VALUE (0xffffffff) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ -#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +#endif /** @} */ /** diff --git a/boards/same54-xpro/include/periph_conf.h b/boards/same54-xpro/include/periph_conf.h index be145dc676..0a149349eb 100644 --- a/boards/same54-xpro/include/periph_conf.h +++ b/boards/same54-xpro/include/periph_conf.h @@ -231,8 +231,9 @@ static const i2c_conf_t i2c_config[] = { * @name RTT configuration * @{ */ +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) -#define RTT_MAX_VALUE (0xffffffffU) +#endif /** @} */ /** diff --git a/boards/saml21-xpro/include/periph_conf.h b/boards/saml21-xpro/include/periph_conf.h index 95a6fe7420..05575a275d 100644 --- a/boards/saml21-xpro/include/periph_conf.h +++ b/boards/saml21-xpro/include/periph_conf.h @@ -162,8 +162,9 @@ static const i2c_conf_t i2c_config[] = { * @name RTT configuration * @{ */ +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) -#define RTT_MAX_VALUE (0xffffffffU) +#endif /** @} */ /** diff --git a/boards/samr21-xpro/include/periph_conf.h b/boards/samr21-xpro/include/periph_conf.h index 2624d3388f..2c9ab96b4f 100644 --- a/boards/samr21-xpro/include/periph_conf.h +++ b/boards/samr21-xpro/include/periph_conf.h @@ -283,24 +283,13 @@ static const i2c_conf_t i2c_config[] = { /** @} */ /** - * @name RTC configuration + * @name RTT configuration * @{ */ -#define RTC_DEV RTC->MODE2 -/** @} */ - -/** - * @name RTT configuration - * @{ - */ -#define RTT_DEV RTC->MODE0 -#define RTT_IRQ RTC_IRQn -#define RTT_IRQ_PRIO 10 -#define RTT_ISR isr_rtc -#define RTT_MAX_VALUE (0xffffffff) -#define RTT_MIN_OFFSET (10U) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ -#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ +#endif +#define RTT_MIN_OFFSET (10U) /** @} */ /** diff --git a/boards/samr30-xpro/include/periph_conf.h b/boards/samr30-xpro/include/periph_conf.h index d10bc71771..a64d0114cf 100644 --- a/boards/samr30-xpro/include/periph_conf.h +++ b/boards/samr30-xpro/include/periph_conf.h @@ -153,10 +153,12 @@ static const i2c_conf_t i2c_config[] = { * @name RTT configuration * @{ */ -#define RTT_FREQUENCY (32768U) -#define RTT_MAX_VALUE (0xffffffffU) +#ifndef RTT_FREQUENCY +#define RTT_FREQUENCY (32768U) +#endif /** @} */ + /** * @name ADC Configuration * @{ diff --git a/boards/samr34-xpro/include/periph_conf.h b/boards/samr34-xpro/include/periph_conf.h index 2489d7b0be..3a3ad94f3b 100644 --- a/boards/samr34-xpro/include/periph_conf.h +++ b/boards/samr34-xpro/include/periph_conf.h @@ -144,8 +144,9 @@ static const i2c_conf_t i2c_config[] = { * @name RTT configuration * @{ */ -#define RTT_FREQUENCY (32768U) -#define RTT_MAX_VALUE (0xffffffffU) +#ifndef RTT_FREQUENCY +#define RTT_FREQUENCY (32768U) +#endif /** @} */ /** diff --git a/boards/serpente/include/periph_conf.h b/boards/serpente/include/periph_conf.h index 0fc26888d4..832668c558 100644 --- a/boards/serpente/include/periph_conf.h +++ b/boards/serpente/include/periph_conf.h @@ -212,8 +212,9 @@ static const i2c_conf_t i2c_config[] = { * @name RTT configuration * @{ */ -#define RTT_MAX_VALUE (0xffffffff) +#ifndef RTT_FREQUENCY #define RTT_FREQUENCY (32768U) /* in Hz. For changes see `rtt.c` */ +#endif /** @} */ /** diff --git a/cpu/sam0_common/periph/rtt.c b/cpu/sam0_common/periph/rtt.c index b38ce16330..9b32eca4bd 100644 --- a/cpu/sam0_common/periph/rtt.c +++ b/cpu/sam0_common/periph/rtt.c @@ -36,18 +36,28 @@ #define RTC_MODE0_CTRLA_COUNTSYNC (0x1ul << RTC_MODE0_CTRLA_COUNTSYNC_Pos) #endif +#ifdef REG_RTC_MODE0_CTRLA +#define RTC_MODE0_PRESCALER \ + (__builtin_ctz(2 * RTT_CLOCK_FREQUENCY / RTT_FREQUENCY) << \ + RTC_MODE0_CTRLA_PRESCALER_Pos) +#else +#define RTC_MODE0_PRESCALER \ + (__builtin_ctz(RTT_CLOCK_FREQUENCY / RTT_FREQUENCY) << \ + RTC_MODE0_CTRL_PRESCALER_Pos) +#endif + static rtt_cb_t _overflow_cb; -static void* _overflow_arg; +static void *_overflow_arg; static rtt_cb_t _cmp0_cb; -static void* _cmp0_arg; +static void *_cmp0_arg; static void _wait_syncbusy(void) { #ifdef REG_RTC_MODE0_SYNCBUSY while (RTC->MODE0.SYNCBUSY.reg) {} #else - while(RTC->MODE0.STATUS.bit.SYNCBUSY) {} + while (RTC->MODE0.STATUS.bit.SYNCBUSY) {} #endif } @@ -66,7 +76,8 @@ static inline void _rtt_reset(void) static void _rtt_clock_setup(void) { /* Setup clock GCLK2 with OSC32K */ - GCLK->CLKCTRL.reg = GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN(SAM0_GCLK_32KHZ) | GCLK_CLKCTRL_ID_RTC; + GCLK->CLKCTRL.reg = GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN(SAM0_GCLK_32KHZ) | + GCLK_CLKCTRL_ID_RTC; while (GCLK->STATUS.bit.SYNCBUSY) {} } #else @@ -88,6 +99,7 @@ static void _rtt_clock_setup(void) #else #error "No clock source for RTT selected. " #endif + } #endif /* !CPU_SAMD21 - Clock Setup */ @@ -100,15 +112,17 @@ void rtt_init(void) /* set 32bit counting mode & enable the RTC */ #ifdef REG_RTC_MODE0_CTRLA - RTC->MODE0.CTRLA.reg = RTC_MODE0_CTRLA_MODE(0) | RTC_MODE0_CTRLA_ENABLE | RTC_MODE0_CTRLA_COUNTSYNC; + RTC->MODE0.CTRLA.reg = RTC_MODE0_CTRLA_MODE(0) | RTC_MODE0_CTRLA_ENABLE | + RTC_MODE0_CTRLA_COUNTSYNC | RTC_MODE0_PRESCALER; #else - RTC->MODE0.CTRL.reg = RTC_MODE0_CTRL_MODE(0) | RTC_MODE0_CTRL_ENABLE; + RTC->MODE0.CTRL.reg = RTC_MODE0_CTRL_MODE(0) | RTC_MODE0_CTRL_ENABLE | + RTC_MODE0_PRESCALER; #endif _wait_syncbusy(); /* initially clear flag */ RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0 - | RTC_MODE0_INTFLAG_OVF; + | RTC_MODE0_INTFLAG_OVF; NVIC_EnableIRQ(RTC_IRQn); @@ -167,7 +181,7 @@ void rtt_set_alarm(uint32_t alarm, rtt_cb_t cb, void *arg) _wait_syncbusy(); /* enable compare interrupt and clear flag */ - RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; + RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; RTC->MODE0.INTENSET.reg = RTC_MODE0_INTENSET_CMP0; } diff --git a/cpu/samd21/include/periph_cpu.h b/cpu/samd21/include/periph_cpu.h index aed4f91fab..1018355ed1 100644 --- a/cpu/samd21/include/periph_cpu.h +++ b/cpu/samd21/include/periph_cpu.h @@ -127,6 +127,18 @@ typedef enum { */ #define DAC_NUMOF (1) +/** + * @name Real time counter configuration + * @{ + */ +#define RTT_RUNSTDBY (1) /* Keep RTT running in sleep states */ + +#define RTT_MAX_VALUE (0xffffffff) +#define RTT_CLOCK_FREQUENCY (32768U) /* in Hz */ +#define RTT_MIN_FREQUENCY (RTT_CLOCK_FREQUENCY / 1024U) /* in Hz */ +#define RTT_MAX_FREQUENCY (RTT_CLOCK_FREQUENCY) /* in Hz */ +/** @} */ + #ifdef __cplusplus } #endif diff --git a/cpu/samd5x/include/periph_cpu.h b/cpu/samd5x/include/periph_cpu.h index 0f3e1a984e..1b4d13c956 100644 --- a/cpu/samd5x/include/periph_cpu.h +++ b/cpu/samd5x/include/periph_cpu.h @@ -79,6 +79,16 @@ enum { */ #define DAC_NUMOF (2) +/** + * @name Real time counter configuration + * @{ + */ +#define RTT_MAX_VALUE (0xffffffff) +#define RTT_CLOCK_FREQUENCY (32768U) /* in Hz */ +#define RTT_MIN_FREQUENCY (RTT_CLOCK_FREQUENCY / 1024U) /* in Hz */ +#define RTT_MAX_FREQUENCY (RTT_CLOCK_FREQUENCY) /* in Hz */ +/** @} */ + #ifdef __cplusplus } #endif diff --git a/cpu/saml1x/include/periph_cpu.h b/cpu/saml1x/include/periph_cpu.h index dd9aad8c77..3c81e6dd58 100644 --- a/cpu/saml1x/include/periph_cpu.h +++ b/cpu/saml1x/include/periph_cpu.h @@ -72,6 +72,16 @@ typedef enum { */ #define DAC_NUMOF (1) +/** + * @name Real time counter configuration + * @{ + */ +#define RTT_MAX_VALUE (0xffffffff) +#define RTT_CLOCK_FREQUENCY (32768U) /* in Hz */ +#define RTT_MIN_FREQUENCY (RTT_CLOCK_FREQUENCY / 1024U) /* in Hz */ +#define RTT_MAX_FREQUENCY (RTT_CLOCK_FREQUENCY) /* in Hz */ +/** @} */ + #ifdef __cplusplus } #endif diff --git a/cpu/saml21/include/periph_cpu.h b/cpu/saml21/include/periph_cpu.h index d7f0345026..cd08216811 100644 --- a/cpu/saml21/include/periph_cpu.h +++ b/cpu/saml21/include/periph_cpu.h @@ -73,6 +73,16 @@ typedef enum { */ #define DAC_NUMOF (2) +/** + * @name Real time counter configuration + * @{ + */ +#define RTT_MAX_VALUE (0xffffffff) +#define RTT_CLOCK_FREQUENCY (32768U) /* in Hz */ +#define RTT_MIN_FREQUENCY (RTT_CLOCK_FREQUENCY / 512U) /* in Hz */ +#define RTT_MAX_FREQUENCY (RTT_CLOCK_FREQUENCY) /* in Hz */ +/** @} */ + #ifdef __cplusplus } #endif