博客专栏

EEPW首页>博客> 裸机Timer

裸机Timer

发布人:电子禅石 时间:2017-09-01 来源:工程师 发布文章

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

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

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

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

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

5通过NVIC函数启动MCUtimer中断

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); } }

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



关键词:

相关推荐

技术专区

关闭