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位,分頻公式:
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秒進行計時