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.

[参考译文] CC1352P:读取 AON_RTC SEC 和亚秒

Guru**** 2485235 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1186373/cc1352p-reading-aon_rtc-sec-and-subsec

器件型号:CC1352P

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);
}

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

    尊敬的 Aki:

    您使用的是哪个版本的 SimpleLink SDK?

    谢谢、

    玛丽·H

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

    simplelink_cc13x2_26x2_SDK_4_20_00_35
    simplelink_cc13x2_26x2_SDK_4_40_04_04

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

    尊敬的 Aki:

    看起来、另一个驱动程序可能正在使用 RTC 时钟、从而覆盖您的设置。

    如何输出32768Hz 时钟? 通过 PWM、还是使用 CLK32KCTL 寄存器直接输出 SCLK_LF?

    此致、

    Arthur

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

    32kHz 时钟信号来自外部 RTCC 芯片、该信号驱动 CC1352的 AON_RTC

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

    我的32kHz 时钟实际上是32768.222Hz、如果我将 SUBSECINC 更改为与该值2^38/32768.222=0x7fffc7匹配、那么 AON_RTC 将给出以下读数:

    sec, subsec, subsec-prev_subsec
    399 02ddf062 ss_iv=-29185
    39A 02df7e61 ss_iv=101887
    39b 02df0c61 ss_iv=-29185
    39C 02de9a61 ss_iv=-29185
    39D 02de2861 ss_iv=-29185
    39E 02ddb661 ss_iv=-29185
    39F 02df4460 ss_iv=101887
    3a0 02ded260 ss_iv=-29185
    3A1 02de6060 ss_iv=-29185
    3A2 02ddee60 ss_iv=-29185

    现在亚秒寄存器滞后、然后每五秒执行一次"校正"跳转。

    我不知道这是否只是巧合,但这些亚秒间隔(101887+4*-29185)的总和是-3.46us,即-0.7ppm,非常好。
    与原始(subsecinc 0x800000)相比较、总和为每5秒30us (131072+4*0)、这意味着6ppm 误差、与32768.222Hz (6.77ppm)匹配。

    但为什么亚秒寄存器更新不连续?

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

    尊敬的 Aki:

    《CC1352技术参考手册》(swcu185、第1374页)的第16.2.2章规定、为了访问 subsec 寄存器、您已经在执行该操作。 但是、我觉得我们缺少了一些东西。

    您是否尝试过使用 Driverlib 函数库来控制 RTC? https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_6_40_00_13/docs/driverlib_cc13xx_cc26xx/cc13x2_cc26x2/driverlib/group__aonrtc__api.html

    如果是、您是否观察到相同的行为?

    我提出这一要求是因为 Driverlib 可能会有一些额外的处理来防止这种不连续性。

    此外、您是否正在使用任何其他驱动程序、例如电源驱动程序?

    此致、

    Arthur

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

    我修改了计时器回调以使用 AONRTCCurrent64BitValueGet (),没有变化

    void ppx_timeout(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
    {
      static uintptr_t key;
    
      key = HwiP_disable();
    
      uint64_t rtc_time = AONRTCCurrent64BitValueGet();
      p_subsec = rtc_time;
      p_sec = rtc_time >> 32;
    
      p_update = 1;
    
      HwiP_restore(key);
    }

    Powerconfig 就是这样

    const PowerCC26X2_Config PowerCC26X2_config = {
        .enablePolicy             = false,
        .policyInitFxn            = NULL,
        .policyFxn                = PowerCC26XX_standbyPolicy,
        .calibrateFxn             = PowerCC26XX_noCalibrate,
        .calibrateRCOSC_LF        = false,
        .calibrateRCOSC_HF        = false,
        .enableTCXOFxn            = NULL
    };

    使用的其他驱动程序包括:rf、uart、gptimer、dma、aescbc、 Aecctr、Trng、安全装置和 PWM。
    NoRTOS 和应用程序永远不会休眠/闲置、只是一个 while 循环轮询并对中断标志和调用状态机做出反应。
    使用 gcc-arm-none-eabi-9-2020-Q2-update 编译

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

    使用"sysGetRtcValue (output.rtcsec、output.rtcsubsec)"从 SCE 读取时、RTC 亚秒也会提供不连续值。
    使用 timer2+事件每250ms 执行一次读取、timer2由 xosc_HF 计时

    6 a629
    6 e629 (两个读数之间精确的差值250ms)
    7 2627 (此处的差分跳转两次、达到249.954 223 6毫秒)
    7 6627 (同样精确为250ms)
    7 A627 (此处为250ms)
    7 e627 (相同)
    8 2625 (此处再次跳转、两个节拍、249.954 223 6 msec)
    8 6625 (250ms)
    8a625 (250ms)
    8 e625 (250ms)
    9 2623 (249.954 223 6毫秒)
    9 6623 (250ms)

    有什么想法在发生什么? 为什么亚秒要跳两个单位? 例如、亚秒值0xe628、0x2626在哪里?
    此测试是在库存 LAUNCHXL-CC1352P-2上执行的、使用 NoRtos/GCC/simplelink_cc13xx_cc26xx_sdk_6_40_00_13 uart2echo-example 作为基础

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

    您好!

    您是否熟悉以下内容:

    By default, the AON_RTC increments its counter with 1/32768 seconds each 32-kHz clock tick. A
    subsecond increment value of 0x20 000 corresponds to 1/32768 seconds. Increasing or decreasing the
    subsecond increments value increases or decreases the speed of the AON_RTC by the same amount.

    此致、

    Dimitar

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

    谢谢、Dimitar

    因此、虽然亚秒寄存器分辨率为0.2ns、但它仅每30.5us 更新一次。
    如果我在一个时间 t 读取 RTC、那么再说一次 t+20us (xosc_HF 时间)、我可能会得到相同的值。 我还可能得到大于30.5us 的值、具体取决于在20us 暂停期间是否发生0x20000边沿。

    两次读取之间暂停20us
    3d.ffd4c8f0 3d.ffd4c8f0 (相同)
    3e.ffd2c8f0 3e.ffd4c8f0 (在20us 延迟期间、第二个值增加0x20000/30.5us)
    3f.ffd2c8f0 3f.ffd4c8f0 (在20us 延迟期间、第二个值增加0x20000/30.5us)
    40.ffd2c8f0 40.ffd2c8f0 (相同)

    读取之间暂停40us、0x20000边沿肯定会在该时间内发生、第二个值始终大于0x20000 (30.5us)
    C.fffa2cec c.fffc2cec
    D.fff82cec d.fffc2cec
    e.fff82cec e.fffa2cec
    F.fff82cec f.fffa2cec

    这说明了我的 RTC 读取间隔跳跃的原因

    2b1.fe04c8f0 iv=1.00000000
    2b2.fe02c8f0 iv=0.fffe0000
    2b3.fe02c8f0 iv=1.00000000
    2B4.fe00c8f0 iv=0.fffe0000
    2B5.fe00c8f0 iv=1.00000000


    5cc.fedc9def iv=0.fffeafff (20us 简短描述)
    5cd.fedd4def iv=1.0000b000 (10us 长)
    5ce.feddfdef iv=1.0000b000 (10us 长)
    5cf.fedced iv=0.fffeaffe (20us 简短描述)
    5d0.fedd5ded iv=1.0000b000 (10us 长)