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.

[参考译文] MSP430g2553 LaunchPad 从低功耗模式唤醒

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/674562/msp430g2553-launchpad-wake-up-from-low-power-mode

主题中讨论的其他器件:MSP430G2553MSP-EXP430G2

大家好、

我想尝试一下 Aldo Briano 的一些程序、下面是 wiki 链接:
processors.wiki.ti.com/.../MSP430_LaunchPad_Low_Power_Mode。
程序进入低功耗模式(状态寄存器中的 CPUOFF 和 GIE 为1)、
但我无法通过按下 P1.3按钮来唤醒 CPU。
我有 Launchpad MSP-EXP430G2 和 MSP430G2553修订版1.5、没有晶振焊接、P1.3上的上拉电阻器 R34和电容器 C24被移除。 我使用 CCS 版本:6.2.0.00050。

我使用 VLOCLK 和 ACLK 来节能。 我n´t 我选择的低功耗模式无关紧要。 代码应可在任何模式下工作。

代码如下:

//
// MSP430G2xx 演示- WDT、低功耗模式、间隔溢出 ISR、DCO SMCLK
//
说明:使用由 WDT ISR 定时的软件进入低功耗模式。
睡眠时、LED //将关闭、端口1中断将唤醒 MCU 并打开
// LED。 根据
此示例中用于 WDT 的默认// DCO/SMCLK 时钟源、MCU 将以大约250 * 32ms 的时间睡眠。
// ACLK = n/a、MCLK = SMCLK =默认
值//
// MSP430G2xxx
//---
///|\| XIN|-
//||//-|RST
XOUT|-
//|//
| P1.0|->LED
//
Aldo Briano
// Texas Instruments Inc.
// 2010年7月
//*********
#include 



unsigned int wdtCounter = 0;
void main (void)
{
WDTCTL = WDT_MDLY_32;//将看门狗计时器间隔设置为~32ms
IE1 |= WDTIE;//启用 WDT 中断
P1DIR |= BIT0;//将 P1.0设置为输出方向
P1OUT |= BIT0; //打开1.0
P1REN 上的 LED |= BIT3;//启用 SW2 (P1.3)
P1DIR |= BIT3上的电阻器;//将 P1.3设置为输出方向以防止 P1OUT |=

BIT3悬空;//启用 SW2 (P1.3)
P1IE 上的上拉电阻|= BIT3;//启用 P1LSB
= TRB;//启用 P1LSB = TRB;//启用 P1BC3 = TRB = TRB;//启用 P1LSB = TRB = TRB;//中断

//从 VLO
_enable_interrupt ()运行 ACLK;

for (;)
{

}


//看门狗计时器中断服务例程
#pragma vector=WDT_vector
#pragma INTERRUPT (watchdog_timer)
void watchdog_timer (void)
{
if (wdtCounter ==249)
{
P1OUT = 0x00;// P1.0关闭 wtbis _interrupt

= wt0+ pitter;


}wtbits + PM0+++= PM0++ register



}
//端口1中断服务例程
#pragma vector=Port1_vector
#pragma INTERRUPT (Port_1)
void Port_1 (void)
{
wdtCounter = 0;//重置看门狗计时器计数
器 P1OUT |= 0x01;//打开
P1IFG 上的 LED = 0x0;
__BIC_SR_REGISTER_ON_EXIT (LPM0_EXIT);

//从低功耗模式唤醒

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

    这会将 P1.3 (内部)上拉电阻器变为下拉电阻器。 在没有外部电阻器的情况下、您依赖于内部电阻器。 尝试:

    > P1OUT &=~0x01;// P1.0关闭
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、我错过了以下内容:
    > P1DIR |= BIT3;//将 P1.3设置为输出方向以防止悬空
    按钮输入应为输入、而不是输出。 内部上拉电阻将使其保持浮动。
    只需删除此行。

    另外,我的算术说,该按钮在大约249*32ms=8秒内不会真正有效,所以不要急躁。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bruce:

    很棒的工作、非常感谢、我像您告诉我的那样更正了我的代码、现在工作正常!

    首先、用户指南在系统启动后的2.1.2说明所有引脚都切换到输入模式、使用我的代码、我将在所有引脚上启用下拉电阻器(用户指南在8.2.2)。 正如您告诉我的、我只应将引脚0切换为零、并将其他引脚保留为1、以了解输出寄存器。

    第二、正确、用户指南在8.2.8说明启用电阻器可防止悬空、因此无需将 P1.3设置为输出、因为微控制器应读取按钮是否被按下、因此必须将其配置为输入。

    您的最后一句话是什么意思:
    另外,我的算术说,该按钮在大约249*32ms=8秒内不会真正有效,所以不要急躁。
    我只需短按按钮、红色 LED 指示灯将再次亮起约8秒、不需要按住按钮8秒。

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

    我的意思是、我可以告诉程序在前8秒内不会休眠、因此如果您立即按下按钮、您就不会真正唤醒任何内容。 所有 P1.0 LED 指示灯(实际上)都是您按下按钮。

    也许一个更有趣的显示是(1)打开主器件顶部的 LED (2)在"_bis_SR_register (LPM0_bits + GIE);"语句[现在是这样]之前关闭 LED (3)在该语句之后立即将其重新打开、而不是在 Port_1 ()中打开。 这样 LED 就反映了 LPM 状态。

    我遵循了您提供的链接、但没有找到任何内容(完全不是?) 所以我不知道这个程序的目的是什么;我只是在阅读你发布的代码所说的内容。

    未经请求:我不建议在 ISR 中使用(启用) LPM0的技术,因为它会导致堆栈溢出--如果您停止按下按钮,我估计该程序将在崩溃之前持续大约4分钟。

    [编辑:我只是注意到您已经在做(1)。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您说得对、链接不起作用。
    请尝试此链接、我希望其工作:

    processors.wiki.ti.com/.../MSP430_LaunchPad_Low_Power_Mode

    我在我的计划中尝试了您的建议、它也很有效。 程序正在运行、没有崩溃。 我不熟悉微控制器、因此我不知道堆栈溢出。
    该程序的目的是在我进行编程时将控制器置于睡眠状态、并通过按下按钮来查看新程序是否按预期运行来在我需要时将其唤醒。
    我有一个运行 OLED-Display 的程序、在进行编程时、我不想运行该显示器数小时。
    目前、我想将低功耗代码包含在 OLED-Project 中、但我仍在尝试、我认为这并不容易。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次尝试链接:
    " processors.wiki.ti.com/.../MSP430_LaunchPad_Low_Power_Mode"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请替换三个点"..." 使用"index.php"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您刚开始、我建议您不要将此程序用作模型。 它很可爱、简洁、但教授了一些习惯、这些习惯实际上无法扩展到重要的应用。

    最值得注意的是,你不应该进入 ISR 中的 LPM (这需要重新启用中断),原因有几个:(1)递归中断导致堆栈溢出[如上所述](2)你永远不知道何时会发生- main 可能正在做一些重要的事情。 该程序会因为"知道"主程序从未执行任何操作而脱离它。

    通常、您只应进入 main 中的 LPM、并且仅当您知道有一些事件(中断)将唤醒您时。 ISR 应根据需要唤醒 main、然后由后者决定需要执行什么(如果有)。

    更广泛地说,控制的流动十分分散;这在一个40线的方案中是可行的,但随着方案的发展,很快就变得很难遵循。 主要应作出决定,由国际安全报告提供资料。

    此外、将 WDT 用作间隔定时器是完全有效的、但这也意味着您不能将其用作实际的看门狗。

    MSP430G2553示例(SLAC485D、产品页面"工具和软件")中提供了更"标准"模型的一个图示:msp430g2xx3_lpm3.c (它还将 WDT 用作间隔定时器。)