Example #1
0
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;
}
Example #2
0
File: rtc.c Project: ant9000/RIOT
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;
}