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.

[参考译文] CC1314R10:使用自定义值设置 RTC。 -在 SDK 中找不到驱动程序代码仅提供复位。

Guru**** 2609895 points
Other Parts Discussed in Thread: CC1314R10

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1576680/cc1314r10-setting-rtc-with-custom-value---no-driver-code-found-in-sdk-only-reset-is-provided

器件型号:CC1314R10


工具/软件:

尊敬的团队:
      CC1314 70 位 RTC 也在这里。 我想把它用于我的产品(我假设它可以计数到数年 — 在 32K 晶体上运行 70 位)。 所以我尝试初始化、设置、重置和读取 RTC。
首先、我在 SimpleLink SDK 上找不到任何示例。 我阅读了一些 e2e 主题并找到了这个文件 aon_rtc.h  
< https://software-dl.ti.com/simplelink/esd/simplelink_cc13x0_sdk/4.10.00.10/exports/docs/driverlib_cc13xx_cc26xx/cc13x0/driverlib/group__aonrtc__api.html>

其中包含一些 API 并且与参考手册相匹配。  


但是、我想知道它没有 RTC  迭代 API、它只有 复位 将设置控制寄存器上的复位位。

我的问题是、
 我们是否可以在 CC1314R10 的运行期间使用自定义值设置 RTC?  
如下所示、

void RTC_SET_TIME (uint32_t new_sec、uint32_t new_subsec)

//停止 RTC
AONRTCDisable ();

//直接写入 RTC 寄存器
HWREG (AON_RTC_BASE + AON_RTC_O_SEC)= NEW_sec;
HWREG (AON_RTC_BASE + AON_RTC_O_subsec)= NEW_subsec;

//再次启动 RTC
AONRTCSenable ();
}




另外、我理解手册中的内容 如果我们单独使用 RTC 计时、则无需通道配置。 使用事件时、需要启用四个通道、  

“我的理解是正确的吗?  


此致、
Muniyappan R.M.

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

    您好:  

    从另一个 E2E 上、他们推荐了类似这样的内容、但如果您正在积极使用无线电或使用 BLE 栈、我建议不要修改 RTC、因为它们都取决于来自 RTC 的特定时序、如果修改、可能会导致问题。  

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

    谢谢、
    Alex F

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

    您好 Alex、

    感谢您的回复。

    我将首先清楚地解释我的产品用例。

    我们是构建无线传感器和网关模型。 在这种情况下、多个传感器将连接到一个网关、所有传感器通常处于睡眠状态、当其报告时间结束时、它们将从睡眠状态唤醒并将数据传输到网关。 网关将是一名活跃的网络管理器、并将持续侦听。 所以网关将拥有网络时间、所有传感器都应同时使用。
    当传感器加入或重新加入网络时、网关将传输网络时间(即其 RTC 时间)、加入的传感器应将此值配置为其 RTC。

    因此,我需要设置传感器的 RTC 每当它加入网络(在最坏的情况下,我可能会重新同步我的网络时间)。


    根据您的回答、

    如果您正在积极使用无线电或使用 BLE 栈、我建议不要修改 RTC、因为它们都取决于来自 RTC 的特定时序、如果修改、会导致问题。  [/报价]

    在我的用例中、我也将使用无线电。 那么、您能帮我实现我的要求吗? (我可以关闭无线电并更新 RTC 并将其打开吗?)

    此外、我对您共享的代码有一些疑问、

    My Init , write and read APIs are as follows,
    
    void rtc_init(void)
    {
    // Make sure RTC is off before config
    AONRTCDisable();
    AONRTCReset();
    SysCtrlAonSync(); // wait for reset done
    
    // Enable RTC module
    AONRTCEnable();
    SysCtrlAonSync(); // ensure enable applied
    }
    
    void rtc_set_time(uint32_t new_sec, uint32_t new_subsec)
    {
    // Stop RTC
    AONRTCDisable();
    SysCtrlAonSync();
    
    // Write directly to RTC registers
    HWREG(AON_RTC_BASE + AON_RTC_O_SEC) = new_sec;
    HWREG(AON_RTC_BASE + AON_RTC_O_SUBSEC) = new_subsec;
     SysCtrlAonSync();
    
    // Start RTC again
    AONRTCEnable();
    SysCtrlAonSync(); //ensure RTC start takes effect
    }
    
    uint32_t rtc_read_ms(void)
    {
    uint32_t sec = AONRTCSecGet();
    uint32_t subsec = AONRTCFractionGet();
    
    // Convert 32-bit subsecond to milliseconds
    uint32_t msec = (uint32_t)(((uint64_t)subsec * 1000ULL) >> 32);
    
    return (sec * 1000 + msec);
    }




    但在您的共享代码中、您正在比较当前时间和通道 0 比较值、为什么会这样?

    __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)=秒;
    HWREG (AON_RTC_BASE + AON_RTC_O_CH0CMP)= DIFF +(uint32_t)((sec&0xFFFF)<<16);
    AONRTCSenable ();
    }


    ***正如我在我的问题中已经问过的

    也可以从手册中了解 如果我们单独使用 RTC 计时、则无需通道配置。 使用事件时、需要启用四个通道、  
    [/报价]

    那么我还需要启用通道 0 吗?


    很抱歉问过多问题、请帮助我了解此 RTC 功能。
    提前感谢。

    此致、
    Muniyappan R.M.

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

    你好 Muniyappan R.M

    在我的使用案例中、我也将使用对讲机。 那么、您能帮我实现我的要求吗? (我可以关闭无线电并更新 RTC 并将其打开吗?)

    我建议关闭无线电(并确保所有命令均已完成)、然后在再次启动无线电之前更新 RTC。  

    我所提交的代码取自另一个 E2E、我有一个旧版关于 RTC 的回复:

    有几种方法可以操作 RTC、我建议使用由 驱动程序库定义的函数  共模输入。  驱动程序库资源提供了许多在操作 RTC 时会很有帮助的函数。  

    E2E 上还有一些其他主题讨论了 RTC 的使用:

    看门狗复位时的 RTC 时间复位 — Bluetooth 论坛 — BluetoothRegistered︎ — TI E2E 支持论坛

    CC2642R-Q1:cc2642 RTC 外设 — 蓝牙论坛- BluetoothRegistered︎ — TI E2E 支持论坛

    我建议您使用全局变量  来计算父设备 RTC 与子设备 RTC 的当前时间的“偏移“或增量,然后使用 AONRTCSecGet () 来计算该增量并存储在应用程序中使用的本地时间。

    谢谢、
    Alex F

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

    您好 Alex、

    感谢您的回复。

    我会执行这个操作。  

    [引述 userid=“567427" url="“ url="~“~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1576680/cc1314r10-setting-rtc-with-custom-value---no-driver-code-found-in-sdk-only-reset-is-provided/6076863

    我建议关闭无线电(并确保所有命令均已完成)、然后在再次启动无线电之前更新 RTC。  

    [/报价]


    我提到了以下内容、它与我共享的链接相同(两者都没有 RTC 集 API) 。

    有几种方法可以操作 RTC、我建议使用 驱动程序库定义的函数  共模输入。  驱动程序库资源提供了许多在操作 RTC
    时会很有用的函数



    另外、感谢您对使用失调电压的建议。 但我们可能更喜欢根据网关的当前网络时间重新配置传感器器件的 RTC、以便它在根据当前网络时间实现跳频时很有用。
    我已经实施了 RTC_SET_TIME () 我共享的 API、它正在运行。  

    作为我问题的延伸、如果您有时间、 请帮我实施 使用 RTC 事件实现睡眠和唤醒?

    到目前为止、我已经在 RTC 通道上配置了事件;现在我要实现待机模式并将唤醒源设置为 RTC 事件和唤醒。

    我想 SDK 中没有有关待机模式的示例、我 找到了一些 E2E 主题、
    CCS/CC1310:如何设置待机模式并从 RTC 唤醒? 

     RTOS/CC1310:待机模式和由 RTC 唤醒 

    但我想它们都没有配置 RTC 事件。 您能帮我实现目标吗 待机模式并使用 RTC 事件唤醒


    谢谢。此致、
    Muniyappan R M.

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

    你好 Muniyappan R M.

    我想问一下、此处您是否使用 TI-RTOS、原因是使用 RTC 也会影响 TI-RTOS 事件。  

    接下来、在 RTC 唤醒时应该可以实现、但还有其他方法可以实现、请参阅以下讨论 RTC 的线程:

    (+) RTOS/CC1310:CC1310:如何通过计时器(RTC)每 8ms 从待机状态唤醒 — Sub-1 GHz 论坛 — Sub-1 GHz - TI E2E 支持论坛

    大多数情况下、我建议客户使用时钟驱动程序来生成睡眠周期并安排唤醒。  

    谢谢、
    Alex F

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

    您好 Alex、

    感谢您的回答。  
     

    [引述 userid=“567427" url="“ url="~“~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1576680/cc1314r10-setting-rtc-with-custom-value---no-driver-code-found-in-sdk-only-reset-is-provided/6081916

    我想问一下、此处您是否使用 TI-RTOS、原因是使用 RTC 也会影响 TI-RTOS 事件。  

    [/报价]

    我们使用的是 FreeRTOS、而不是 TI-RTOS。 那么操作 RTC 是否安全? 。 (我希望 FreeRTOS 计时器不基于 RTC 计时器。)

    [引述 userid=“567427" url="“ url="~“~/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1576680/cc1314r10-setting-rtc-with-custom-value---no-driver-code-found-in-sdk-only-reset-is-provided/6081916

    大多数情况下、我建议客户使用时钟驱动程序来生成睡眠周期并安排唤醒。  

    [/报价]

    在本例中、睡眠周期 可以变高、例如 1 小时、4 小时甚至 12 小时(取决于用户)。

    所以 使用时钟驱动器、我能否实现这一点? (也使用 FreeRTOS)


    此致、
    Muniyappan R M.

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

    你好  Muniyappan R M.

    根据 TRM、我们应该能够使用 GPT(通用计时器)或 SysTick。 为了这个长睡眠问题的目的、我将在此处研究 GPT。  

    GPT 最多可配置为 32 位一次性/周期计时器、如果我的数学计算正确、我们可以存储在其中大约 18 小时(假设其计数速率为 32kHz)。

    CC13x4、CC26x4 SimpleLinkTm 无线 MCU 技术参考手册

    因此、您应该能够使用 GPT 创建 1-4-12 小时的长睡眠周期。

    谢谢、
    Alex F

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

    您好 Alex、

    感谢您的宝贵见解。

    总之、我将根据网络时间配置 RTC、并在关闭无线电操作后在 RTC 上设置时间(不过,您的建议是在应用程序上保留偏移变量,并将其与 RTC 时间值相加/相减)
    对于待机模式唤醒、我们可以使用 GPT 计时器。

    **虽然我已经使用 RTC 通道 0 比较值测试了待机模式唤醒。 如果有人需要、他们可以参考它。

    #include “ti_drivers_config.h"</s>“
    #include
    #include DeviceFamily_constructPath (driverlib/aon_rtc.h)
    #include DeviceFamily_constructPath (driverlib/sys_ctrl.h)
    #include DeviceFamily_constructPath (driverlib/aon_event.h)
    #include DeviceFamily_constructPath (driverlib/event.h)
    #include DeviceFamily_constructPath (inc/hw_types.h)
    #include DeviceFamily_constructPath (inc/hw_aon_rtc.h)
    #include DeviceFamily_constructPath (inc/hw_memmap.h)
    #include DeviceFamily_constructPath (driverlib/interrupt.h)
    #include DeviceFamily_constructPath (driverlib/gpio.h)

    #include
    #include

    #define FACT_SEC_TO_COMP_VAL_FORMAT 0x00010000


    //==================== 全局变量====================
    易失性 uint32_t RTC_ch0_wakeup_int = 0;
    易失性 uint32_t RTC_LOOP_COUNT = 0;

    //==================== RTC ISR ====================
    void RTC_ISR (void)

    IF (AONRTCEventGet (AON_RTC_CH0))

    AONRTCeventClear (AON_RTC_CH0);
    RTC_ch0_wakeup_int++;
    GPIO_TOGGLE (CONFIG_GPIO_GLED);//在 WAKE 时调试 LED 切换
    }
    }

    //==================== RTC 初始化====================
    void RTC_INIT_CH0_WAKEUP (void)

    //在配置前禁用+ RESET
    AONRTCDisable ();
    AONRTCReset();
    SysCtrlAonSync();

    //启用 RTC 通道 0(比较模式)
    AONRTCChannelEnable (AON_RTC_CH0);

    //将 CH0 路由至唤醒事件
    /* Muni — 配置多个 RTC 通道时无效。
    *、即、如果我们配置 RTC CH2、则 MCU 也会针对 CH2 事件从待机模式唤醒
    **/
    AONEventMcuWakeUpSet (AON_EVENT_MCU_WU0、AON_EVENT_RTC_CH0);

    //映射组合中断(用于 CH0)
    IntRegister (INT_AON_RTC_COMB、RTC_ISR);
    IntEnable (INT_AON_RTC_COMB);
    IntMasterEnable();

    //仅 CH0 应触发组合事件(和唤醒)
    /*Muni — 由于我们只配置了一个 RTC 通道、因此目前不需要此功能。
    *如果您已经配置了其他一些 RTC 信道,那么我们可以明确设置组合事件,以确保基于我们所需的信道事件进行唤醒*/
    //AONRTCCombinedEventConfig (AON_RTC_CH0);

    //启用 RTC
    AONRTCSenable ();
    SysCtrlAonSync();
    }

    //==================== 进入待机状态“leep_seconds"================“================
    void enter_standby_for (uint32_t sleep_seconds)

    uint32_t CURRENT_TIME = AONRTCCurrentCompareValueGet ();

    //安排 CH0 比较前面的“leep_seconds"</s>“
    AONRTCCompareValueSet (AON_RTC_CH0、CURRENT_TIME +(SLEEP_seconds * FACTOR_COMP_VAL_FORMAT));
    AONRTCeventClear (AON_RTC_CH0);

    //可选:关闭 LED(以避免电流消耗)
    GPIO_WRITE (CONFIG_GPIO_RLED、0);
    GPIO_WRITE (CONFIG_GPIO_GLED、0);

    //进入待机(深度睡眠)
    POWER_SLEEP (PowerCC26XX_STANDBY);

    //唤醒后、执行在此处恢复
    }

    //==================== 主事件循环======================
    void RTC_TEST_EVENT_LOOP (void)

    rtc_init_ch0_wakeup ();

    while (1)

    RTC_LOOP_COUNT++;

    //正常睡眠持续时间= 60 秒(1 分钟)
    uint32_t SLEEP_DURATION_sec = 600/10;

    GPIO_WRITE (CONFIG_GPIO_RLED、1);
    睡眠 (2);
    GPIO_WRITE (CONFIG_GPIO_RLED、0);

    //进入待机模式进行下一次唤醒
    Enter_STANDBY_for (SLEEP_DURATION_sec);
    }
    }

    谢谢 Alex、谢谢您的持续支持。

    此致、
    Muniyappan R.M.