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比值進行觸發比較中斷,默認禁用

二、寄存器介紹

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秒進行計時

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章