资料下载,请加扣扣群:261251460
nrf51822的定时器有两种模式,1、计数模式 2、定时模式
定时器的原理框图是:
原理简介:
Timer模块是从
PCLK16M/PCLK1M 处获得时钟源,然后经分频后得到的时钟作为
timer模块的时钟
( 上图F
timer)。当
选择为
timer模式时,
Counter会在F
timer的每个
tick 计数一次当计数值与
cc[n](
n为
0,1,2,3)寄存器中的值相等时就会触发对应的
Compare[n]事件,如果我们设置了
compare[n]事件产生时触发中断
(关于事件与中断看前一篇
GPIOTE),那么就可以在
counter计数到与
cc[n]寄存器中的值相等时触发中断,也就能实现我们需要的定时器功能了
所以根据上面的模块结构图和说明想要实现定时器,我们需要做如下几个步骤:
1 、选择 Timer/Counter 模块为timer模式,并设置BITMODE(8,16 , 24, 32位)
2 、通过设置分频来设置timer的时钟
3 、设置cc[n](后面我们的例子选择使用cc0),来设置计数到多少产生compares[n]事件(当计数值技术到cc[n]的值时对应产生compare[n]事件)
4 、设置compare事件产生时触发中断。
5 、通过NVIC函数启动MCU 的timer中断
6 、最后启动
timer
下面进行代码演示:
打开\nrf51822\nRF5_SDK_11.0.0_89a8197\examples\peripheral\timer\pca10028\arm5_no_packs
该例程实现:500ms点亮第一个led->点亮第二个led->点亮第三个led->点亮第四个led->关闭第一个led->关闭第二个led->关闭第三个led->关闭第四个led
如下:
定义到:timer_led_event_handler
void timer_led_event_handler(nrf_timer_event_t event_type, void* p_context)
{
static uint32_t i;
uint32_t led_to_invert = (1 << leds_list[(i++) % LEDS_NUMBER]); //计算点亮那个led
switch(event_type)
{
case NRF_TIMER_EVENT_COMPARE0:
LEDS_INVERT(led_to_invert); //led电平翻转
break;
default:
//Do nothing.
break;
}
}
下载烧录:可以看到led轮流翻转。
阅读(3541) | 评论(0) | 转发(0) |