新闻  |   论坛  |   博客  |   在线研讨会
裸机Timer
电子禅石 | 2017-09-01 18:11:34    阅读:9321   发布文章

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

1    选择Timer/Countermo模块为timer模式,并设置bitmode816,2,32位)

2    通过设置分屏来设置timer的时钟

3    设置cc[n](后面我们的例子选择使用cc0),来设置计数到多少产生compares[n]事件(当计数值技术到cc[n]的值时对应产生compare[n]事件)

4    设置compare事件产生时触发中断。

5     通过NVIC函数启动MCU timer中断

6    最后启动timer就可以了。

#include "nrf51.h"
#include "nrf_gpio.h"
//定义自己板子上的LED灯
#define LED  22
int main(){
    nrf_gpio_cfg_output(LED);
    //NRF_TIMER0定义在nrf51.h中,该指针指向timer0中的寄存器组
    NRF_TIMER0->PRESCALER  = 4;     //2^4   16分频得到1M timer时钟
    NRF_TIMER0->MODE = 0;           //timer模式
    NRF_TIMER0->BITMODE = 3;        // 设置32bit
    NRF_TIMER0->CC[0] = 1000000;    //一个tick是1us,1000000代表1s
    NRF_TIMER0->INTENSET = 1<<16;//设置compare[0]事件产生时触发中断
    //该设置使timer模块中的conter计数到cc[0]值时会自动清零,以带到重//新计数的目的
    NRF_TIMER0->SHORTS = 1;
    //启动timer模块
    NRF_TIMER0->TASKS_START = 1;
    //开启MCU的timer0中断 
    NVIC_SetPriority(TIMER0_IRQn, 3);
    NVIC_ClearPendingIRQ(TIMER0_IRQn);
    NVIC_EnableIRQ(TIMER0_IRQn);
    while(1);
    return 0;
}

//中断函数中翻转灯状态
void TIMER0_IRQHandler(){
    if(NRF_TIMER0->EVENTS_COMPARE[0] == 1){
       NRF_TIMER0->EVENTS_COMPARE[0] = 0;     //清除事件,不然会导致一
                                              //直产生中断
       nrf_gpio_pin_toggle(LED);                
    }
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客