📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{…
 
(同じ利用者による、間の7版が非表示)
32行目: 32行目:
<br><br>
<br><br>


== MSP430G2553の電力モード ==
== MSP430G2553の動作モード ==
MSP430G2553は、1つのアクティブモードと5つのソフトウェア選択可能な低消費電力動作モードを備えている。<br>
割り込みイベントにより、いずれの低消費電力モードからでもウェイクアップ、要求を処理して、割り込みからの復帰時に低消費電力モードに戻ることができる。<br>
<br>
6つの動作モードをソフトウェアで設定することができる。<br>
<br>
* アクティブモード (AM)
* アクティブモード (AM)
*: CPUと全てのクロックが動作しているモードである。
*: CPUと全てのクロックが動作しているモードである。
*: 消費電力が最も高くなる。
*: 消費電力が最も高くなる。
*: <br>
*: <br>
* 低電力モード0 (LPM0)
* 低消費電力モード0 (LPM0)
*: CPUは停止するが、ACLK、SMCLK、MCLK、DCOは動作し続ける。
*: CPUおよびMCLKは停止するが、ACLK、SMCLK、DCOは動作し続ける。
*: CPUの消費電力を抑えることができる。
*: CPUの消費電力を抑えることができる。
*: <br>
*: <br>
* 低電力モード1 (LPM1)
* 低電力モード1 (LPM1)
*: CPU、DCOが停止する。
*: CPU、MCLKが停止する。
*: DCOのDCジェネレータにおいては、アクティブモードでDCOが使用されていない場合は停止する。
*: ACLK、SMCLK、MCLKは動作し続ける。
*: ACLK、SMCLK、MCLKは動作し続ける。
*: <br>
*: <br>
* 低電力モード2 (LPM2)
* 低電力モード2 (LPM2)
*: CPU、DCO、MCLKが停止する。
*: CPU、DCO、MCLK、SMCLKが停止する。
*: ACLKとSMCLKは動作し続ける。
*: DCOのDCジェネレータ、ACLKは動作し続ける。
*: <br>
*: <br>
* 低電力モード3 (LPM3)
* 低電力モード3 (LPM3)
54行目: 60行目:
*: <br>
*: <br>
* 低電力モード4 (LPM4)
* 低電力モード4 (LPM4)
*: CPUと全てのクロックが停止する。
*: CPU、MCLK、SMCLK、ACLK、DCOのDCジェネレータが停止する。
*: 水晶発振器も停止する。
*: 消費電力が最も低くなる。
*: 消費電力が最も低くなる。
<br><br>
<br><br>
77行目: 84行目:
<br>
<br>


==== __bis_SR_register()関数を使用する場合 ====
==== __bis_SR_register関数を使用する場合 ====
<code>__bis_SR_register</code>関数を使用して、状態レジスタ (SR) の該当ビットを<code>1</code>にする。<br>
<code>__bis_SR_register</code>関数を使用して、状態レジスタ (SR) の該当ビットを<code>1</code>にする。<br>
<br>
<br>
87行目: 94行目:
  __bis_SR_register(LPM3_bits);
  __bis_SR_register(LPM3_bits);
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== 低消費電力モードからの復帰方法 ==
MSP430G2553では、割り込みイベントによって全ての低消費電力モード(LPM)から自動的に復帰する。
割り込み処理後、元のLPMに自動的に戻ることも、アクティブモードに遷移することも可能である。
<br>
* 復帰トリガー
*: 有効化された割り込み (ポート、タイマ、通信等)
* 復帰時間:
** LPM0 / LPM1
**: 即座 (DCO動作中)
** LPM2 / LPM3
**: 約1.5[us] (DCO起動時間)
** LPM4
**: 約1.5[us] + クロック安定時間
* 復帰後の動作
** 割り込みハンドラで <code>__bic_SR_register_on_exit()</code> を呼ぶことにより、アクティブモードを継続できる。
** 何も行わない場合は、自動的に元のLPMに復帰する。
* モード選択指針:
** LPM0 / LPM1
**: ペリフェラル動作が必要 (56[uA])
** LPM2 / LPM3
**: 定期起床タイマーアプリ (0.5〜22[uA])
** LPM4
**: 外部イベント待機 (0.1[uA]、最低消費電力)
<br>
==== 復帰の基本メカニズム ====
===== 割り込みによる復帰プロセス =====
有効な割り込みが発生すると、以下に示すプロセスで自動的に復帰する。<br>
<br>
# CPUが起動する。
# 必要なクロックが再開される。
# 割り込みハンドラへジャンプする。
# スタックにPC、SRが保存される。
# 割り込み処理を実行する。
# RETI命令でスタックからSR復帰 (LPMへの復帰 / 継続が決定)
<br>
===== 復帰可能な割り込みソース =====
以下に示す割り込みでLPMから復帰できる。<br>
<br>
* ポート割り込み (P1, P2)
*: 外部信号による起動に最適
* Timer_A割り込み (TA0, TA1)
*: 定期的な起動に使用
* ウォッチドッグタイマ割り込み
*: インターバルタイマとして使用
* ADC10割り込み (MSP430G2x53のみ)
*: ADコンバータ変換完了
* USCI割り込み (UART / SPI / I2C)
*: 通信イベント
* Comparator_A+割り込み
*: アナログ比較
<br>
<syntaxhighlight lang="c">
// LPMから復帰可能な割り込みソースの設定例
// 1. ポート割り込み (P1, P2)
P1IE |= BIT3;              // P1.3の割り込み有効化
P1IES |= BIT3;            // 立下りエッジで割り込み
P1IFG &= ~BIT3;            // フラグクリア
// 2. Timer_A割り込み
TA0CCTL0 = CCIE;          // CCR0割り込み有効
TA0CCR0 = 32768;          // 1秒周期 (ACLK : 32.768[kHz])
TA0CTL = TASSEL_1 + MC_1;  // ACLK, アップモード
// 3. Watchdog Timer割り込み
WDTCTL = WDT_ADLY_1000;    // 1000[ms]間隔
IE1 |= WDTIE;              // WDT割り込み有効
// 4. ADC10割り込み (MSP430G2x53のみ)
ADC10CTL0 |= ADC10IE;      // ADC変換完了割り込み
// 5. USCI割り込み
IE2 |= UCA0RXIE;          // UART受信割り込み
IE2 |= UCB0RXIE;          // I2C/SPI受信割り込み
// 6. Comparator_A+割り込み
CACTL1 |= CAIE;            // コンパレータ割り込み有効
</syntaxhighlight>
<br>
==== 復帰時間 ====
<center>
{| class="wikitable"
! パラメータ !! 条件 !! VCC !! 標準値 !! 単位 !! 説明
|-
| t<sub>DCO,LPM3/4</sub> || DCO 1MHz || 3V || 1.5 || μs || DCOクロックウェイクアップ時間
|-
| t<sub>CPU,LPM3/4</sub> || DCOCLK使用時 || - || 1/f<sub>MCLK</sub> + t<sub>Clock,LPM3/4</sub> || - || CPU起動時間
|}
</center>
<br>
<u>※注意</u><br>
* LPM0 / LPM1からの復帰
*: DCOが動作中のため即座に実行可能
* LPM2 / LPM3からの復帰例
*: DCOが停止している場合、約1.5[us]の起動時間が必要
* LPM4からの復帰
*: DCO起動 + クロック安定化が必要
<br>
==== ステータスレジスタ(SR)によるLPM制御 ====
===== LPM制御ビット =====
<center>
{| class="wikitable"
|+ ステータスレジスタ (SR) のビット構成
! ビット !! 名称 !! 機能
|-
| bit 4 || CPUOFF || CPU停止
|-
| bit 5 || OSCOFF || 水晶発振器停止
|-
| bit 6 || SCG0 || システムクロックジェネレータ 0制御
|-
| bit 7 || SCG1 || システムクロックジェネレータ 1制御
|}
</center>
<br>
===== 各LPMモードのビット設定 =====
<syntaxhighlight lang="c">
// 各LPMのステータスレジスタビット設定
// LPM0 : CPUのみ停止、MCLK停止、ACLK / SMCLK動作
#define LPM0_bits  (CPUOFF)
// LPM1 : CPU停止、MCLK停止、ACLK / SMCLK動作、DCO DC gen条件付き停止
#define LPM1_bits  (CPUOFF + SCG0)
// LPM2 : CPU / MCLK / SMCLK / DCO停止、DC gen動作、ACLK動作
#define LPM2_bits  (CPUOFF + SCG1)
// LPM3: CPU / MCLK / SMCLK / DCO / DCジェネレータ停止、ACLKのみ動作
#define LPM3_bits  (CPUOFF + SCG1 + SCG0)
// LPM4: 全クロック停止
#define LPM4_bits  (CPUOFF + SCG1 + SCG0 + OSCOFF)
</syntaxhighlight>
<br>
===== 割り込みからの復帰制御 =====
<syntaxhighlight lang="c">
// 割り込みハンドラ内での復帰制御
// スタック上のSRをそのまま復帰した後、何らかの処理を行い、元のLPMに戻る
// (何も指定しない場合のデフォルト動作)
// アクティブモードへ遷移
__bic_SR_register_on_exit(LPM3_bits);  // LPMビットをクリア
// 別のLPMへ遷移 (例: LPM3からLPM0へ)
__bic_SR_register_on_exit(LPM3_bits);  // 一旦クリア
__bis_SR_register_on_exit(LPM0_bits);  // LPM0をセット
</syntaxhighlight>
<br>
==== LPMモード別の復帰可能な割り込み ====
<center>
{| class="wikitable"
! LPMモード !! 動作クロック !! 使用可能な割り込みソース !! 典型的な消費電流<br/>(VCC = 2.2[V], 25[℃])
|-
| LPM0 || ACLK, SMCLK動作<br/>MCLK停止 || Timer_A (ACLK/SMCLKソース)<br/>ADC10 (MSP430G2x53のみ)<br/>USCI (UART/SPI/I2C)<br/>Watchdog Timer (ACLK/SMCLKソース)<br/>外部割り込み (P1IE, P2IE)<br/>アナログ比較割り込み (Comparator_A+)<br/>発振器故障割り込み (OFIFG) || 56[uA] (typ)
|-
| LPM1 || ACLK, SMCLK動作<br/>MCLK停止<br/>DCO DCジェネレータ<br/>条件付き停止 || Timer_A (ACLK/SMCLKソース)<br/>ADC10 (MSP430G2x53のみ)<br/>USCI (UART/SPI/I2C)<br/>Watchdog Timer (ACLK/SMCLKソース)<br/>外部割り込み (P1IE, P2IE)<br/>アナログ比較割り込み (Comparator_A+)<br/>発振器故障割り込み (OFIFG) || 56[uA] (typ)
|-
| LPM2 || ACLK動作<br/>DCOのDCジェネレータ動作 || Timer_A (ACLKソースのみ)<br/>Watchdog Timer (ACLKソースのみ)<br/>外部割り込み (P1IE, P2IE)<br/>アナログ比較割り込み (Comparator_A+)<br/>発振器故障割り込み (OFIFG) || 22[uA] (typ)
|-
| LPM3 || ACLKのみ動作 || Timer_A (ACLKソースのみ)<br/>Watchdog Timer (ACLKソースのみ)<br/>外部割り込み (P1IE, P2IE)<br/>アナログ比較割り込み (Comparator_A+)<br/>発振器故障割り込み (OFIFG) || 0.7[uA] (typ, LFXT1)<br/>0.5[uA] (typ, VLO)
|-
| LPM4 || 全クロック停止 || 外部割り込み (P1IE, P2IE)<br/>リセット (RST/NMI)<br/>NMI割り込み (NMIIE) || 0.1[uA] (typ)
|-
| colspan="4" |
<u>※注意</u>
* LPM0 / LPM1
*: SMCLK動作のため、SMCLKベースのペリフェラル (ADC10、USCI) が使用可能
* LPM2 / LPM3
*: SMCLKが停止するため、ACLKベースのペリフェラルのみ使用可能
* LPM4
*: 全クロック停止のため、外部割り込みとリセットのみ使用可能 (タイマ使用不可)
* 発振器故障割り込み(OFIFG)
*: LFXT1 (低周波水晶発振器) の故障を検出
|}
</center>
<br>
==== 復帰方法のサンプルコード ====
===== 例1 : LPM0 / LPM1からの復帰 =====
SMCLKが動作しているため、SMCLKベースのタイマやペリフェラルが使用可能である。<br>
DCOが動作中のため、高速復帰が可能である。<br>
<br>
56[uA]程度と比較的消費電力が高い。<br>
<br>
<syntaxhighlight lang="c">
// LPM0/1からの復帰例
// Timer_Aを使用した定期起床とADC測定
#include <msp430g2553.h>
volatile unsigned int adc_result = 0;
// Timer_A0 CCR0割り込みサービスルーチン
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
    // ADC10を起動 (SMCLKを使用)
    ADC10CTL0 |= ENC + ADC10SC;      // サンプリング開始
    // LPM0のまま待機 (ADコンバータ割り込みで復帰)
}
// ADC10割り込みサービスルーチン
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
    adc_result = ADC10MEM;            // ADC結果を取得
    // 閾値チェック
    if(adc_result > 512)              // 閾値超過
    {
      P1OUT |= BIT0;                // LED点灯
      // アクティブモードへ遷移
      __bic_SR_register_on_exit(LPM0_bits);
    }
    else
    {
      P1OUT &= ~BIT0;              // LED消灯
      // LPM0に戻る (デフォルト動作)
    }
}
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;        // WDT停止
    // クロック設定
    BCSCTL1 = CALBC1_1MHZ;            // DCO = 1[MHz]
    DCOCTL = CALDCO_1MHZ;
    BCSCTL3 |= LFXT1S_2;              // ACLK = VLO (〜12kHz])
    // GPIO設定
    P1DIR |= BIT0;                    // P1.0 LED出力
    P1OUT &= ~BIT0;                  // LED初期化
    // Timer_A0設定 (100[ms]周期)
    TA0CCTL0 = CCIE;                  // CCR0割り込み有効
    TA0CCR0 = 1200;                  // 100[ms] (VLO 12[kHz])
    TA0CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, アップモード, クリア
    // ADC10設定
    ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE;  // 16CLK, ADC ON, 割り込み有効
    ADC10CTL1 = INCH_0;                          // A0入力
    ADC10AE0 |= BIT0;                            // P1.0をアナログ入力に
    // LPM0へ移行 (CPU停止、SMCLK動作)
    // SMCLKがADCで必要なため、LPM0を使用
    __bis_SR_register(LPM0_bits + GIE);
    // アクティブモード処理 (ADC閾値超過時)
    while(1)
    {
      __delay_cycles(1000000);      // 1秒待機
      P1OUT ^= BIT6;                // 別のLEDをトグル
      // 再びLPM0へ
      __bis_SR_register(LPM0_bits + GIE);
    }
}
</syntaxhighlight>
<br>
===== 例2 : LPM2 / LPM3からの復帰 =====
この電力モードは、ACLK (32.768[kHz] または VLO) のみ動作する。<br>
SMCLKベースのペリフェラルは停止しているため、使用不可である。<br>
<br>
0.5~22[uA]程度で、低消費電力である。<br>
<br>
定期的にウェイクアップするようなタイマアプリケーションに最適な電力モードである。<br>
<br>
<syntaxhighlight lang="c">
// LPM3からの復帰例
// 定期的にウェイクアップしてセンサデータを送信
#include <msp430g2553.h>
volatile unsigned char send_flag = 0;
volatile unsigned int wake_count = 0;
// Timer_A0 CCR0割り込みサービスルーチン
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
    wake_count++;
    // 10秒間隔 (10回ウェイクアップごと) にデータ送信
    if(wake_count >= 10)
    {
      wake_count = 0;
      send_flag = 1;
      // アクティブモードへ遷移 (UART送信のため)
      __bic_SR_register_on_exit(LPM3_bits);
    }
    // それ以外はLPM3に戻る (デフォルト)
}
// USCI_A0 送信完了割り込み
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI_A0_TX_ISR(void)
{
    // 送信完了後、LPM3へ戻る
    __bis_SR_register_on_exit(LPM3_bits);
}
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;        // WDT停止
    // クロック設定
    BCSCTL1 = CALBC1_1MHZ;            // DCO = 1[MHz] (アクティブ時用)
    DCOCTL = CALDCO_1MHZ;
    BCSCTL3 |= LFXT1S_2;              // ACLK = VLO (〜12[kHz])
    // GPIO設定
    P1DIR |= BIT0 + BIT6;            // LED出力
    P1OUT &= ~(BIT0 + BIT6);
    // 未使用ピンを出力に設定 (消費電力削減)
    P1DIR = 0xFF;
    P1OUT = 0x00;
    P2DIR = 0xFF;
    P2OUT = 0x00;
    // 使用するピンのみ再設定 (上記で設定済み)
    // UART設定 (アクティブ時に使用)
    P1SEL |= BIT1 + BIT2;            // P1.1=RXD, P1.2=TXD
    P1SEL2 |= BIT1 + BIT2;
    UCA0CTL1 |= UCSSEL_2;            // SMCLK
    UCA0BR0 = 104;                    // 1[MHz] / 9600
    UCA0BR1 = 0;
    UCA0MCTL = UCBRS0;
    UCA0CTL1 &= ~UCSWRST;            // USCI初期化完了
    IE2 |= UCA0TXIE;                  // TX割り込み有効
    // Timer_A0設定 (1秒周期)
    TA0CCTL0 = CCIE;                  // CCR0割り込み有効
    TA0CCR0 = 12000;                  // 1秒 (VLO : 〜12[kHz])
    TA0CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, アップモード
    __enable_interrupt();            // 全割り込み有効
    while(1)
    {
      // LPM3へ移行 (CPU, DCO, MCLK, SMCLK停止、ACLKのみ動作)
      __bis_SR_register(LPM3_bits);
      // タイマ割り込みで起床後、ここから実行再開
      if(send_flag)
      {
          send_flag = 0;
          P1OUT ^= BIT0;            // LED点滅 (起床確認)
          // センサデータ読み取り (仮)
          unsigned char data[] = "DATA\r\n";
          unsigned char i;
          // UART送信
          for(i = 0; i < sizeof(data)-1; i++)
          {
            while(!(IFG2 & UCA0TXIFG)); // 送信バッファ空き待ち
            UCA0TXBUF = data[i];
          }
          __delay_cycles(10000);    // 送信完了待ち
          P1OUT ^= BIT0;            // LED消灯
      }
    }
}
</syntaxhighlight>
<br>
===== 例3 : LPM4からの復帰 =====
この電力モードは、全クロック停止 (最低消費電力 : 0.1[uA] typ) する。<br>
外部割り込み (ポート) のみで復帰可能である。<br>
<br>
<u>タイマを使用しないため、外部イベント待ち専用の電力モードである。</u><br>
バッテリー駆動の長期スリープに最適なモードとなる。<br>
<br>
<syntaxhighlight lang="c">
// LPM4からの復帰例
// ボタン押下でウェイクアップして、処理完了後は再びLPM4へ移行する例
#include <msp430g2553.h>
volatile unsigned char button_pressed = 0;
volatile unsigned int task_count = 0;
// Port1割り込みサービスルーチン
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
    // チャタリング対策用ディレイ
    __delay_cycles(50000);            // 約50[ms] (DCO起動後)
    // P1.3ボタン割り込み処理
    if(P1IFG & BIT3)
    {
      P1IFG &= ~BIT3;              // 割り込みフラグクリア
      // ボタンが押下されたままかどうかを確認
      if(!(P1IN & BIT3))
      {
          button_pressed = 1;
          task_count++;
          // アクティブモードへ遷移
          __bic_SR_register_on_exit(LPM4_bits);
      }
    }
}
void perform_task(void)
{
    unsigned int i;
    // タスク実行中LED点灯
    P1OUT |= BIT0;
    // 何らかの処理を実行 (例 : データ記録、通信等)
    for(i = 0; i < 5; i++)
    {
      P1OUT ^= BIT6;                // P1.6 LED点滅
      __delay_cycles(500000);      // 約500[ms]
    }
    // タスク完了
    P1OUT &= ~(BIT0 + BIT6);          // 全LED消灯
}
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;        // WDT停止
    // クロック設定 (ウェイクアップ後に使用)
    BCSCTL1 = CALBC1_1MHZ;            // DCO = 1[MHz]
    DCOCTL = CALDCO1MHZ;
    // LED設定
    P1DIR |= BIT0 + BIT6;            // P1.0, P1.6 LED出力
    P1OUT &= ~(BIT0 + BIT6);          // LED初期化
    // ボタン設定 (P1.3)
    P1DIR &= ~BIT3;                  // P1.3入力
    P1REN |= BIT3;                    // プルアップ/ダウン有効
    P1OUT |= BIT3;                    // プルアップ
    P1IES |= BIT3;                    // 立下りエッジ (ボタン押下)
    P1IFG &= ~BIT3;                  // 割り込みフラグクリア
    P1IE |= BIT3;                    // P1.3割り込み有効
    // 未使用ピンを出力Lowに設定 (消費電力最小化)
    P1DIR |= ~(BIT3);                // P1.3以外を出力
    P1OUT &= BIT3;                    // P1.3プルアップ以外はLow
    P2DIR = 0xFF;                    // P2全て出力
    P2OUT = 0x00;                    // P2全てLow
    // 起動時LED点滅 (デバッグ用)
    P1OUT |= BIT0 + BIT6;
    __delay_cycles(1000000);          // 1秒
    P1OUT &= ~(BIT0 + BIT6);
    __enable_interrupt();            // 全割り込み有効
    while(1)
    {
      // LPM4へ移行 (全クロック停止、最低消費電力)
      // 注意 : タイマは使用不可、外部割り込みのみ
      __bis_SR_register(LPM4_bits);
      // ボタン割り込みで起床後、ここから実行再開
      if(button_pressed)
      {
          button_pressed = 0;
          // タスク実行
          perform_task();
          // タスク回数表示 (P1.0のLED点滅)
          unsigned int i;
          for(i = 0; i < task_count; i++)
          {
            P1OUT |= BIT0;
            __delay_cycles(200000);
            P1OUT &= ~BIT0;
            __delay_cycles(200000);
          }
          __delay_cycles(1000000);  // 1秒待機
      }
      // 再びLPM4へ (ループ継続)
    }
}
</syntaxhighlight>
<br><br>
== 省電力設計 ==
==== 未使用ピン ====
浮遊入力は消費電力を増加させるため、全ての未使用ピンを出力にして、信号をLowに設定する。<br>
<br>
<syntaxhighlight lang="c">
// 未使用ピンを全て出力Lowに設定
P1DIR = 0xFF;  // 全て出力
P1OUT = 0x00;  // 全てLow
P2DIR = 0xFF;
P2OUT = 0x00;
// その後、使用するピンのみ再設定
P1DIR &= ~BIT3;  // P1.3を入力に戻す
P1OUT |= BIT3;  // プルアップ有効
</syntaxhighlight>
<br>
==== クロックソース選択 ====
<center>
{| class="wikitable"
! クロックソース !! 周波数 !! 消費電流 !! 用途
|-
| LFXT1 (水晶) || 32.768[kHz] || 低 (0.7[uA] in LPM3) || 高精度タイマ
|-
| VLO || 〜12[kHz] || 極低 (0.5[uA] in LPM3) || 低精度タイマ、最低消費電力
|-
| DCO || 1〜16[MHz] || 高 || アクティブモード処理
|}
</center>
<br>
<syntaxhighlight lang="c">
// LPM3での最低消費電力設定
BCSCTL3 |= LFXT1S_2;  // ACLK = VLO (~12kHz)
// または高精度タイマが必要な場合
// 32.768kHz水晶を使用 (LaunchPadでは要配線変更)
// R3, R9を除去、R5, R7をショート
</syntaxhighlight>
<br>
==== ペリフェラルの選択的使用 ====
LPM3 / LPM4では以下に示すペリフェラルが使用可能である。<br>
* GPIO (外部割り込み)
* Timer_A (ACLKソース)
* Comparator_A+ (連続動作モード)
* RTC (ACLKソース)
<br>
LPM3 / LPM4では以下に示すペリフェラルは使用不可となる。<br>
* ADC10 (SMCLKが必要)
* USCI (SMCLKが必要)
* ウォッチドッグタイマ (インターバルモード、SMCLKソース時)
<br>
==== 消費電力測定 ====
例えば、MSP-EXP430G2ET LaunchPadでの消費電流測定の手順を以下に示す。<br>
<br>
# J101の3V3ジャンパーを外す。
# ジャンパー位置に電流計を接続。
# バックチャネルUARTの影響を考慮する。(J3, J5のジャンパー)
# 全てのI/Oを確定状態にする。(浮遊入力なし)
<br>
==== LPMモードの比較表 ====
<center>
{| class="wikitable"
|+ LPMモードとクロックの関係
! モード !! CPU !! MCLK !! SMCLK !! DCO !! DCジェネレータ !! ACLK !! 消費電流<br/>(VCC = 2.2[V]) !! 主な用途
|-
| Active || 動作 || 動作 || 動作 || 動作 || 動作 || 動作 || 230〜4000[uA] || 通常処理
|-
| LPM0 || 停止 || 停止 || 動作 || 動作 || 動作 || 動作 || 56[uA] || ペリフェラル動作待ち
|-
| LPM1 || 停止 || 停止 || 動作 || 条件付 || 条件付 || 動作 || 56[uA] || 同上 (DCO未使用時)
|-
| LPM2 || 停止 || 停止 || 停止 || 停止 || 動作 || 動作 || 22[uA] || タイマ動作
|-
| LPM3 || 停止 || 停止 || 停止 || 停止 || 停止 || 動作 || 0.5〜0.7[uA] || 定期起床 (超低消費)
|-
| LPM4 || 停止 || 停止 || 停止 || 停止 || 停止 || 停止 || 0.1[uA] || 外部イベント待ち (最低消費)
|}
</center>
<br><br>
== トラブルシューティング ==
==== LPMから復帰しない場合 ====
# 割り込み有効化を確認する。
#* GIEビット
#*: <code>__enable_interrupt()</code> または LPMマクロに<code>+GIE</code>
#* 個別の割り込み許可ビット
#*: 例: P1IE, TA0CCTL0のCCIE
# クロックソースを確認する。
#* LPM3 / LPM4ではACLKが必要である。(VLO または LFXT1設定済みかどうか)
#* LPM4ではタイマは使用不可である。
# 割り込みフラグのクリア
#* ポート割り込みフラグ (P1IFG, P2IFG) をクリアする。
<br>
==== 消費電力が高い場合 ====
* 浮遊入力の確認
** 全ピンが確定状態 (出力 または プルアップ / プルダウン付き入力)
* ペリフェラルの停止確認
** 未使用のペリフェラルを無効化する。
* 外部回路の確認
** LED等の外部負荷を確認する。
** プルアップ / プルダウン抵抗の電流を確認する。
<br>
==== DCOが起動しない場合 (LPM3 / LPM4復帰後) ====
* キャリブレーション値の確認
** <code>BCSCTL1 = CALBC1_1MHZ;</code>
** <code>DCOCTL = CALDCO_1MHZ;</code>
* 復帰時間の確保
** DCO起動に約1.5[uA]必要
<br><br>
<br><br>