Nordic52810入门篇 - 实时时钟(RTC)

RTC-24位实时时钟计数器,RTC模块使用低频时钟LCFK,52810有两个RTC模块 RTC0与RTC1

声明:蓝牙协议栈使能后将会使用RTC0;APP_TIMER库使用的是RTC1,所以当APP_TIMER组件使能后,RTC1不可以直接使用

一、原理框图

如下图,左边是开始START、停止STOP、清除CLEAR、触发TRIG 任务,右边可触发三种事件(回调中断)

  • TICK滴答事件:计数器COUNTER每计数一次会进行事件回调(中断),COUNTER计数值累加1,默认禁用

  • OVRFLW溢出事件:计数器COUNTER计数值溢出后触发(0xFFFFFF:16777215),默认禁用

  • COMPARE比较事件:通过设置CC寄存器与COUNTER比值进行触发比较中断,默认禁用

Nordic52810入门篇 - 实时时钟(RTC)_第1张图片

二、寄存器介绍

Nordic52810入门篇 - 实时时钟(RTC)_第2张图片

COUNTER(0x504):计数值寄存器,可读取当前计数值

PRESCALER(0x508):分频寄存器,12位,分频公式:fRTC [kHz] = 32.768 / (PRESCALER + 1 )

CC[0-3](0x540-0x54C):比较寄存器,计数器的数值和CC的相同时,会触发事件或中断

三、总结

由于LZ没有进行裸跑,基于S112的协议栈运行的,而使用任务事件回调的方式多多少少会有us级别的误差;蓝牙协议栈使能后RTC0的COUNTER计数器以30.517us分辨率计数,则每次通过读取COUNTER寄存器的值进行计时;由于COUNTER是24位,溢出值为16777215*30.517us = 512秒,溢出后进行进位

贴上代码

int main(void)
{

    // Initialize.
    ble_stack_init();

    while(1)
    {
        SEGGER_RTT_printf(0,"RTC0 Time = %d\r\n",(NRF_RTC0->COUNTER)>>15);
        nrf_delay_ms(1000);
    }
    return 0;
}

打印出来的也是1秒进行计时

Nordic52810入门篇 - 实时时钟(RTC)_第3张图片

 

你可能感兴趣的:(蓝牙BLE)