diff --git a/cpu/sam0_common/periph/rtc_rtt.c b/cpu/sam0_common/periph/rtc_rtt.c index ab4777f589a5..4330cd49bd5d 100644 --- a/cpu/sam0_common/periph/rtc_rtt.c +++ b/cpu/sam0_common/periph/rtc_rtt.c @@ -588,10 +588,22 @@ int rtc_get_time(struct tm *time) return 0; } +static void _rtc_clear_alarm(void) +{ + /* disable alarm interrupt */ + RTC->MODE2.INTENCLR.reg = RTC_MODE2_INTENCLR_ALARM0; +} + +void rtc_clear_alarm(void) +{ + _rtc_clear_alarm(); + _pm_unblock(&_pm_alarm); +} + int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg) { /* prevent old alarm from ringing */ - rtc_clear_alarm(); + _rtc_clear_alarm(); /* normalize input */ rtc_tm_normalize(time); @@ -600,18 +612,18 @@ int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg) (time->tm_year > (reference_year + 63))) { return -2; } - else { - RTC->MODE2.Mode2Alarm[0].ALARM.reg = RTC_MODE2_ALARM_YEAR(time->tm_year - reference_year) - | RTC_MODE2_ALARM_MONTH(time->tm_mon + 1) - | RTC_MODE2_ALARM_DAY(time->tm_mday) - | RTC_MODE2_ALARM_HOUR(time->tm_hour) - | RTC_MODE2_ALARM_MINUTE(time->tm_min) - | RTC_MODE2_ALARM_SECOND(time->tm_sec); - RTC->MODE2.Mode2Alarm[0].MASK.reg = RTC_MODE2_MASK_SEL(6); - } + /* make sure that preceding changes have been applied */ _wait_syncbusy(); + RTC->MODE2.Mode2Alarm[0].ALARM.reg = RTC_MODE2_ALARM_YEAR(time->tm_year - reference_year) + | RTC_MODE2_ALARM_MONTH(time->tm_mon + 1) + | RTC_MODE2_ALARM_DAY(time->tm_mday) + | RTC_MODE2_ALARM_HOUR(time->tm_hour) + | RTC_MODE2_ALARM_MINUTE(time->tm_min) + | RTC_MODE2_ALARM_SECOND(time->tm_sec); + RTC->MODE2.Mode2Alarm[0].MASK.reg = RTC_MODE2_MASK_SEL(6); + /* Enable IRQ */ alarm_cb.cb = cb; alarm_cb.arg = arg; @@ -650,14 +662,6 @@ int rtc_set_time(struct tm *time) return 0; } -void rtc_clear_alarm(void) -{ - /* disable alarm interrupt */ - RTC->MODE2.INTENCLR.reg = RTC_MODE2_INTENCLR_ALARM0; - - _pm_unblock(&_pm_alarm); -} - void rtc_poweron(void) { _poweron(); @@ -713,18 +717,32 @@ uint32_t rtt_get_alarm(void) return RTC->MODE0.COMP[0].reg; } +static void _rtt_clear_alarm(void) +{ + /* disable compare interrupt */ + RTC->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0; +} + +void rtt_clear_alarm(void) +{ + _rtt_clear_alarm(); + _pm_unblock(&_pm_alarm); +} + void rtt_set_alarm(uint32_t alarm, rtt_cb_t cb, void *arg) { /* disable interrupt to avoid race */ - rtt_clear_alarm(); + _rtt_clear_alarm(); /* setup callback */ alarm_cb.cb = cb; alarm_cb.arg = arg; + /* make sure that preceding changes have been applied */ + _wait_syncbusy(); + /* set COMP register */ RTC->MODE0.COMP[0].reg = alarm; - _wait_syncbusy(); /* enable compare interrupt and clear flag */ RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_CMP0; @@ -736,14 +754,6 @@ void rtt_set_alarm(uint32_t alarm, rtt_cb_t cb, void *arg) } } -void rtt_clear_alarm(void) -{ - /* disable compare interrupt */ - RTC->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_CMP0; - - _pm_unblock(&_pm_alarm); -} - void rtt_poweron(void) { _poweron();