Hi all, I'm using Timer2 while having the SD enabled, and I'm having some problems. I don't seem to be able to reliably set the periodicity of the timer. No matter what I load in the CC[] register, the interrupt always triggers at the same frequency. Here's what I'm doing:
In main(), to initialize I have: sd_clock_hfclk_request(); do { sd_clock_hfclk_is_running(&p_is_running); } while (p_is_running == 0);
NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer; // Set the timer in Timer Mode NRF_TIMER2->PRESCALER = 0; // Prescaler 0 produces 1 MHz timer freq => 1 tick = 1 us NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; // 16-bit mode
// Enable interrupt
NRF_TIMER2->INTENSET = TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos;
// Set up interrupt handler
sd_nvic_ClearPendingIRQ(TIMER2_IRQn);
sd_nvic_SetPriority(TIMER2_IRQn, APP_IRQ_PRIORITY_LOW);
sd_nvic_EnableIRQ(TIMER2_IRQn);
Then, when a button is pressed, I have: NRF_TIMER2->TASKS_CLEAR = 1; // Clear the task first to be usable for later NRF_TIMER2->CC[0] = delay; NRF_TIMER2->TASKS_START = 1; // Start clocks
In the interrupt handler, where code execution goes next, I have: if (((NRF_TIMER2->EVENTS_COMPARE[0] == 1) && (NRF_TIMER2->INTENSET & TIMER_INTENSET_COMPARE0_Msk))) { NRF_TIMER2->EVENTS_COMPARE[0] = 0;
... my specific code here... }
And finally when I'm done I do:
NRF_TIMER2->EVENTS_COMPARE[0] = 0; NRF_TIMER2->TASKS_STOP = 1; // Stop clocks
Did anybody run into this problem with Timers and the soft device? Maybe I have to call another SD API function that I'm not aware of?
Can someone provide an example of the Timers and the SD working together?
Thank you!
Gil