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.

[参考译文] LP-EM-CC2340R5:RTS 计时器:由 RTC 计时器从待机模式唤醒

Guru**** 2560390 points
Other Parts Discussed in Thread: CC2340R5, SYSCONFIG

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

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/1442276/lp-em-cc2340r5-rts-timer-waking-up-from-standby-by-rtc-timer

器件型号:LP-EM-CC2340R5
主题中讨论的其他器件:CC2340R5SysConfig

工具与软件:

下午好!
我使用 cc2340r5和 simplelink_lowpower_f3_sdk_8_10_01_02。
我的程序基于 basic_ble 并进行了一些逻辑修改。 一段时间后、我停止扫描网络、关闭所有外设、然后根据电源策略切换到待机模式(这可以通过能量跟踪看到)。
现在、让我们继续讨论主要问题:能否创建 RTC 计时器并使用它使器件退出待机模式?

是否有将 RTC 计时器设置为某处的示例? 

此致、Vadim。

 

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

    您好、 Vadim、

    我希望你做得好。 我们可以 在此处利用 ClockP 模块来实现低功耗计时器解决方案!  

    或者、我们还有一些实现类似解决方案的旧文章:

    https://e2e.ti.com/f/1/t/1234806/ (RTC 警报)

    https://e2e.ti.com/f/1/t/1327187/ (如何在基本 BLE 应用中配置为待机模式并从 RTC 唤醒)

    谢谢!
    Alex F

     

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

    您好 Alex。

    我尝试使用 ClockP 退出待机模式。 但它不起作用、计时器未被调用。 如果我正确理解了文档、那么在 FreeRTOS 中、该计时器将作为优先的服务计时器工作。

    "使用 FreeRTOS 时、ClockP 函数要么由应用配置的优先级的计时器服务任务运行、要么直接在硬件中断中运行、具体取决于器件平台。"


    前面的讨论提到了 LGPTimer、但它不能在待机模式下完成、因为计时器阻止了该模式

        /* Set constraint to disallow standby while running */
        Power_setConstraint(PowerLPF3_DISALLOW_STANDBY);



    那么、一个正确的选项是按照驱动程序/系统时间戳示例中所示记录 HWREG 和中断?

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

    UPD。   我尝试配置 SYSTEM,但这也不起作用。 可能是我做错了什么。

    #define SYSTIM_PERIOD_MS 2000
    #define SYSTIM_FREQ 32768  // Frequency 32.768 kHz for timer SYSTIM
    HwiP_Struct systimHwi;
    
    // Interrupt handler for SYSTIM
    void systimInterruptHandler(uintptr_t arg) {
        // Check if the interrupt from channel 0 worked
        if (HWREG(SYSTIM_BASE + SYSTIM_O_OUT) & SYSTIM_OUT_OUT0) {
            // Clear the interrupt
            HWREG(SYSTIM_BASE + SYSTIM_O_OUT) |= SYSTIM_OUT_OUT0;  // Clear the event
    
            // Timer has expired, executing your code
            // For example, stopping a timer
            HWREG(SYSTIM_BASE + SYSTIM_O_CH0CFG) &= ~(1 << 1);  // Disable the timer
    
            GPIO_toggle(CONFIG_GPIO_LED_RED);
        }
    }
    
    void systimTimerInit(void) {
        uint32_t timer_value =
            SYSTIM_PERIOD_MS *
            (SYSTIM_FREQ / 1000);  // Conversion to the number of clocks (timer clocks)
    
        // Setting the timer period (value in clocks)
        HWREG(SYSTIM_BASE + SYSTIM_O_CH0CC) = timer_value;
    
        // Configuration of the SYSTIM channel to work in countdown mode
        // Enable channel, timer in countdown mode (Count-down)
        HWREG(SYSTIM_BASE + SYSTIM_O_CH0CFG) =
            (SYSTIM_CH0CFG_MODE_CAPT |  // Timer mode: Capture
             SYSTIM_CH0CFG_INP_RISE |   // Capture on the rising edge (you can choose FALL or BOTH)
             SYSTIM_CH0CFG_REARM_DIS |  // Disabling continuous capture (One-shot mode)
             SYSTIM_CH0CFG_RES_US);  // 1 µs resolution (can be changed to SYSTIM_CH0CFG_RES_NS for 250
                                     // ns)
    
        // Initialize interrupt for SYSTIM channel 0
        HwiP_construct(&systimHwi, INT_CPUIRQ0, systimInterruptHandler, NULL);
        HwiP_enableInterrupt(INT_CPUIRQ0);  // Enable interrupt
    
        // Start timer
        HWREG(SYSTIM_BASE + SYSTIM_O_CH0CFG) |=
            SYSTIM_CH0CFG_MODE_CAPT;  // Enable the timer channel to run
    
        // Reset timer event
        HWREG(SYSTIM_BASE + SYSTIM_O_OUT) &= ~SYSTIM_OUT_OUT0;
        // Clear channel 0 event
    }

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

    UPD。
    关于 ClockP,我看到了一个奇怪的结果,它没有从睡眠后的计划时间,但后来它做了,在这里我不明白是什么原因造成了它。 也许时间计算不正确,也许不是计时器唤醒了他的所有。

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

    UPD。

    因此、我确信器件没有因为计时器而唤醒、因为我没有进入计时器的回调函数。  
    大约20分钟后、唤醒 LED 会亮起、如我的 PowerLPF3_WAKE_STANDBY 事件处理程序中所指示。 但还有其他的行动、我没有看到它们的执行情况、我会进行额外的检查

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

    UPD。  
    我也尝试过在 RTC 上实施定时器、但在我看来、它的实施还是犯了一个错误。

    #define RTC_PERIOD_MS 3000
    #define RTC_FREQ 32768  // Frequency 32.768 kHz for timer SYSTIM
    HwiP_Struct rtcHwi;
    
    void rtcInterruptHandler(uintptr_t arg) {
        if (HWREG(RTC_BASE + RTC_O_RIS) & RTC_RIS_EV0) {
            HWREG(RTC_BASE + RTC_O_ICLR) |= RTC_RIS_EV0;
    
            GPIO_toggle(CONFIG_GPIO_LED_GREEN);
            HWREG(RTC_BASE + RTC_O_CTL) |= RTC_CTL_RST;
        }
    }
    
    void rtcInit(void) {
        uint32_t rtc_interval = RTC_PERIOD_MS * (RTC_FREQ / 1000);
    
        HWREG(RTC_BASE + RTC_O_CH0CC8U) = rtc_interval;
    
        HWREG(RTC_BASE + RTC_O_IMASK) |= RTC_RIS_EV0;
    
    
        HwiP_construct(&rtcHwi, INT_CPUIRQ0, rtcInterruptHandler, NULL);
        HwiP_enableInterrupt(INT_CPUIRQ0);
    
        HWREG(RTC_BASE + RTC_O_CTL) |= RTC_CTL_RST;
        HWREG(RTC_BASE + RTC_O_CTL) &= ~RTC_CTL_RST;
    }

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

    您好、Vadim、

    正如您所说的、在这种情况下、SYSTEM"SYSTIM 遵循 RTC (第12章)、只能在器件处于运行状态时使用"似乎无法正常工作。  

    一个有关通过 GPIO 从待机状态唤醒的主题: https://e2e.ti.com/f/1/t/1322974/

    以下主题中有关 RTC https://e2e.ti.com/f/1/t/1353182/的 RTC 代码片段。  

    谢谢!
    Alex F

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

    Alex、您好!

    #define RTC_PERIOD_MS 3000
    #define RTC_FREQ 31250  // 31.25 kHz
    HwiP_Struct rtcHwi;
    
    void rtcInterruptHandler(uintptr_t arg) {
        if (HWREG(RTC_BASE + RTC_O_RIS) & RTC_RIS_EV0) {
            HWREG(RTC_BASE + RTC_O_ICLR) |= RTC_RIS_EV0;
    
            GPIO_toggle(CONFIG_GPIO_LED_GREEN);
            HWREG(RTC_BASE + RTC_O_CTL) |= RTC_CTL_RST;
        }
    }
    
    void rtcInit(void) {
        uint32_t rtc_interval = RTC_PERIOD_MS * (RTC_FREQ / 1000);
    
        HWREG(RTC_BASE + RTC_O_CH0CC8U) = rtc_interval;
    
        HWREG(RTC_BASE + RTC_O_IMASK) |= RTC_RIS_EV0;
    
    
        HwiP_construct(&rtcHwi, INT_CPUIRQ0, rtcInterruptHandler, NULL);
        HwiP_enableInterrupt(INT_CPUIRQ0);
    
        HWREG(RTC_BASE + RTC_O_CTL) |= RTC_CTL_RST;
        HWREG(RTC_BASE + RTC_O_CTL) &= ~RTC_CTL_RST;
    }



    如果我理解正确、此选项对我有效。


    我只有一个问题、我是否正确地计算周期?

    我采用了 SysConfig 的频率:




    谢谢!
    Vadim F

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

    您好、Vadim、

    频率应为(*除非外部提供、否则必须为31.25kHz)  

      

    谢谢!
    Alex F

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

    Alex、您好!

    感谢您的回答、我现在使用31.25 kHz 

    Vadim F