// rtc_seconds_isr.ino
// The code in this proof-of-concept is derived from
// https://github.com/manitou48/teensy4/blob/master/rtchp.ino
volatile uint32_t rtc_seconds_count;
volatile bool rtc_trigger = false;
void rtc_seconds_isr(void)
{
SNVS_HPSR |= 3;
rtc_seconds_count++;
rtc_trigger = true;
asm("dsb");
}
void rtc_seconds_begin()
{
constexpr uint8_t SNVS_HPCR_PI_FREQ_MASK = 0x0F;
constexpr uint8_t SNVS_HPCR_PI_EN_MASK = 0x08;
attachInterruptVector(IRQ_SNVS_IRQ,rtc_seconds_isr);
NVIC_DISABLE_IRQ(IRQ_SNVS_IRQ);
SNVS_HPSR |= 2;
SNVS_HPCR &= SNVS_HPCR_PI_FREQ_MASK;
SNVS_HPCR |= SNVS_HPCR_PI_FREQ(15); // 2^15 = 32768
SNVS_HPCR |= SNVS_HPCR_PI_EN_MASK;
NVIC_ENABLE_IRQ(IRQ_SNVS_IRQ);
asm("dsb");
}
void setup()
{
while (!Serial);
pinMode(LED_BUILTIN, OUTPUT );
rtc_seconds_begin();
rtc_seconds_count = rtc_get();
}
void loop()
{
if( rtc_trigger == true )
{
rtc_trigger = false;
Serial.print("\r\nrtc_get() unix time is "); Serial.println( rtc_get() );
Serial.print("rtc_seconds count is "); Serial.println( rtc_seconds_count );
digitalWrite( LED_BUILTIN, !digitalRead(LED_BUILTIN) );
}
}