This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nrf51822 app timer

Hi

I am trying to broadcast manufacturer data (beacon example) while changing data from second to second. For that I am trying to use timer2 (as timer 0 is used by SD, right).

...


void start_timer(void)
{
NRF_TIMER2->MODE = TIMER_MODE_MODE_Counter; // Set the timer in Counter Mode
NRF_TIMER2->TASKS_CLEAR = 1; // clear the task first to be usable for later
NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; //Set counter to 16 bit resolution
NRF_TIMER2->CC[0] = 5000; //Set value for TIMER2 compare register 0
NRF_TIMER2->CC[1] = 5; //Set value for TIMER2 compare register 1

// Enable interrupt on Timer 2, both for CC[0] and CC[1] compare match events
NRF_TIMER2->INTENSET = (TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos) | (TIMER_INTENSET_COMPARE1_Enabled << TIMER_INTENSET_COMPARE1_Pos);
NVIC_EnableIRQ(TIMER2_IRQn);

NRF_TIMER2->TASKS_START = 1; // Start TIMER2
}

//IMTER2 peripheral interrupt handler. This interrupt handler is called whenever there it a TIMER2 interrupt

void TIMER2_IRQHandler(void)
{
if ((NRF_TIMER2->EVENTS_COMPARE[0] != 0) && ((NRF_TIMER2->INTENSET & TIMER_INTENSET_COMPARE0_Msk) != 0))
{
NRF_TIMER2->EVENTS_COMPARE[0] = 0; //Clear compare register 0 event
nrf_gpio_pin_set(ADVERTISING_LED_PIN_NO); //Set LED
}

if ((NRF_TIMER2->EVENTS_COMPARE[1] != 0) && ((NRF_TIMER2->INTENSET & TIMER_INTENSET_COMPARE1_Msk) != 0))
{
NRF_TIMER2->EVENTS_COMPARE[1] = 0; //Clear compare register 1 event
nrf_gpio_pin_clear(ADVERTISING_LED_PIN_NO); //Clear LED
}
}


int main(void)
{
//Initialization Zone
leds_init();


start_timer();

ble_stack_init();
advertising_init();
// Start execution.
advertising_start();
// Enter main loop.
for (;;)
{
power_manage();

}
}

No compiling errors but

If I call start_timer(); the whole program hangs (LED does not light)

Please, how to use timer?

Env: old rev nrf51822, softdevice 110 version 7 (recent SD make the app not work :-(   and SDK 6)

Imo

Parents
  • Your subject line mentions "app_timer" and indeed that is how you should be doing this.  The app_timer module in the SDK is a really easy and reliable way to create general purpose timers.  It can keep you from making all manner of mistakes with the general timers.

    In your example you make the mistake of setting timer 2 as a counter, instead of timer. Counters count, timers time.

    Also, using timer 2 for this function is kind of overkill since it runs on HF_clk and not the RTC. HF_clk uses substantially more power than the RTC.

    Make your life easier and read up on the app_timer in the SDK.  There are a lot of examples on how to use it.

Reply
  • Your subject line mentions "app_timer" and indeed that is how you should be doing this.  The app_timer module in the SDK is a really easy and reliable way to create general purpose timers.  It can keep you from making all manner of mistakes with the general timers.

    In your example you make the mistake of setting timer 2 as a counter, instead of timer. Counters count, timers time.

    Also, using timer 2 for this function is kind of overkill since it runs on HF_clk and not the RTC. HF_clk uses substantially more power than the RTC.

    Make your life easier and read up on the app_timer in the SDK.  There are a lot of examples on how to use it.

Children
No Data
Related