static void statemachine_clear_alarm(void) { if (state == STATE_ALARM) { rtc_clear_alarm(); printf("RTC Alarm cleared\r\n"); statemachine_active(); } }
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; }
void _rtc_handler(int argc, char **argv) { if (argc < 2) { _rtc_usage(); } else if (strncmp(argv[1], "init", 4) == 0) { rtc_init(); } else if (strncmp(argv[1], "poweron", 7) == 0) { rtc_poweron(); } else if (strncmp(argv[1], "poweroff", 8) == 0) { rtc_poweroff(); } else if (strncmp(argv[1], "clearalarm", 8) == 0) { rtc_clear_alarm(); } else if (strncmp(argv[1], "getalarm", 8) == 0) { _rtc_getalarm(); } else if (strncmp(argv[1], "setalarm", 8) == 0) { _rtc_setalarm(argv + 2); } else if (strncmp(argv[1], "gettime", 7) == 0) { _rtc_gettime(); } else if (strncmp(argv[1], "settime", 7) == 0) { _rtc_settime(argv + 2); } else { printf("unknown command: %s\n", argv[1]); } }
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; }