硬定时器0

定时器代码说明 参考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中断一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值