NRF51822之定时器

NRF51822之定时器

一、了解

  NRF51822的定时器是运行在系统的高频率下面的, HFCLK = 16 MHz ,包括一个四位的分频器,用来对HFCLK 进行分频。也就是说,最大16分频。
  由于其丰富的定时器任务、时间和中断特点,所以可编程外设互连系统能够与任何外设进行互连使用时,进行定时或计数。可编程外设互连系统(PPI)能用使用任何一个GPIO口输出周期性的信号和PWM波。在同一时间内,输入或者输出的数目收到GPIOTE 模块的数目的限制。
  而GPIOTE则是GPIO 任务事件块,用来规定当前能用多少GPIO的任务事件。
  NRF51822有三个定时器。  一个24位的,两个16位的。
Instance Bit-width Capture/Compare regiters
TIMER0 24 4
TIMER1 16 4
TIMER2 16 4

二、程序

/*
 *NRF51822 共有三个定时器,TIMER0,TIMER1,TIMER2
 */
/*
 * 利用定时器进行定时 ,单位ms
 */
void NRF_Timer_Delay_ms(timer_t timer, uint16_t volatile Number_ms){
   volatile NRF_TIMER_Type *p_timer = Timer_Init(timer); //定义一个定时器指针,并完成初始化
   p_timer->MODE = TIMER_MODE_MODE_Timer; //定时器模式,还有另一种模式,计数器,Counter
   p_timer->PRESCALER = 9;               //预分频,f=16M/2^(prescale),最大为9,即最大512分频
   p_timer->BITMODE = TIMER_BITMODE_BITMODE_16Bit; //定时器位宽
   p_timer->TASKS_CLEAR = 1;             //清除任务
   //最大分频为512后得到的周期是32us, 再要乘以31.25才得到ms
   p_timer->CC[0] = Number_ms * 31;
   p_timer->CC[0] += Number_ms  4;
   p_timer->TASKS_START = 1;    //开启定时器
   while (p_timer->EVENTS_COMPARE[0] == 0){
      //wait
   }
   p_timer->EVENTS_COMPARE[0] = 0;
   p_timer->TASKS_STOP = 1; //停止定时器
}

/*
 * 定时器初始化 ,使用16M高频晶振
 */
static volatile NRF_TIMER_Type *Timer_Init(timer_t timer){
   volatile NRF_TIMER_Type *p_timer; //这里要与NRF_TIMER_Type相对应
   //启动16M晶振
   NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
   NRF_CLOCK->TASKS_HFCLKSTART = 1;
   while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0){
      //等待起振
   }
   //返回指向该定时器的地址的指针
   switch (timer){
   case TIMER0:
      p_timer = NRF_TIMER0;
      break;
   case TIMER1:
      p_timer = NRF_TIMER1;
      break;
   case TIMER2:
      p_timer = NRF_TIMER2;
      break;
   default:
      p_timer = 0;
      break;
   }
   return p_timer;
}

转载于:https://my.oschina.net/u/184090/blog/323560

你可能感兴趣的:(NRF51822之定时器)