Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61555
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-12 08:37
个人简介

有事可以联系扣扣:577665300

文章分类

全部博文(11)

文章存档

2018年(1)

2017年(6)

2016年(4)

我的朋友

分类: 嵌入式

2017-06-26 17:36:29

资料下载,请加扣扣群:261251460

nrf51822的定时器有两种模式,1、计数模式  2、定时模式

定时器的原理框图是:


原理简介:
Timer模块是从PCLK16M/PCLK1M 处获得时钟源,然后经分频后得到的时钟作为timer模块的时钟 ( 上图Ftimer)。当选择为timer模式时,Counter会在Ftimer的每个tick 计数一次当计数值与cc[n]n0,1,2,3)寄存器中的值相等时就会触发对应的Compare[n]事件,如果我们设置了compare[n]事件产生时触发中断(关于事件与中断看前一篇GPIOTE),那么就可以在counter计数到与 cc[n]寄存器中的值相等时触发中断,也就能实现我们需要的定时器功能了

所以根据上面的模块结构图和说明想要实现定时器,我们需要做如下几个步骤:

1 、选择 Timer/Counter 模块为timer模式,并设置BITMODE816 , 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) |
给主人留下些什么吧!~~