Hello All,
I am using RTC interrupt handle on the NRF5340 kit to set the event using k_event_post API from the interrupt context and when I try to wait on this event in the main function using k_event_wait it is never set the event and when I tried to debug using the NRF5340 kit debugger it works using the debugger but when the NRF controller run in freerun mode it didn't work.
and here is the example I am using to test this scenario.
#include <zephyr.h>
#include <sys/util.h>
#include <sys/printk.h>
#include <string.h>
#include <stdlib.h>
#include <nrfx_rtc.h>
#include <nrfx_timer.h>
#include <nrfx_dppi.h>
#include <nrfx_gpiote.h>
#include <hal/nrf_gpiote.h>
#include <hal/nrf_timer.h>
#include <hal/nrf_gpio.h>
#define LED_0 28
#define LED_1 29
#define LED_2 30
#define COMPARE_COUNTERTIME 3
#define RTC_EVENT_PENDING (1 << 2)
K_EVENT_DEFINE(RTC_events);
const nrfx_rtc_t rtc = NRFX_RTC_INSTANCE(0);
uint32_t event_mask;
static void rtc_handler(nrfx_rtc_int_type_t int_type)
{
if (int_type == NRFX_RTC_INT_COMPARE0) {
nrf_gpio_pin_toggle(LED_0);
} else if (int_type == NRFX_RTC_INT_TICK) {
nrf_gpio_pin_toggle(LED_1);
printk("Event LED_1!\n");
k_event_post(&RTC_events, RTC_EVENT_PENDING);
}
}
static void rtc_config(void)
{
uint32_t err_code;
nrfx_rtc_config_t config = NRFX_RTC_DEFAULT_CONFIG;
config.prescaler = 4095;
err_code = nrfx_rtc_init(&rtc, &config, rtc_handler);
if (err_code != NRFX_SUCCESS) {
printk("Failure in setup\n");
return;
}
nrfx_rtc_tick_enable(&rtc, true);
err_code = nrfx_rtc_cc_set(&rtc, 0, COMPARE_COUNTERTIME * 8, true);
if (err_code != NRFX_SUCCESS) {
printk("Failure in setup\n");
return;
}
nrfx_rtc_enable(&rtc);
}
static void manual_isr_setup()
{
IRQ_DIRECT_CONNECT(RTC0_IRQn, 0, nrfx_rtc_0_irq_handler, 0);
irq_enable(RTC0_IRQn);
}
void main(void)
{
printk("Starting rtc sample!\n");
nrf_gpio_cfg_output(LED_0);
nrf_gpio_cfg_output(LED_1);
nrf_gpio_cfg_output(LED_2);
rtc_config();
manual_isr_setup();
while(1)
{
uint32_t event_mask = k_event_wait(&RTC_events, RTC_EVENT_PENDING, true , K_FOREVER);
printk("Event Started!\n");
if(event_mask & RTC_EVENT_PENDING)
{
nrf_gpio_pin_toggle(LED_2);
printk("Event LED_2!\n");
}
}
}
Thanks,