2016年2月3日 星期三

nRF51x22 Simple Timer Code

1. 定義一個固定時間觸發的Timer.


2. 只需要Timer Init 和 Timer Handler這兩個function就可以用了.

Timer Init:
-------------------------------------------------------------------------------------------------------------------------
  1. void Timer_Init(int32_t deltatime)
  2. {
  3. NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; //Set counter to 16 bit resolution
  4. NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer;
  5. NRF_TIMER2->PRESCALER = 9; //16MHz/(2^9) = 16MHz/512 = 31250Hz = 32usec
  6. NRF_TIMER2->CC[2] = (deltatime/32); //250 = 8msec , 500 = 16msec
  7. NRF_TIMER2->INTENSET = TIMER_INTENSET_COMPARE2_Enabled << TIMER_INTENSET_COMPARE2_Pos;
  8. NRF_TIMER2->SHORTS = (TIMER_SHORTS_COMPARE1_CLEAR_Enabled << TIMER_SHORTS_COMPARE1_CLEAR_Pos);
  9. NVIC_ClearPendingIRQ(TIMER2_IRQn);
  10. NVIC_SetPriority(TIMER2_IRQn,3);
  11. NVIC_EnableIRQ(TIMER2_IRQn);
  12. NRF_TIMER2->TASKS_START = 1;
  13. }
  14.  


Timer Handler:
-------------------------------------------------------------------------------------------------------------------------
  1.  
  2. void TIMER2_IRQHandler(void)
  3. {
  4. if((NRF_TIMER2->EVENTS_COMPARE[2] == 1) && (NRF_TIMER2->INTENSET & TIMER_INTENSET_COMPARE2_Msk))
  5. {
  6. NRF_TIMER2->EVENTS_COMPARE[2] = 0;
  7. //nrf_gpio_pin_toggle(20); //debug gpio
  8. NRF_TIMER2->TASKS_CLEAR = 1;
  9. }
  10. }
  11.  
3. 假設需要定義一個固定每10msec會觸發的Timer, 可以在Init的時候帶入這樣的參數.     Timer_Init(10000);

沒有留言:

張貼留言