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.

[参考译文] CC2652R7:设置 RTC 值

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1400506/cc2652r7-set-rtc-value

器件型号:CC2652R7

工具与软件:

我目前正在使用 BLE 开发自己的项目。 我的项目主要是 SDK 中的一个"多角色"示例。 但我使用的是 FreeRTOS、而不是 TI-RTOS。
现在一切都正常。
我的问题是、我想​​在程序执行期间更改 RTC 寄存器中的 SEC 寄存器的值。
但我无法正确操作、因为在我写入 SEC 寄存器后、RTC 中的 CH0COMP 寄存器发生了变化。 我不理解这些变化的逻辑。 同时、该器件几乎始终不会在这之后进入空气中。 但是、如果我成功地保持了 SEC 寄存器、会向 CH0CMP 寄存器写入一个或多或少正确的值、我看到器件无线运行。
当器件在无线模式下运行时、我看到 TimerP_SetThreeshold 函数不断被调用、并且 CH0COMP 寄存器已更新。 如果我在 AON_RTC SEC 中设置了自己的值、那么它可能不再被调用。
这很可能是由 osal 系统和 osal_run_system 函数造成的。 我确信 BLE 以某种方式使用了 RTC 模块来实现它。 但目前还没有确切的理解。 请帮助我如何正确更新 RTC SEC 寄存器。 为了使射频部分继续正常工作、还应调用哪些其他函数以及应在何处调用?

P.S.我已经问过一个类似的问题,但我没有找到答案。 有人建议我研究文档、但没有什么可以帮助我的。 我被告知这些寄存器由 TI-RTOS 控制、用户不应触摸它、但我需要做的是。 我确定有可能以某种方式强制正确更新 RTC 寄存器、或者我需要找到证据证明这是不可能的。
感谢您的帮助。

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

    您好!

    感谢您联系我们。 很抱歉、您无法解决上一主题中的问题。 根据您的说明、我猜测 BLE5-Stack 将会利用 RTC 外设并意外修改它可能会导致意外行为。 退后一步、您能否描述您尝试在自己身边实施的内容? 可以使用利用后端中 RTC 的时钟驱动器或计时器驱动程序来实现该目的。

    此致、

    1月

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

    正如所理解的那样RTC 模块关闭电源后并不保存其值因此打开时、0开始计数启动整个系统时更改 SEC 寄存器的值以便指向当前 UNIX 中的实时时间因此正在尝试所需的值写入寄存器

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

    您好、Nick。

    明白了。 感谢您的解释。 您能分享一下如何尝试执行寄存器写入吗? 代码片段会很有帮助。 我可以用它和研发部门讨论如何在运行时正确修改此寄存器。

    此致、

    1月

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

    它会尽可能简单
    我有一个广播器件(GapAdvEnable)的射频器件任务、控制台(shell)有一个任务、通过该任务可处理从键盘输入的命令。 当我输入时间更改命令时、第二个任务简单地调用直接写入 RTC 寄存器。

    HWREG(AON_RTC_BASE + AON_RTC_O_SEC) = sec; 

    我尝试执行代码调用的各种组合

    就像这样

    AONRTCDisable();
    HWREG(AON_RTC_BASE + AON_RTC_O_SEC) = sec;
    AONRTCEnable();

    HWREG(AON_RTC_BASE + AON_RTC_O_SEC) = sec;
    HWREG(AON_RTC_BASE + AON_RTC_O_CH0CMP) = ((sec+5)&0xFFFF)<<16;

    我在更改 RTC_SEC 后尝试从示例调用其中一个函数、因为射频部分的某些操作显然会更改 CH0CMP 寄存器、但我还不了解该逻辑以及如何正确执行它

    osalAdjustTimer(1);
    osalTimeUpdate();
    osalTimerUpdate( sec +1 );
    osal_timer_refTimeUpdate();
    osal_next_timeout();                
    TimerP_dynamicStub(0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我需要 RTC 的原因之一是、我需要一种即使在器件的深度睡眠模式下也能进行时间计数的机制。 从 TRM 来看、它只能是 RTC、GPTimer 也会在该模式下睡眠并且不会工作。 我认为、作为替代方案、您可以使用 UTC_block.c 文件、但重点是静态变量中仅存储一些偏移、该偏移将添加到当前 RTC 值中、我们将获取正确的当前时间。 这是普通解决方案、但我对在计算时间时花在数学运算上的时钟周期不满意。 这就是我之所以要使用 RTC 寄存器更改这么多的原因、因为读取该寄存器需要花费相当长的时间。 总之、在我看来、我可以在代码开始时更改 RTC 时间、之后初始化射频部分并启动 FreeRTOS。 理想情况下、我想了解如何在一般情况下在激活射频部件的情况下可靠地更改 RTC (即使很难看且损坏)、如果我认为没有射频部件工作、我可以安全地更改 RTC 寄存器、我需要了解如何完全停止射频任务、在更改之后、从开始再次启动。 在最坏的情况下、我需要知道的是在使用激活的 RF 部件时、不能以任何方式接触 RTC 寄存器
    Отправить отзыв μ A
    есть результаты с переводом μ A  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    明白了。 感谢您提供更多详细信息。 我已经联系了研发部门、希望下周早些时候能收到他们的回复。 您是否有机会测试您提到的替代提及并验证它是否有效?

    此致、

    1月

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

    你(们)好

    我尝试通过 UTC_BLOCK.c 运行时钟、看起来效果不错。
    但是、我还没有深入研究该模块如何计算睡眠模式后的时间。 我将在下周尝试以同样的方式加以澄清。
    但我认为直接更改 RTC 寄存器仍然是我的优先事项

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

    您好、Nick。

    明白了、我已经与研发专家进行了接洽、正在等待他们的回应。 我希望能在本周早些时候收到他们的反馈。 同时、如果您有任何其他发现、请在本主题中分享、如果可能会有所帮助、我会来看一下、并与研发部门分享。

    此致、

    1月

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

    好的、谢谢
    我将等待您的专家的回复。

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

    您好!

    我已从 R&D 听到过、如果有必要直接修改 RTC 外设、那么他们建议通过以下方式实现逻辑:

    建议的伪代码:

    1. 禁用 RTC (它将停止滴答声)
    2. 计算下一超时的差值
    3. 设置新的 RTC 值
    4. 将新的比较值设置为 RTC + DIFF
    5. 启用 RTC

    但是、在其他任务(例如 BLE5-Stack)访问 RTC 时修改 RTC 可能会导致问题。 如果可能、他们还建议使用一个本地偏移值来记录当前 RTC 时间、而不是直接修改 RTC。

    此致、

    1月

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

    您好!

    "好了,我去洗澡了。

    __STATIC_INLINE void hal_rtc_sec_set_2(unsigned int sec)
    {
        AONRTCDisable();
        uint32_t diff = HWREG(AON_RTC_BASE + AON_RTC_O_CH0CMP) - HWREG(AON_RTC_BASE + AON_RTC_O_TIME);
        HWREG(AON_RTC_BASE + AON_RTC_O_SEC) = sec;
        HWREG(AON_RTC_BASE + AON_RTC_O_CH0CMP) = diff + (uint32_t)((sec&0xFFFF)<<16);
        AONRTCEnable();
    }

    遗憾的是、这会按预期更改寄存器、但仍然会对 BLE 堆栈的运行产生负面影响。
    更改 RTC 寄存器时、我仍然会观察到射频内部有问题。 我想、由于我更改了 RTC 寄存器、现实情况并不符合预期、因此里面的变量中有一些计数器会给出错误的结果

    认为其中一个可能的原因在于 ClockP_workFuncDynamic 函数内。

    有一个变量"距离"、其中写入函数 ClockP_walkQueueDynamic 的结果。
    由于​​RTC 值的变化、我认为这个函数内部执行了不正确的数学计算、并且因此设置了不正确的时序。 因此、整个 BLE 堆栈会停止正常工作。
    我还没有弄清楚这到底是怎么可以绕过的,即使它是一个神奇的技巧。
    您的专家是否有任何建议? 当器件正在工作并通过广播进行广播以及此时我们更改 RTC 值时、他们可以重复该实验吗?

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

    您好!

    明白了。 我专门从 BLE R&D 获得了一些信息、因此建议不要在射频堆栈处于运行状态时设置或复位 RTC、因为它们严重依赖于 RTC。 他们建议改用引用变量。

    此致、

    1月

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

    您好!

    您的团队能否就如何暂停 RF 堆栈、更改 RTC 寄存器、然后重新启动 RF 堆栈给出建议、以便它重新计算时间间隔并能正确工作?
    或者、您是否确认射频堆栈内的所有内容都与 RTC 值直接相关、并且直接对 RTC 的任何影响都可能导致操作错误?

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

    您好!

    要在使用 BLE 时挂起射频堆栈、您将需要停止所有连接并停止所有扫描和广播。 之后、可能会修改 RTC 寄存器、如伪代码中所述。 但是、如果在任何射频操作进行时执行此操作、则可能会导致您所见的错误行为。

    此致、

    1月

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

    你(们)好
    好的、感谢您的帮助。
    我目前没有任何问题、感谢您的帮助。