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.

[参考译文] MSP432E401Y:通过 RTC 匹配从休眠中唤醒

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1342196/msp432e401y-wake-up-from-hibernation-with-rtc-match

器件型号:MSP432E401Y

您好!  

我正在尝试通过 RTC 匹配和唤醒引脚从休眠中唤醒。 MSP432可以通过引脚唤醒、但不能通过 RTC 唤醒。  这里是配置休眠和进入休眠的部分代码。 我想我忘了一些配置线路、但我不知道是哪条配置线路。

__attribute__((optnone)) Public void CtrlHibernateInit(void)
{
    /* Enable the the Hibernate module and wait for it to be ready */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);

    /* If first start up, enable hibernate
     * and RTC.
     */
    if (HibernateIsActive() == FALSE) {
        HibernateEnableExpClk((uint32)CPU_FREQUENCY);

        HibernateWakeSet(HIBERNATE_WAKE_PIN | HIBERNATE_WAKE_RTC);

        HibernateRTCEnable();
        HibernateCounterMode(HIBERNATE_COUNTER_RTC);
        HibernateRTCSet(0);
    }
}



__attribute__((optnone, noreturn)) Public void CtrlHibernateDoHibernate(void)
{
    /*
     * Read and clear any status bits that might have been set since
     * last clearing them.
     */
    uint32 hibIntStatus = HibernateIntStatus(FALSE);
    HibernateIntClear(hibIntStatus);

// wake up each 30 seconds
    HibernateRTCMatchSet(0, HibernateRTCGet()+30);
    HibernateRequest();

    for (;;) {
        /* Spin for a while for hibernate to activate. */
        __NOP();
    }
}

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

    您好!

     我没有看到您调用 MAP_HIBernateWakeSet (HIBERIN_WAKE_RTC)来启用 RTC 唤醒中断。  我建议您查看 C:\ti\simplelink_msp432e4_sdk_4_20_00_12\examples\nortos\msp_EXP432E401Y\driverlib\HIBERIN_vdd3on_rtcwake 的示例。 本示例使用 RTC 从休眠状态唤醒。  

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

    您好!  

    第12行

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

    您好、第12行。 我将使用此示例并进行了修改

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

    好的。  

    我刚刚按 原样尝试 HIBERIN_vdd3on_rtcwake 示例、它对我很有效。 在我按下 SW1开关以将器件置于休眠模式后、休眠模块将在5秒后唤醒。 为什么不首先在 LaunchPad 上未经修改就尝试示例、然后在您的定制板上尝试? 您能否让这个示例正常工作? 如果您可以使该示例正常工作、那么您可以将其与您修改过的代码进行比较。 您也可以在 LaunchPad 上尝试自己的代码。 它在 LaunchPad 上是否工作? 检查是否向器件发送了有效的32.769kHz XOSC 信号。  

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

    您好!  

    我已在 launchpad 上进行了测试、工作正常。 但我需要修改代码以便在没有 IRQ 的情况下使用、仅由 RTC 唤醒并转至 main。 有可能吗?

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

    您好!

    ,但我需要修改代码,以便在没有 IRQ 的情况下使用,

     这是不可能的。 当器件处于休眠模式时、除 RTC 外的所有时钟均停止。 这意味着 CPU 处于空闲状态。 您必须生成中断才能唤醒时钟和 CPU。 RTC 匹配生成一个到处理器的 IRQ 来唤醒器件。  

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

    我已修改了代码、可以在没有 IRQ 的情况下运行。 但我试图移动它到我们的系统,它不起作用... 我必须调查更多发生了什么……

    /* DriverLib Includes */
    #include <ti/devices/msp432e4/driverlib/driverlib.h>
    
    /* Standard Includes */
    #include <stdint.h>
    #include <stdbool.h>
    
    void delay(uint32_t delay_ms) // assumes 1 ms tick.
    {
    uint32_t start = 0;
    
    while (start < delay_ms) {
        start++;// nop
    }
    }
    
    int main(void)
    {
        uint32_t systemClock;
        uint32_t hibIntStatusRaw = 0u;
    
        /* Configure the system clock for 120 MHz */
        systemClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
                                              SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),
                                              120000000);
    
        /* Enable the clock to the GPIO Port N and wait for it to be ready */
        MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
        while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPION)))
        {
        }
    
        /* Configure the GPIO PN0-PN1 as output and switch it LED D2 ON */
        MAP_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, (GPIO_PIN_0 | GPIO_PIN_1));
        MAP_GPIOPinWrite(GPIO_PORTN_BASE, (GPIO_PIN_1), 0);
        delay(12000000);
    
        /* Enable the clock to the Hibernate and wait for it to be ready */
        MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);
        while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_HIBERNATE)))
        {
        }
    
        /* Configure Hibernate for VDD3ON Mode with Pin Wakeup if Hibernate
         * module has not been configured */
       if(!MAP_HibernateIsActive())
        {
            MAP_HibernateEnableExpClk(systemClock);
            MAP_HibernateWakeSet(HIBERNATE_WAKE_RTC | HIBERNATE_WAKE_PIN);
            MAP_HibernateRTCSet(0);
            MAP_HibernateRTCEnable();
        }
       else {
           hibIntStatusRaw = MAP_HibernateIntStatus(true);
           MAP_HibernateIntClear(hibIntStatusRaw);
           if ((hibIntStatusRaw & (HIBERNATE_INT_PIN_WAKE | HIBERNATE_INT_RTC_MATCH_0)) != 0u) {
               MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1, GPIO_PIN_1);
               delay(12000000);
           }
       }
    
        MAP_HibernateRTCMatchSet(0, (MAP_HibernateRTCGet()+5));
        MAP_HibernateRequest();
    
        while(1)
        {
        }
    }