Timer interrupt does not work well. In the code below, LED doesn't turn off and "interrupt!" message is not received. I really appreciate it if you give me any advice.
#include <nrf9160.h> #include <zephyr.h> #include <misc/printk.h> #include <device.h> #include <nrf_timer.h> #include <gpio.h> #define TIEMR_INTERVAL_SEC 5 struct device *dev; // make 5 sec timer // f_timer = 16*1000*1000 / (2^PRESCALER) // sec_interval = (2^PRESCALER) / 16*1000*1000 x NRF_TIMER0_S->CC[0] void config_timer() { NRF_TIMER1->TASKS_STOP = 1; NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer; NRF_TIMER1->TASKS_CLEAR = 1; // clear time NRF_TIMER1->PRESCALER = 9; // value = 0..9 NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_32Bit; //Set counter to 32 bit resolution. MAX count = 2^32-1 NRF_TIMER1->CC[0] = 156250; //Set value for TIMER0 NRF_TIMER1->INTENSET = TIMER_INTENSET_COMPARE1_Enabled << TIMER_INTENSET_COMPARE1_Pos; NVIC_EnableIRQ(TIMER1_IRQn); NVIC_SetPriority(TIMER1_IRQn, 0); } void TIMER1_IRQHandler(void) { if ((NRF_TIMER1->EVENTS_COMPARE[0] != 0) && ((NRF_TIMER1->INTENSET & TIMER_INTENSET_COMPARE1_Msk) != 0)) { NRF_TIMER1->EVENTS_COMPARE[0] = 0; //Clear compare register 0 event gpio_pin_write(dev, 16, 0); printk("interrupt!\r\n"); } } void main(void) { printk("------------\r\nHello, World!\r\n"); dev = device_get_binding("GPIO_0"); gpio_pin_configure(dev, 16, GPIO_DIR_OUT); config_timer(); gpio_pin_write(dev, 16, 1); NRF_TIMER1->TASKS_START = 1; while(1){ printk("Start to sleep\r\n"); k_cpu_idle(); printk("timer interrupt for %u sec\r\n", TIEMR_INTERVAL_SEC); } }
<> ***** Booting Zephyr OS v1.13.99-ncs2 ***** ------------ Hello, World! Start to sleep timer interrupt for 5 sec Start to sleep // UART communication stops here