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.

[参考译文] LPM3设置和唤醒

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/947110/lpm3-set-and-wake

器件型号:MSP430FR2476

工具/软件:Code Composer Studio

大家好、
我们的应用采用 SPI 客户端结构、并在 LPM0模式下正常工作。 但我们希望运行 LPM3以降低功耗。

在我们的应用中、有一个中断结构、在通过引脚进行 SPI 传输之前打开 SPI 模块、并在 SPI 传输后关闭 SPI 模块。
我在这里将输入和输出设置为 LPM3。 当 SPI 模块正在打开时(在 SPI 传输开始时)、我退出 LPM3、同时关闭 SPI 模块(SPI 传输结束)、我登录到 LPM3。
但我无法在1MHz 的 SPI 速度下获得响应。 我想指出、我还考虑了从 LPM3出发的时间。 您认为问题可能出在哪? 如果你能帮助我,我将不胜感激。

下面是代码段:

//端口2中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector=port2_vector
__interrupt void Port_2 (void)
#Elif defined (__GNU__)
void __attribute__((interrupt (port1_vector)))

))#pragma COMPILE_COMPIACTOR #el_2 (void!)不支持!
#endif
{

if ((P2IFG&CSSpiT)=CSSpiT)
{
if ((P2IES&CSSpiT)=CSSpiT) //如果检测到高/低边沿中断(SPI 传输结束)
{
_bis_SR_register_ON_EXIT (LPM3_BITS);
UCB0CTLW0 |= UCSWRST; //**初始化 USCI 状态机**
RESET_BUSY;
TA0CCTL0 |= CCIE; //启用 TACCR0中断
}
其他 //如果检测到低边沿/高边沿中断(SPI 传输结束)
{
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
SET_BUSY;
TA0CCTL0 &=~CCIE; //启用 TACCR0中断
UCB0CTLW0 &=~UCSWRST; //**初始化 USCI 状态机**
UCB0IE |= UCRXIE; //启用 USCI_B0 RX 中断
}

P2IES ^= CSpiT; //切换边线选择
P2IFG &=~CSpiT; // P1.2 IFG 清零

}
其他
{
P2IFG = 0; //如果不需要中断擦除所有 P2IFG
}

}

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

    您好、Ege、

    否则部分中的注释与代码不匹配。  

                TA0CCTL0 &= ~CCIE;                             // TACCR0 interrupt enabled
                UCB0CTLW0 &= ~UCSWRST;                        // **Initialize USCI state machine**

    上述代码将禁用 TACCR0中断并复位 eUSCI_B 状态机。 这是意图吗?

     用户指南(www.ti.com/.../slau445)的第23.3.7节"使用具有低功耗模式的 SPI 模式  "建议还必须考虑 CPU 的唤醒时间。 您是否已对此进行了说明? 另请查看该部分的注释。

    Srinivas

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

    您的症状到底是什么? 您的从器件是否根本没有唤醒、或者这些位是否"模糊"?

    >      __bis_SR_register_on_exit(LPM3_bits);

    将 main()放入 LPM ("远程"、就像它那样)是相当危险的。 (a) main 处于执行某项操作的中间、在这种情况下它会立即停止、或(b) main 已处于 LPM 中、在这种情况下、这是多余的。 我不确定这与您的症状有何关系、但这是需要考虑的问题。

    >            TA0CCTL0 |= CCIE;

    您将什么时钟(TASSEL)用于 TA0? SMCLK 不在 LPM3中运行。 [参考数据表(SLASEO5C)表6-1]。

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

    您好 Srinivas、

    很抱歉、代码注释错误。 这段代码没有问题。 这是目的(禁用 TACCR0中断并复位 eUSCI_B 状态机)。

    在应用中、我们使用引脚在传输前启动 SPI 机器、并在 SPI 传输后停止以避免电流泄漏。 应用在 LPM0模式下工作正常、但对于功耗问题、我们希望在没有 SPI 传输时使用 LPM3模式。 在从主机发送封装之前、我将 GPIO 设置为高电平、并等待 SPI 模块启动。 在主机端接收到之后、我等待并使用给定的代码段停止 SPI 状态机。 我想在发送 SPI 封装之前退出 LPM3模式、并在 SPI 传输完成后将电池组切换到 LPM3模式。 如何实现这一点? 在进入和退出 LPM3之间切换的正确方法是什么?

    此外、SMCLOCK 用于 SPI 模块、DCO 用作时钟源。 我想在 LPM3上禁用 DCO,是否应在从 LPM3唤醒后初始化 DCO?

    提前感谢
    Ege

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

    您好、Bruce、
    TA0使用 ACLK、但 SPI 模块使用 SMCLK、DCO 用作时钟源。 我想 DCO 在 LPM3模式下是关闭的。  是否应在从 LPM3唤醒后初始化 DCO? 此外,在进入和退出 LPM3之间切换的正确方法是什么?

    提前感谢
    Ege

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

    我认为这是 SPI 从器件、在这种情况下、SPI 使用 SCK (来自主器件)、而不是 SMCLK。 或者、我是否误解了您的描述?

    main(),即非 ISR,应决定何时进入 LPM。 如果它真的没有任何作用、main 以"while (1) LPM3;"结尾没有什么问题、但 ISR 不应在 main 上强加 LPM。

    DCO 在所有"用户"停止时关闭、LPM3就是这种情况。 它(重新)在中断时自动启动。

    出于完整性考虑,我要提到 DCO 会使用其先前的设置重新启动-- 如果它被停止了很长时间并且/或者环境急剧变化(在冬季的户外)、FLL 可能需要一些时间(可能是100ms)来校正 DCO、这不是通常 ISR 的范围。 这通常不是一个大问题。

    --------

    我仍然不确定我是否理解您的症状。