一、了解
NRF51822的定时器是运行在系统的高频率下面的, HFCLK = 16 MHz ,包括一个四位的分频器,用来对HFCLK 进行分频。也就是说,最大16分频。
由于其丰富的定时器任务、时间和中断特点,所以可编程外设互连系统能够与任何外设进行互连使用时,进行定时或计数。可编程外设互连系统(PPI)能用使用任何一个GPIO口输出周期性的信号和PWM波。在同一时间内,输入或者输出的数目收到GPIOTE 模块的数目的限制。
而GPIOTE则是GPIO 任务事件块,用来规定当前能用多少GPIO的任务事件。
NRF51822有三个定时器。 一个24位的,两个16位的。
二、程序——
/*
*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;
}
用户377235 2015-2-6 17:50
用户513428 2015-1-12 09:37
用户377235 2014-11-13 15:56