@@ -52,15 +52,7 @@ void RTCZero::begin(bool resetTime)
52
52
}
53
53
54
54
// Setup clock GCLK2 with OSC32K divided by 32
55
- GCLK->GENDIV .reg = GCLK_GENDIV_ID (2 )|GCLK_GENDIV_DIV (4 );
56
- while (GCLK->STATUS .reg & GCLK_STATUS_SYNCBUSY)
57
- ;
58
- GCLK->GENCTRL .reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_XOSC32K | GCLK_GENCTRL_ID (2 ) | GCLK_GENCTRL_DIVSEL );
59
- while (GCLK->STATUS .reg & GCLK_STATUS_SYNCBUSY)
60
- ;
61
- GCLK->CLKCTRL .reg = (uint32_t )((GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK2 | (RTC_GCLK_ID << GCLK_CLKCTRL_ID_Pos)));
62
- while (GCLK->STATUS .bit .SYNCBUSY )
63
- ;
55
+ configureClock ();
64
56
65
57
RTCdisable ();
66
58
@@ -390,6 +382,21 @@ uint32_t RTCZero::getY2kEpoch()
390
382
return (getEpoch () - EPOCH_TIME_OFF);
391
383
}
392
384
385
+ void RTCZero::setAlarmEpoch (uint32_t ts)
386
+ {
387
+ if (_configured) {
388
+ if (ts < EPOCH_TIME_OFF) {
389
+ ts = EPOCH_TIME_OFF;
390
+ }
391
+
392
+ time_t t = ts;
393
+ struct tm * tmp = gmtime (&t);
394
+
395
+ setAlarmDate (tmp->tm_year - EPOCH_TIME_YEAR_OFF, tmp->tm_mon + 1 , tmp->tm_mday );
396
+ setAlarmTime (tmp->tm_hour , tmp->tm_min , tmp->tm_sec );
397
+ }
398
+ }
399
+
393
400
void RTCZero::setEpoch (uint32_t ts)
394
401
{
395
402
if (_configured) {
@@ -419,6 +426,19 @@ void RTCZero::setY2kEpoch(uint32_t ts)
419
426
}
420
427
}
421
428
429
+ /* Attach peripheral clock to 32k oscillator */
430
+ void RTCZero::configureClock () {
431
+ GCLK->GENDIV .reg = GCLK_GENDIV_ID (2 )|GCLK_GENDIV_DIV (4 );
432
+ while (GCLK->STATUS .reg & GCLK_STATUS_SYNCBUSY)
433
+ ;
434
+ GCLK->GENCTRL .reg = (GCLK_GENCTRL_GENEN | GCLK_GENCTRL_SRC_XOSC32K | GCLK_GENCTRL_ID (2 ) | GCLK_GENCTRL_DIVSEL );
435
+ while (GCLK->STATUS .reg & GCLK_STATUS_SYNCBUSY)
436
+ ;
437
+ GCLK->CLKCTRL .reg = (uint32_t )((GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK2 | (RTC_GCLK_ID << GCLK_CLKCTRL_ID_Pos)));
438
+ while (GCLK->STATUS .bit .SYNCBUSY )
439
+ ;
440
+ }
441
+
422
442
/*
423
443
* Private Utility Functions
424
444
*/
0 commit comments