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.

[参考译文] MSP432P401M:如何退出 LPM0

Guru**** 2576215 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/606264/msp432p401m-how-to-exit-lpm0

器件型号:MSP432P401M

尊敬的香榭丽舍

当使用 MAP_PCM_gotoLPM0 ()进入 LPM0时、但我无法退出 LPM0、并且找不到任何 API 来退出它。  

有人有什么建议并举个例子吗?

非常感谢。

此致、

Janet

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

    当 CPU 在执行 MAP_PCR_gotoLPM0时进入待机状态时、需要中断事件来使 CPU 退出待机状态。 为此、必须将外设编程为中断源、例如用于开关按压的 GPIO 中断或用于定期唤醒的计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、

    要添加到 Amit 的注释中、您可以在此处看到 Amit 所描述内容的示例: dev.ti.com/.../

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

    我尝试使用 UART 或 Timer_A 中断从 LPM0唤醒。 但它似乎不起作用。
    LPM0是否具有任何受限的唤醒源?
    或者是否有任何 API 或函数强制代码退出 LPM0?
    如果您有任何建议、请随时告诉我。
    非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、您好!

    不、情况不应如此。 您能否共享您的代码以供审核? 另请参阅 Evan 已发送的链接。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Amit:

    我使用了示例"UART_PC_ECHO_12MHz_brclk"并添加了 timer32 ISR:

    /*启动计时器*/
    MAP_Timer32_disableInterrupt (TIMER32_BASE);
    MAP_Interrupt_enableInterrupt (INT_T32_INT1);

    while (1)

    MAP_PCM_gotoLPM0 ();
    curValue = MAP_Timer32_getValue (TIMER32_BASE);



    在 EUSCIA1_IRQHandler (void)为空时、添加以下测试代码。 然后添加 T32_INT1_IRQHander (void)、


    /* EUSCI A0 UART ISR -将数据回传到 PC 主机*/
    空 EUSCIA0_IRQHandler (空)

    uint32_t status = MAP_UART_getEnabledInterruptStatus (EUSCI_A0_BASE);
    uint32_t RX_Buffer_tmp;

    MAP_UART_clearInterruptFlag (EUSCI_A0_BASE、STATUS);

    IF (STATUS 和 EUSCI_A_UART_receive_interrupt_FLAG)

    RX_Buffer_tmp = MAP_UART_receiveData (EUSCI_A0_BASE);
    RX_Buffer[RX_Buffer_Cnt++]= RX_Buffer_tmp;
    MAP_UART_transmitData (EUSCI_A0_BASE、MAP_UART_receiveData (EUSCI_A0_BASE));

    MAP_Timer32_setCount (TIMER32_BASE、128000);
    MAP_Timer32_enableInterrupt (TIMER32_BASE);
    MAP_Timer32_startTimer (TIMER32_BASE、TRUE);



    /* Timer32 ISR */
    void T32_INT1_IRQHandler (void)

    MAP_Timer32_clearInterruptFlag (TIMER32_BASE);
    MAP_Interrupt_disableInterrupt (INT_EUSCIA1);


    我在 while (1)中的 curValue 上设置了一个断点、并希望它可以唤醒。
    但它始终会跳至以下循环:
    #if defined (__ICCARM __)
    void cpu_wfi (void)

    //
    //等待下一个中断。
    //
    _asm (" wfi\n");


    您对此有什么建议吗? 出什么问题了吗?
    如果有任何建议、请随时告知我。

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

    写入函数 MAP_PCM_gotoLPM0 ()后,进入睡眠状态,ISR 仅唤醒器件,执行 ISR 中的代码,然后默认返回睡眠状态。 要退出 ISR 以继续在 while (1)循环中执行代码,需要使用 Interrupt_disableSlepOnIsrExit()函数;

    请参阅 driverlib API 指南上的中断文档: dev.ti.com/.../
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Evan:

    感谢您的建议。
    在 T32_INT1_IRQHandler (void)中添加 Interr_disableSlepOnIsrExit()后,测试代码是可行的。
    非常感谢。