This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2340R5:如何使用 48M 计时器校准内部 32.768K RTC

Guru**** 2419530 points
Other Parts Discussed in Thread: CC2340R5

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1545317/cc2340r5-how-to-use-48m-timer-to-calibrate-internal-32-768k-rtc

器件型号:CC2340R5


工具/软件:

CC2340R5:32kHz RC 振荡器 (LFOSC) 的准确性 — 蓝牙论坛- BluetoothRegistered︎ — TI E2E 支持论坛

继续讨论链接文章的主题、我使用了外部振荡器 48M 计时器读取 RTC TIME8U 的值。 无论校准时间是 1 秒还是 5 分钟、它都非常接近理想值。 这对我来说很奇怪。 根据 TI FAE 给出的测试报告、内部 32.768K 的 ppm 误差如下所示



根据这些数据、32.768K 的平均 ppm 误差将下降约为–100ppm。 但是、我使用 48M 计时器进行校准。 无论 I 测试多少次、每秒误差值最多有 2 个计数。 因为它是 TIME8U 的值、每秒转换后约为 16us、这与数据不一致。 校准方法如下所示:


/* ----Calibration RTC Timer Initial ---- */
hTimer_RTC = NULL;
LGPTimerLPF3_Params LGPparams_RTC;
LGPTimerLPF3_Params_init(&LGPparams_RTC);
LGPparams_RTC.hwiCallbackFxn = Calibration_RTCTimerCallback;
LGPparams_RTC.prescalerDiv = 48 - 1;
uint32_t counterTarget_RTC;
hTimer_RTC = LGPTimerLPF3_open(CONFIG_LGPTIMER_1, &LGPparams_RTC);
if(hTimer == NULL)
{
// while(1){}
}
counterTarget_RTC = 1000 - 1; // 8ms with a system clock of 48MHz
LGPTimerLPF3_setInitialCounterTarget(hTimer_RTC, counterTarget_RTC, true);
g_tRTC.uiRTC_Calibration_Count = 0;
g_tRTC.uiRTC_Calibration_8us_old = HWREG(RTC_BASE + RTC_O_TIME8U);
LGPTimerLPF3_enableInterrupt(hTimer_RTC, LGPTimerLPF3_INT_TGT);
LGPTimerLPF3_start(hTimer_RTC, LGPTimerLPF3_CTL_MODE_UP_PER);

void Calibration_RTCTimerCallback(LGPTimerLPF3_Handle lgptHandle, LGPTimerLPF3_IntMask interruptMask)
{
    g_tRTC.uiRTC_Calibration_Count++;
    if(g_tRTC.uiRTC_Calibration_Count >= 1000)
    {
        g_tRTC.uiRTC_Calibration_8us = HWREG(RTC_BASE + RTC_O_TIME8U);
        LGPTimerLPF3_disableInterrupt (hTimer_RTC, LGPTimerLPF3_INT_TGT);
        LGPTimerLPF3_stop(hTimer_RTC);
        if(g_tRTC.uiRTC_Calibration_8us < g_tRTC.uiRTC_Calibration_8us_old)
            g_tRTC.iRTC_Calibration_8us_diff = (g_tRTC.uiRTC_Calibration_8us + 0xFFFFFFFF) + g_tRTC.uiRTC_Calibration_8us_old;
        else
            g_tRTC.iRTC_Calibration_8us_diff = g_tRTC.uiRTC_Calibration_8us - g_tRTC.uiRTC_Calibration_8us_old;

        g_tRTC.dRTC_Calibration_perSecond = ((double)g_tRTC.iRTC_Calibration_8us_diff - 125000) * 0.000008;
    }
}

我还确保工程设置中的 syscfg 已正确设置为 LF RCOSC



1.我怀疑当 48M 计时器运行时, RTC 也使用 48M 振荡器运行,导致校准值与数据值之间的差异很大。 换句话说、RTC 实际上等于 48M、因此 RTC 和 48M 的理论值几乎相同

2.是否有办法确保使用 48M 计时器时,RTC 时钟源肯定使用内部 32.768K 振荡器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ryan、

    感谢您再次提出此主题、因为我已经与 TI 驱动程序团队进一步讨论 了 CC2340R5 LFOSC 校准  

    1. 无论是否使用“LFOSC Compensation“、硬件都会在运行时根据 HFOSC/HFXT 校准 LFOSC(除非明确禁用)。
    2. “LFOSC Compensation“功能仅在待机期间适用。 它应该做的是安排额外的“虚拟“唤醒、为此、这些唤醒的频率需要高于系统所需的实际唤醒频率(由您的应用执行)、以便实际在系统唤醒之前捕获任何频率漂移。
    3. 对于 https://e2e.ti.com/f/1/t/1519507 、使用在运行 LFOSC 补偿功能时禁止待机的 LGPT 不会有任何改善、因为器件不会进入待机状态、并且 LFOSC 已经根据 HFXT 进行持续校准(如上面第 1 点所述)。

    因此、您在观察到的 RTC 严格遵循 48M 时钟是正确的、因为 LFOSC 在活动时根据 HFOSC/HFXT 进行校准、这是正确的、因为您在测试中完全使用 LGPT。  通过这种方式、 48M 计时器不能用于校准内部 32.768K RTC、因为它是在活动模式期间由硬件自动执行的、并且必须在待机模式下实现真正的 LFOSC 补偿。  ClockP 模块 (在待机模式下运行) 可用于在返回待机模式 Power_releaseConstraint (PowerLPF3_disallow_standby) 之前安排唤醒、Power_setConstraint (PowerLPF3_disallow_standby) 和延迟(建议 1ms)。  额外的活动周期将产生 LFOSC 精度和功耗之间的权衡。

    此致、
    Ryan