int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg) { RtcMode2 *rtcMode2 = &(RTC_DEV); rtc_clear_alarm(); if ((time->tm_year < reference_year) || (time->tm_year > (reference_year + 63))) { return -2; } else { rtcMode2->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); rtcMode2->Mode2Alarm[0].MASK.reg = RTC_MODE2_MASK_SEL(6); } while (rtcMode2->STATUS.bit.SYNCBUSY); /* Setup interrupt */ NVIC_SetPriority(RTC_IRQn, 10); NVIC_EnableIRQ(RTC_IRQn); /* Enable IRQ */ rtc_callback.cb = cb; rtc_callback.arg = arg; rtcMode2->INTFLAG.reg = RTC_MODE2_INTFLAG_ALARM0; while (rtcMode2->STATUS.bit.SYNCBUSY); rtcMode2->INTENSET.reg = RTC_MODE2_INTENSET_ALARM0; while (rtcMode2->STATUS.bit.SYNCBUSY); return 0; }
int rtc_set_alarm(struct tm *time, rtc_alarm_cb_t cb, void *arg) { rtc_clear_alarm(); if ((time->tm_year < reference_year) || (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); while (RTC->MODE2.SYNCBUSY.bit.ALARM0); } /* Setup interrupt */ NVIC_EnableIRQ(RTC_IRQn); /* Enable IRQ */ rtc_callback.cb = cb; rtc_callback.arg = arg; RTC->MODE2.INTFLAG.reg |= RTC_MODE2_INTFLAG_ALARM0; RTC->MODE2.INTENSET.bit.ALARM0 = 1; return 0; }