Hello, I would like to use RTC2_IRQHandler in Zephyr environment.
However, each time an RTC interrupt is called, the entire system shuts down and reboots.
How can I use the RTC_IRQHandler?
Here's my source code.
main.cpp
#include <zephyr/kernel.h> #include <zephyr/irq.h> #include <Configure.h> #include <nRF52/RTC.h> RTC CLOCK; int main(void) { NRF_GPIO->DIRSET = (1 << GPIO_LED_RED) | (1 << GPIO_LED_GREEN) | (1 << GPIO_LED_BLUE); CLOCK.Init(RTC2, 32); CLOCK.setEvent(RTC2, RTC_INTERRUPT_COMPARE0); CLOCK.setInterrupt(RTC2, RTC_INTERRUPT_COMPARE0); CLOCK.Start(RTC2); CLOCK.setCompare(RTC2, RTC_COMPARE0, 3000); while(true){ NRF_GPIO->OUTCLR = (1 << GPIO_LED_RED) | (1 << GPIO_LED_GREEN) | (1 << GPIO_LED_BLUE); NRF_GPIO->OUTSET = (1 << GPIO_LED_RED); printk("CLOCK : %d\n", CLOCK.getCounter(RTC2)); k_msleep(1000); NRF_GPIO->OUTCLR = (1 << GPIO_LED_RED) | (1 << GPIO_LED_GREEN) | (1 << GPIO_LED_BLUE); NRF_GPIO->OUTSET = (1 << GPIO_LED_GREEN); printk("CLOCK : %d\n", CLOCK.getCounter(RTC2)); k_msleep(1000); NRF_GPIO->OUTCLR = (1 << GPIO_LED_RED) | (1 << GPIO_LED_GREEN) | (1 << GPIO_LED_BLUE); NRF_GPIO->OUTSET = (1 << GPIO_LED_BLUE); printk("CLOCK : %d\n", CLOCK.getCounter(RTC2)); k_msleep(1000); } return 0; } void RTC2_IRQHandler(void){ if(NRF_RTC2->EVENTS_COMPARE[0] == 1){ printk("TESt\n "); NRF_RTC2->EVENTS_COMPARE[0] = 0; } }
RTC.cpp
#include "RTC.h" void RTC::Init(uint8_t channel, uint16_t prescaler){ if(!(NRF_CLOCK->LFCLKSTAT >> 16) & 0x01){ NRF_CLOCK->LFCLKSRC = CLOCK_LFCLKSRC_SRC_Xtal; NRF_CLOCK->TASKS_LFCLKSTART = 0x01; while(!NRF_CLOCK->EVENTS_LFCLKSTARTED){} } switch(channel){ case RTC0: NRF_RTC0->TASKS_CLEAR = 1; NRF_RTC0->TASKS_STOP = 1; NRF_RTC0->PRESCALER = 32; printk("Settings : %d %d\n", NRF_RTC0->PRESCALER, prescaler); break; case RTC1: NRF_RTC1->TASKS_CLEAR = 1; NRF_RTC1->TASKS_STOP = 1; NRF_RTC1->PRESCALER = prescaler; break; case RTC2: NRF_RTC2->TASKS_CLEAR = 1; NRF_RTC2->TASKS_STOP = 1; NRF_RTC2->PRESCALER = prescaler; break; default: break; } } void RTC::Start(uint8_t channel){ switch(channel){ case RTC0: NRF_RTC0->TASKS_START = 1; break; case RTC1: NRF_RTC1->TASKS_START = 1; break; case RTC2: NRF_RTC2->TASKS_START = 1; break; default: break; } } void RTC::Stop(uint8_t channel){ switch(channel){ case RTC0: NRF_RTC0->TASKS_STOP = 1; NRF_RTC0->TASKS_CLEAR = 1; break; case RTC1: NRF_RTC1->TASKS_STOP = 1; NRF_RTC1->TASKS_CLEAR = 1; break; case RTC2: NRF_RTC2->TASKS_STOP = 1; NRF_RTC2->TASKS_CLEAR = 1; break; default: break; } } void RTC::setInterrupt(uint8_t channel, uint32_t interrupt){ switch(channel){ case RTC0: NRF_RTC0->INTENSET = interrupt; NVIC_SetPriority(RTC0_IRQn, 5); NVIC_EnableIRQ(RTC0_IRQn); break; case RTC1: NRF_RTC1->INTENSET = interrupt; NVIC_SetPriority(RTC1_IRQn, 5); NVIC_EnableIRQ(RTC1_IRQn); break; case RTC2: NRF_RTC2->INTENSET = interrupt; NVIC_SetPriority(RTC2_IRQn, 5); NVIC_EnableIRQ(RTC2_IRQn); break; default: break; } } void RTC::clearInterrupt(uint8_t channel, uint32_t interrupt){ switch(channel){ case RTC0: NRF_RTC0->INTENCLR = interrupt; break; case RTC1: NRF_RTC1->INTENCLR = interrupt; break; case RTC2: NRF_RTC2->INTENCLR = interrupt; break; default: break; } } void RTC::setEvent(uint8_t channel, uint32_t event){ switch(channel){ case RTC0: NRF_RTC0->EVTENSET = event; break; case RTC1: NRF_RTC1->EVTENSET = event; break; case RTC2: NRF_RTC2->EVTENSET = event; break; default: break; } } void RTC::clearEvent(uint8_t channel, uint32_t event){ switch(channel){ case RTC0: NRF_RTC0->EVTENCLR = event; break; case RTC1: NRF_RTC1->EVTENCLR = event; break; case RTC2: NRF_RTC2->EVTENCLR = event; break; default: break; } } void RTC::setCompare(uint8_t channel, uint8_t comp_no, uint32_t cc){ if(comp_no > 3){ return; } switch(channel){ case RTC0: NRF_RTC0->CC[comp_no] = cc; break; case RTC1: NRF_RTC1->CC[comp_no] = cc; break; case RTC2: NRF_RTC2->CC[comp_no] = cc; break; default: break; } } uint32_t RTC::getCounter(uint8_t channel){ static uint32_t output=0; switch(channel){ case RTC0: output = NRF_RTC0->COUNTER; break; case RTC1: output = NRF_RTC1->COUNTER; break; case RTC2: output = NRF_RTC2->COUNTER; break; default: output = NRF_RTC0->COUNTER; break; } return output; }