MCU 使用32768Hz (标称值)方波信号为 RTC 计时。
我还创建了一个计时器、每秒读取 RTC。 问题是、每读5次、会发生什么131072次节拍跳跃? 为什么亚秒值是跳跃的? 还是48MHz xtal / HF 时钟?
请参阅下面的日志
每秒读取一次
公式:sec、subsec、prev_subsec-curry_subsec、计时器值(输入回调时)、计时器值(在回调时读取 AON_RTC:SEC)
t_iv 是计时器节拍 previous_read - curry_read
27 01960000 ss_iv=131072 t_iv=-3 000000ad 000000c5
28 01960000 ss_iv=-1 t_iv=3 000000b0 000000c8
29 01960000 ss_iv=-1 t_iv=2 000000b2 000000ca
2A 01960000 ss_iv=-1 t_iv=-6 000000ad 000000c5
2B 01960000 ss_iv=-1 t_iv=4 000000b1 000000c9
2C 01980000 ss_iv=131072 t_iv=-3 000000af 000000c7
2D 01980000 ss_iv=-1 t_iv=4 000000b3 000000cb
2E 01980000 ss_iv=-1 t_iv=-5 000000af 000000c7
2f 01980000 ss_iv=-1 t_iv=2 000000b1 000000c9
30 01980000 ss_iv=-1 t_iv=-3 000000af 000000c7
31 019a0000 ss_iv=131072 t_iv=-3 000000ad 000000c5
32 019a0000 ss_iv=-1 t_iv=4 000000b1 000000c9
33 019a0000 ss_iv=-1 t_iv=-1 000000b1 000000c9
34 019a0000 ss_iv=-1 t_iv=-1 000000b1 000000c9
35 019a0000 ss_iv=-1 t_iv=-3 000000af 000000c7
36 019c0000 ss_iv=131072 t_iv=-1 000000af 000000c7
每5秒读取一次、现在只记录了131072
41 01a20000 ss_iv=131072 t_iv=1 000000b2 000000ca
46 01a40000 ss_iv=131072 t_iv=-4 000000af 000000c7
4B 01a60000 ss_iv=131072 t_iv=3 000000b2 000000ca
50 01a80000 ss_iv=131072 t_iv=-1 000000b2 000000ca
55 01aa0000 ss_iv=131072 t_iv=-4 000000af 000000c7
5A 01ac0000 ss_iv=131072 t_iv=-1 000000af 000000c7
5f 01ae0000 ss_iv=131072 t_iv=2 000000b1 000000c9
64 01b00000 ss_iv=131072 t_iv=-3 000000af 000000c7
69 01b20000 ss_iv=131072 t_iv=1 000000b0 000000c8
每秒读取一次、LF 时钟在这里使用内部 RC、仍然有这些跳转
16 26ec0000 ss_iv=28573696 t_iv=-5 000000ad 000000c5
17 28a00000 ss_iv=28573696 t_iv=2 000000af 000000c7
18 2a540000 ss_iv=28573696 t_iv=-1 000000af 000000c7
19 2c080000 ss_iv=28573696 t_iv=-1 000000af 000000c7
1A 2dbe0000 ss_iv=28704768 t_iv=-1 000000af 000000c7 <<
1b 2f720000 ss_iv=28573696 t_iv=2 000000b1 000000c9
1C 31260000 ss_iv=28573696 t_iv=-1 000000b1 000000c9
1D 32da0000 ss_iv=28573696 t_iv=-3 000000af 000000c7
这里是中断输入和回调。 日志在主循环中打印。
void ppx_timeout(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
{
static uintptr_t key;
static uint32_t s1;
key = HwiP_disable();
p_tv0 = HWREG(GPT2_BASE + GPT_O_TAV);
do {
p_sec = HWREG(AON_RTC_BASE + AON_RTC_O_SEC);
p_tv1 = HWREG(GPT2_BASE + GPT_O_TAV);
p_subsec = HWREG(AON_RTC_BASE + AON_RTC_O_SUBSEC);
s1 = HWREG(AON_RTC_BASE + AON_RTC_O_SEC);
} while(p_sec != s1);
p_update = 1;
HwiP_restore(key);
}
static void start_tmr_ppx()
{
GPTimerCC26XX_Params ppx_params;
GPTimerCC26XX_Params_init(&ppx_params);
ppx_params.width = GPT_CONFIG_32BIT;
ppx_params.mode = GPT_MODE_PERIODIC_UP; //GPT_MODE_PERIODIC_UP, GPT_MODE_ONESHOT_UP
ppx_params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
ppx_tmr = GPTimerCC26XX_open(CC1352R1_LAUNCHXL_GPTIMER2A, &ppx_params);
GPTimerCC26XX_setLoadValue(ppx_tmr, 0x2DC6BFF); //1.0s
GPTimerCC26XX_start(ppx_tmr);
}