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.

[参考译文] MSPM0G3107:UART 在调试模式下工作、但在正常电池供电模式下不工作(无法接收数据)

Guru**** 2396165 points
Other Parts Discussed in Thread: MSPM0G3107

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1475748/mspm0g3107-uart-works-in-debug-mode-but-not-in-normal-battery-operated-mode-unable-to-receive-data

器件型号:MSPM0G3107

工具与软件:

您好!

我在两种模式下使用 MSPM0G3107 STANDBY1和 RUN0/SLEEP0。 我需要将电流消耗保持在微安范围内、以满足我的要求。 在进入待机模式之前、我会关闭 UART。 通过特定的 GPIO 中断实现从待机模式的唤醒。 现在、在退出待机模式后、我为 UART 加电、并通过中断来接收一定数量的数据。 该操作在调试模式下能够很好地工作。 但一旦我返回正常运行、控制器就会退出 STANDBY0模式(通过运行时电流消耗进行检查)、但尽管 UART 模块已重新开启、但仍无法在 Run0模式下接收任何 UART 数据...

main()函数代码如下:

int main(void)
{
    SYSCFG_DL_init();
    NVIC_EnableIRQ(BOLT_INT_IRQN);
    
    while (1)
    {
        modeTogglePolicy = false;
        modeTogglePolicy2 = false;
        
        DL_UART_disablePower(UART_0_INST);
        NVIC_DisableIRQ(TIMER_0_INST_INT_IRQN);
        uartStatus = DL_UART_isEnabled(UART_0_INST);
        DL_SYSCTL_setPowerPolicySTANDBY1();
        while (modeTogglePolicy == false)
        {
            __WFE();
        }
        
        DL_SYSCTL_setPowerPolicyRUN0SLEEP0();
        delay_cycles(640000);
        __WFE();

        // Add a small delay
        DL_UART_enablePower(UART_0_INST);
        delay_cycles(640000);
        DL_UART_Main_enable(UART_0_INST);
        delay_cycles(640000);
        DL_UART_Main_enableInterrupt(UART_0_INST, DL_UART_MAIN_INTERRUPT_RX);
        NVIC_EnableIRQ(UART_0_INST_INT_IRQN);

        delay_cycles(640000);

        NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);

        uartStatus = DL_UART_isEnabled(UART_0_INST);

        while (modeTogglePolicy2 == false)
        {
            __WFE();
        }
    }
}

有人可以就此问题指导我吗?
谢谢。此致、

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

    Raj、您好!

    您是否对 UART 外设设置进行了寄存器转储以确保它们在待机之前和待机之后都相同?  

    您可能还需要确保在返回到运行模式后启用 UART IRQ。  

    在调试模式下、该器件会进入伪低功耗状态、因此调试时和自由运行时、它们在低功耗模式下的工作方式通常存在一些差异。

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

    您好、Dylan、

    感谢您的答复。 您能解释一下"UART 外设设置的寄存器转储"是什么意思吗?  

    是的、我已经进行了相同的检查、发现 UART IRQ 已启用。 (通过 isenabled()函数)

    是的、我意识到调试模式涉及伪低功耗状态、但我如何确保在从低功耗待机0模式到高功耗 run0模式的每次切换后启用 UART。   

    仍无法在正常运行模式下接收 UART 数据。

    谢谢。此致。

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

    我说到 UART 外设设置的寄存器转储、是指您可以使用调试器读取所有 UART 外设寄存器、并将它们保存到 PC 上的文件中。  如果您在进入待机模式之前以及之后执行这两项操作、则可以通过 beyondCompare 等工具查看 UART 寄存器是否有明显差异。 然后、我们可以判断寄存器设置是否不同、从而导致不同的行为、或者器件中的其他因素是否导致此行为。

    至于另一点、如果您认为有必要在每次切换后手动检查 UART 是否已启用、您可以这样做、但应该没有必要。 各种低功耗模式对器件行为确实有不同的影响、但始终是相同的、我们的 TRM 和数据表中对此进行了介绍。 因此、无需在每个开关后手动检查它是否启用。 它不是一个随机的过程。

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

    您好!

    UART 外设设置的寄存器转储提供了很多帮助。 该问题与退出低功耗模式相关、即、由于 调试模式涉及伪低功耗状态、因此收到了 GPIO 中断、控制器可以退出低功耗模式。 但在实际的正常工作模式下、由于没有收到 GPIO 中断、控制器无法退出低功耗模式。 电流消耗增加是因为某些其他元件导致我认为我已成功进入 RUN0模式。
    您的建议给了我们很多帮助。

    非常感谢。