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.

[参考译文] MSP430I2040:如何正确进入 LPM4、然后从 GPIO 中断唤醒?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1284334/msp430i2040-how-to-correctly-enter-into-lpm4-and-then-wake-up-from-gpio-interrupt

器件型号:MSP430I2040

您好!

我有以下代码、在一定程度上发挥作用:

void main(void) {
	WDTCTL = WDT_ARST_1000;               	// start watchdog timer, 1 second
	if (LPM45CTL & LPM45IFG) {
		// If system wakes up from LPM4.5
		// Clear GPIO state lock so PINs can be configured
		LPM45CTL &= ~LOCKLPM45;
	}
	// Setup TA0.0 to wake up system every 100 mini-second
	TA0CCTL0 = CCIE;                    	// CCR0 Interrupt Enabled
	TA0CCR0 = 1638;							// 50ms ticker
	TA0CTL = TASSEL_1 | MC_1 | TACLR;    	// ACLK, UP, devided by 8

	while(1) {
		// Do something

		// Then kick the dog
		WDTCTL = WDT_ARST_1000;
		// If explicitly instructed by external MCU to go into LPM3
		// Otherwise LPM4/4.5
		if(P2IN & BIT1) {
			__bis_SR_register(LPM3_bits | GIE);     // Enter LPM3
		} else {
			// LMP4.5 code commented out
			//WDTCTL = WDTPW | WDTHOLD;       // Stop WDT to be safe. May actually unnecessary
			//LPM45CTL &= ~LOCKLPM45;
			//LPM45CTL |= PMMREGOFF;
			//__bis_SR_register(LPM4_bits);
			__bis_SR_register(LPM4_bits | GIE);
		}
	}
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(PORT2_VECTOR))) PORT2_ISR (void)
#else
#error Compiler not supported!
#endif
{
	if(P2IFG&BIT1) {
		P2IFG &= ~BIT1;
		__low_power_mode_off_on_exit ();
	}
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TA0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) TA0_ISR (void)
#else
#error Compiler not supported!
#endif
{
	// Just wake up to kick the dog if not anything else
	__low_power_mode_off_on_exit ();
}

问题是功耗。 当系统编程进入 LMP4.5时、功耗符合预期、约为0.1mA。 但是、当系统被编程进入 LPM3或 LPM4时、两种 LP 模式的功耗几乎相同、保持在0.4mA 附近、而预计会出现0.18mA 差异、因为 LPM3和 LPM4的基线功耗不同(LPM3为250uA、LPM4为70uA)。

我在这里犯了什么错?

谢谢。

ZL

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

    我注意到、在 LPM4中、所有时钟都关闭。 我的意思是、一旦系统进入 LPM4、所有的时钟都将自动关闭、或者如果使用了 ACLK 等时钟、那么系统将进入 LPM3而不是 LPM4? 根据功耗数据、我怀疑后者的结论是正确的。 但是停止 TA0可以降低功耗。

    // Stop timer so ACLK won't prevent system going to LPM4
    TA0CTL &= ~MC_3;
    __bis_SR_register(LPM4_bits | GIE);

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

    关闭。 带有时钟请求功能的器件也被记录在文档中、因此此处不存在。 但您也已将看门狗配置为使用 ACLK、7.2.5提示:"对于
    例如、如果 ACLK 是 WDT 时钟源、则 LPM4不可用。"

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

    感谢您的快速响应。 是否有一个带有时钟请求功能的器件列表? 我进行了快速搜索的用户指南、WDT 和 SD24似乎是唯一的两个。

    与此相关的另一个问题是:如果在进入睡眠状态之前关闭了 WDT、系统是否会无法通过 GPIO 中断唤醒?

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

    我不知道该怎么说。 FRAM 器件似乎很多、或者至少是我使用的器件。 (例如、slau367的表3-2)

    将 WDT 与低功耗模式一起使用可能会很麻烦。 您必须定期喂狗、否则它将重置器件。 我想定时器可以做到这一点、但这似乎没有什么用处。 它所做的一切都确保计时器不会退出。

    无论是否有狗在运行、每次中断都可以将系统从低功耗模式唤醒。