定时器代码说明 参考https://blog.csdn.net/changyourmind/article/details/54019306
1---设置模式 通过 寄存器MODE 设置 0为timer模式【定时】 1为counter模式【计数】
代码
NRF_TIMER3->MODE = TIMER_MODE_MODE_Timer << TIMER_MODE_MODE_Pos;
NRF_TIMER4->MODE = TIMER_MODE_MODE_Timer << TIMER_MODE_MODE_Pos;
0 << 0
2---频率
fTIMER = 16 MHz / (2^PRESCALER)
如果需要timer的时钟为 4M,那么4 = Ftimer = 16M/2^2
代码
NRF_TIMER3->PRESCALER = 0x05 << TIMER_PRESCALER_PRESCALER_Pos; ///< 0.5 MHz
5 << 0
那就是16/2的5次方 =1/2 所以就是0.5M
NRF_TIMER4->PRESCALER = 0x02 << TIMER_PRESCALER_PRESCALER_Pos; ///< 4 MHz
2 << 0
那就是16/2的2次方 =4 所以就是4M
那么是怎么配置成16M的呢?
解答1 我们原理图右上角 是外接的32M晶振
解答2 https://www.cnblogs.com/libra13179/p/6756856.html
注意文件 system_nrf52840
void SystemInit(void)
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;//HFCLK晶振运行状态标志位 0关闭,1运行
NRF_CLOCK->TASKS_HFCLKSTART = 1;//高外晶振HFCLK 0关闭,1启动
while(!NRF_CLOCK->EVENTS_HFCLKSTARTED);//等待HFCLK晶振运行状态标志位 为1
3---
设置cc[n]寄存器的值,定时就是通过这个值来设置的。
案例:1M的时钟源则一个tick为1us,所以要定时1s,则cc[0]的值我们填入 1000000就行了。
(这里也可以选择cc[1],cc[2],或cc[3],只要下面对应的compare事件产生中断设置成对应的就可以了)
4
通过寄存器INTENSET 第16bit位设置compare[0]事件产生时触发中断。
5
通过NVIC的功能函数NVIC_EnableIRQ 来使能MCU的Timer0中断
6
最后通过Timer/Counter模块的 START 启动timer。
我的测试时OK的
void TIMER3_IRQHandler(void){
if(NRF_TIMER3->EVENTS_COMPARE[0]==1)
{
NRF_TIMER3->EVENTS_COMPARE[0] = 0;
nrf_gpio_pin_toggle(25);
NRF_LOG_INFO("TIMER2_IRQHandler.\r\n");
}
}
void time_test_1s(void)
{
//NRF_TIMER0定义在nrf51.h中,该指针指向timer0中的寄存器组
NRF_TIMER3->PRESCALER = 4; //2^4 16分频得到1M timer时钟
NRF_TIMER3->MODE = 0; //timer模式
NRF_TIMER3->BITMODE = 3; // 设置32bit
NRF_TIMER3->CC[0] = 1000000; //一个tick是1us,1000000代表1s
NRF_TIMER3->INTENSET = 1<<16;//设置compare[0]事件产生时触发中断
//该设置使timer模块中的conter计数到cc[0]值时会自动清零,以带到重//新计数的目的
NRF_TIMER3->SHORTS = 1;
//启动timer模块
NRF_TIMER3->TASKS_START = 1;
//开启MCU的timer0中断
NVIC_SetPriority(TIMER3_IRQn, 2);
NVIC_ClearPendingIRQ(TIMER3_IRQn);
NVIC_EnableIRQ(TIMER3_IRQn);
nrf_gpio_cfg_output(25);
}
问题1 我们外接的32M怎么体现?
问题2 那个system_nrf52840里面的64怎么体现
看上去全部是16M计算的!!!!
当修改多个比较值时候
修改如下
NRF_TIMER3->CC[0] = 5000000;
NRF_TIMER3->CC[1] = 1000000;
NRF_TIMER3->CC[2] = 2000000;
NRF_TIMER3->CC[3] = 3000000;
NRF_TIMER3->CC[4] = 4000000;
//NRF_TIMER3->INTENSET = 1<<16;//设置compare[0]事件产生时触发中断
NRF_TIMER3->INTENSET = 1<<17|1<<18|1<<19|1<<20;//设置compare[1-2-3-4]事件
//TIMER_INTENSET_COMPARE1_Msk | TIMER_INTENSET_COMPARE2_Msk | TIMER_INTENSET_COMPARE3_Msk | TIMER_INTENSET_COMPARE4_Msk;
【0】是里面最大的 后面一次增大
没1S中断一次