MSP430F2013 - 電力モード

提供: MochiuWiki : SUSE, EC, PCB

概要

電力モードは、マイコンの消費電力を管理するための仕組みである。
アプリケーションの要件に応じて、適切な電力モードを選択することにより、バッテリー駆動のデバイスにおける動作時間を延ばすことができる。

  • アクティブモード
    マイコンがフル機能で動作しているモードである。
    全てのクロックが動作し、CPUと周辺モジュールは通常の速度で動作する。
    消費電力が最も高くなる。

  • 低電力モード
    マイコンの一部の機能を停止または低速化することで、消費電力を抑えるモードである。
    低電力モードにはいくつかのレベルがあり、停止する機能によって分類される。
    一般的に、低電力モードのレベルが上がるほど、消費電力は低くなるが、復帰に時間がかかる場合がある。

  • スリープモード
    CPUを停止して、いくつかの周辺モジュールも停止するモードである。
    割り込みやリセットにより、スリープモードから復帰する。
    低電力モードの一種と考えることができる。

  • ディープスリープモード
    ほとんどの機能を停止して、最小限の消費電力で動作するモードである。
    外部割り込みやリセットにより、ディープスリープモードから復帰する。
    復帰時に、メモリの内容が失われる場合がある。

  • 遷移と復帰
    電力モード間の遷移は、レジスタの設定や特定の命令で行う。
    割り込みやリセットにより、低電力モードからアクティブモードに復帰する。
    復帰時に、停止していた機能を再初期化する必要がある場合がある。


電力モードを効果的に使用するには、アプリケーションの要件を分析、および、必要な機能と応答時間を考慮して、適切なモードを選択する必要がある。
また、割り込みや周辺モジュールの設定を適切に行い、復帰時の処理を正しく実装することが重要である。


MSP430F2013の動作モード

MSP430F2013は、1つのアクティブモードと5つのソフトウェア選択可能な低消費電力動作モードを備えている。
割り込みイベントにより、いずれの低消費電力モードからでもウェイクアップ、要求を処理して、割り込みからの復帰時に低消費電力モードに戻ることができる。

6つの動作モードをソフトウェアで設定することができる。

  • アクティブモード (AM)
    CPUと全てのクロックが動作しているモードである。
    消費電力が最も高くなる。

  • 低消費電力モード0 (LPM0)
    CPUおよびMCLKは停止するが、ACLK、SMCLK、DCOは動作し続ける。
    CPUの消費電力を抑えることができる。

  • 低電力モード1 (LPM1)
    CPU、MCLKが停止する。
    DCOのDCジェネレータにおいては、アクティブモードでDCOが使用されていない場合は停止する。
    ACLK、SMCLK、MCLKは動作し続ける。

  • 低電力モード2 (LPM2)
    CPU、DCO、MCLK、SMCLKが停止する。
    DCOのDCジェネレータ、ACLKは動作し続ける。

  • 低電力モード3 (LPM3)
    CPU、DCO、MCLK、SMCLKが停止する。
    ACLKのみ動作し続ける。

  • 低電力モード4 (LPM4)
    CPU、MCLK、SMCLK、ACLK、DCOのDCジェネレータが停止する。
    水晶発振器も停止する。
    消費電力が最も低くなる。



電力モードの設定

状態レジスタ (SR) を使用する場合

状態レジスタ (Status Register, SR) は、マイコンの現在の状態を示すレジスタである。
MSP430マイコン全般では、SRは16ビットのレジスタであり、各ビットが特定の状態を表している。

電力モードに必要な各ビットについて、以下に示す。

  • CPUの停止 (4ビット目)
    SRのCPUOFFビットを1にする。

  • オシレータの停止 (5ビット目)
    SRのOSCOFFビットを1にする。

  • システムクロックジェネレータ (DCOおよびSMCLK) の停止 (6ビット目)
    SRのSCG0ビットを1にする。

  • システムクロックジェネレータ (DCO、SMCLK、MCLK) の停止 (7ビット目)
    SRのSCG1ビットを1にする。


__bis_SR_register関数を使用する場合

__bis_SR_register関数を使用して、状態レジスタ (SR) の該当ビットを1にする。

ただし、割り込みが発生すると、省電力モードから復帰する。
省電力モードを使用する場合は、必要なクロックと周辺モジュールを適切に設定して、不要なものは停止させることが重要である。
また、割り込みを適切に設定して、省電力モードから復帰できるようにする必要がある。

 // LPM3に移行
 __bis_SR_register(LPM3_bits);



低消費電力モードからの復帰方法

MSP430F2013では、割り込みイベントによって全ての低消費電力モード (LPM) から自動的に復帰する。 割り込み処理後、元のLPMに自動的に戻ることも、アクティブモードに遷移することも可能である。

  • 復帰トリガー
    有効化された割り込み (ポート、タイマ、通信等)
  • 復帰時間:
    • LPM0 / LPM1
      即座 (DCO動作中)
    • LPM2 / LPM3
      約1.5[us] (DCO起動時間)
    • LPM4
      約1.5[us] + クロック安定時間
  • 復帰後の動作
    • 割り込みハンドラで __bic_SR_register_on_exit関数を呼ぶことにより、アクティブモードを継続できる。
    • 何も行わない場合は、自動的に元のLPMに復帰する。
  • モード選択指針:
    • LPM0 / LPM1
      ペリフェラル動作が必要 (65[uA])
    • LPM2 / LPM3
      定期起床タイマーアプリ (0.5〜22[uA])
    • LPM4
      外部イベント待機 (0.1[uA]、最低消費電力)


復帰の基本メカニズム

割り込みによる復帰プロセス

有効な割り込みが発生すると、以下に示すプロセスで自動的に復帰する。

  1. CPUが起動する。
  2. 必要なクロックが再開される。
  3. 割り込みハンドラへジャンプする。
  4. スタックにPC、SRが保存される。
  5. 割り込み処理を実行する。
  6. RETI命令でスタックからSR復帰 (LPMへの復帰 / 継続が決定)


復帰可能な割り込みソース

以下に示す割り込みでLPMから復帰できる。

  • ポート割り込み (P1, P2)
    外部信号による起動に最適
  • Timer_A割り込み
    定期的な起動に使用
  • ウォッチドッグタイマ割り込み
    インターバルタイマとして使用
  • SD16_A割り込み
    シグマデルタADコンバータ変換完了
  • USI割り込み (SPI / I2C)
    通信イベント


 // LPMから復帰可能な割り込みソースの設定例
 
 // 1. ポート割り込み (P1, P2)
 P1IE |= BIT3;              // P1.3の割り込み有効化
 P1IES |= BIT3;             // 立下りエッジで割り込み
 P1IFG &= ~BIT3;            // フラグクリア
 
 // 2. Timer_A割り込み
 TACCTL0 = CCIE;            // CCR0割り込み有効
 TACCR0 = 32768;            // 1秒周期 (ACLK : 32.768[kHz])
 TACTL = TASSEL_1 + MC_1;   // ACLK, アップモード
 
 // 3. Watchdog Timer割り込み
 WDTCTL = WDT_ADLY_1000;    // 1000[ms]間隔
 IE1 |= WDTIE;              // WDT割り込み有効
 
 // 4. SD16_A割り込み
 SD16CTL |= SD16REFON;      // 内部リファレンス有効
 SD16CCTL0 |= SD16IE;       // 変換完了割り込み
 
 // 5. USI割り込み
 USICTL1 |= USIIE;          // USI割り込み有効


復帰時間

パラメータ 条件 VCC 標準値 単位 説明
tDCO,LPM3/4 DCO 1MHz 3V 1.5 μs DCOクロックウェイクアップ時間
tCPU,LPM3/4 DCOCLK使用時 - 1/fMCLK + tClock,LPM3/4 - CPU起動時間


※注意

  • LPM0 / LPM1からの復帰
    DCOが動作中のため即座に実行可能
  • LPM2 / LPM3からの復帰例
    DCOが停止している場合、約1.5[us]の起動時間が必要
  • LPM4からの復帰
    DCO起動 + クロック安定化が必要


ステータスレジスタ(SR)によるLPM制御

LPM制御ビット
ステータスレジスタ (SR) のビット構成
ビット 名称 機能
bit 4 CPUOFF CPU停止
bit 5 OSCOFF 水晶発振器停止
bit 6 SCG0 システムクロックジェネレータ 0制御
bit 7 SCG1 システムクロックジェネレータ 1制御


各LPMモードのビット設定
 // 各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)


割り込みからの復帰制御
 // 割り込みハンドラ内での復帰制御
 
 // スタック上の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をセット


LPMモード別の復帰可能な割り込み

LPMモード 動作クロック 使用可能な割り込みソース 典型的な消費電流
(VCC = 2.2[V], 25[℃])
LPM0 ACLK, SMCLK動作
MCLK停止
Timer_A (ACLK/SMCLKソース)
SD16_A
USI (SPI/I2C)
Watchdog Timer (ACLK/SMCLKソース)
外部割り込み (P1IE, P2IE)
65[uA] (typ)
LPM1 ACLK, SMCLK動作
MCLK停止
DCO DCジェネレータ
条件付き停止
Timer_A (ACLK/SMCLKソース)
SD16_A
USI (SPI/I2C)
Watchdog Timer (ACLK/SMCLKソース)
外部割り込み (P1IE, P2IE)
65[uA] (typ)
LPM2 ACLK動作
DCOのDCジェネレータ動作
Timer_A (ACLKソースのみ)
Watchdog Timer (ACLKソースのみ)
外部割り込み (P1IE, P2IE)
22[uA] (typ)
LPM3 ACLKのみ動作 Timer_A (ACLKソースのみ)
Watchdog Timer (ACLKソースのみ)
外部割り込み (P1IE, P2IE)
0.7[uA] (typ, LFXT1)
0.5[uA] (typ, VLO)
LPM4 全クロック停止 外部割り込み (P1IE, P2IE)
リセット (RST/NMI)
NMI割り込み (NMIIE)
0.1[uA] (typ)

※注意

  • LPM0 / LPM1
    SMCLK動作のため、SMCLKベースのペリフェラル (SD16_A、USI) が使用可能
  • LPM2 / LPM3
    SMCLKが停止するため、ACLKベースのペリフェラルのみ使用可能
  • LPM4
    全クロック停止のため、外部割り込みとリセットのみ使用可能 (タイマ使用不可)
  • MSP430F2013ではADC10は搭載されていないため、SD16_Aを使用する


復帰方法のサンプルコード

例1 : LPM0 / LPM1からの復帰

SMCLKが動作しているため、SMCLKベースのタイマやペリフェラルが使用可能である。
DCOが動作中のため、高速復帰が可能である。

65[uA]程度と比較的消費電力が高い。

 // LPM0からの復帰例
 // Timer_Aを使用した定期起床とSD16_A測定
 
 #include <msp430f2013.h>
 
 volatile unsigned int sd16_result = 0;
 
 // Timer_A0 CCR0割り込みサービスルーチン
 #pragma vector=TIMERA0_VECTOR
 __interrupt void Timer_A0_ISR(void)
 {
    // SD16_Aを起動
    SD16CCTL0 |= SD16SC;              // サンプリング開始
    // LPM0のまま待機 (SD16_A割り込みで復帰)
 }
 
 // SD16_A割り込みサービスルーチン
 #pragma vector=SD16_VECTOR
 __interrupt void SD16_ISR(void)
 {
    sd16_result = SD16MEM0;           // SD16_A結果を取得
 
    // 閾値チェック
    if(sd16_result > 0x8000)          // 閾値超過
    {
       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 (〜12[kHz])
 
    // GPIO設定
    P1DIR |= BIT0;                    // P1.0 LED出力
    P1OUT &= ~BIT0;                   // LED初期化
 
    // Timer_A設定 (100[ms]周期)
    TACCTL0 = CCIE;                   // CCR0割り込み有効
    TACCR0 = 1200;                    // 100[ms] (VLO 12[kHz])
    TACTL = TASSEL_1 + MC_1 + TACLR;  // ACLK, アップモード, クリア
 
    // SD16_A設定
    SD16CTL = SD16REFON + SD16SSEL_1; // リファレンスON, SMCLK
    SD16CCTL0 = SD16SNGL + SD16IE + SD16DF; // シングル、割り込み、2の補数
    SD16INCTL0 = SD16INCH_0;          // A0入力
    SD16AE = SD16AE0;                 // A0アナログ有効
 
    // LPM0へ移行 (CPU停止、SMCLK動作)
    // SMCLKがSD16_Aで必要なため、LPM0を使用
    __bis_SR_register(LPM0_bits + GIE);
 
    // アクティブモード処理 (閾値超過時)
    while(1)
    {
       __delay_cycles(1000000);      // 1秒待機
       P1OUT ^= BIT6;                // 別のLEDをトグル
 
       // 再びLPM0へ
       __bis_SR_register(LPM0_bits + GIE);
    }
 }


例2 : LPM2 / LPM3からの復帰

この電力モードは、ACLK (32.768[kHz] または VLO) のみ動作する。
SMCLKベースのペリフェラルは停止しているため、使用不可である。

0.5~22[uA]程度で、低消費電力である。

定期的にウェイクアップするようなタイマアプリケーションに最適な電力モードである。

 // LPM3からの復帰例
 // 定期的にウェイクアップしてセンサデータを送信
 
 #include <msp430f2013.h>
 
 volatile unsigned char send_flag = 0;
 volatile unsigned int wake_count = 0;
 
 // Timer_A0 CCR0割り込みサービスルーチン
 #pragma vector=TIMERA0_VECTOR
 __interrupt void Timer_A0_ISR(void)
 {
    wake_count++;
 
    // 10秒間隔 (10回ウェイクアップごと) にデータ送信
    if(wake_count >= 10)
    {
       wake_count = 0;
       send_flag = 1;
 
       // アクティブモードへ遷移 (USI送信のため)
       __bic_SR_register_on_exit(LPM3_bits);
    }
    // それ以外はLPM3に戻る (デフォルト)
 }
 
 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;
    // 使用するピンのみ再設定
    P1DIR |= BIT0 + BIT6;             // LED
 
    // USI設定 (SPIマスターモード)
    USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE; // ポート有効、マスター
    USICTL1 |= USIIE;                 // 割り込み有効
    USICKCTL = USIDIV_1 + USISSEL_2;  // SMCLK/2
    USICTL0 &= ~USISWRST;             // USI解放
 
    // Timer_A設定 (1秒周期)
    TACCTL0 = CCIE;                   // CCR0割り込み有効
    TACCR0 = 12000;                   // 1秒 (VLO : 〜12[kHz])
    TACTL = 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点滅 (起床確認)
 
          // センサデータ送信 (USI SPIモード)
          unsigned char data[] = {0xAA, 0x55, 0x12, 0x34};
          unsigned char i;
 
          for(i = 0; i < sizeof(data); i++)
          {
             USISRL = data[i];      // データセット
             USICNT = 8;            // 8ビット送信
             while(!(USICTL1 & USIIFG)); // 送信完了待ち
             USICTL1 &= ~USIIFG;    // フラグクリア
          }
 
          __delay_cycles(10000);    // 待機
          P1OUT ^= BIT0;            // LED消灯
       }
    }
 }


例3 : LPM4からの復帰

この電力モードは、全クロック停止 (最低消費電力 : 0.1[uA] typ) する。
外部割り込み (ポート) のみで復帰可能である。

タイマを使用しないため、外部イベント待ち専用の電力モードである。
バッテリー駆動の長期スリープに最適なモードとなる。

 // LPM4からの復帰例
 // ボタン押下でウェイクアップして、処理完了後は再びLPM4へ移行する例
 
 #include <msp430f2013.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 = CALDCO_1MHZ;
 
    // 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へ (ループ継続)
    }
 }



省電力設計

未使用ピン

浮遊入力は消費電力を増加させるため、全ての未使用ピンを出力にして、信号をLowに設定する。

 // 未使用ピンを全て出力Lowに設定
 P1DIR = 0xFF;  // 全て出力
 P1OUT = 0x00;  // 全てLow
 P2DIR = 0xFF;
 P2OUT = 0x00;
 
 // その後、使用するピンのみ再設定
 P1DIR &= ~BIT3;  // P1.3を入力に戻す
 P1OUT |= BIT3;   // プルアップ有効


クロックソース選択

クロックソース 周波数 消費電流 用途
LFXT1 (水晶) 32.768[kHz] 低 (0.7[uA] in LPM3) 高精度タイマ
VLO 〜12[kHz] 極低 (0.5[uA] in LPM3) 低精度タイマ、最低消費電力
DCO 1〜16[MHz] アクティブモード処理


 // LPM3での最低消費電力設定
 BCSCTL3 |= LFXT1S_2;  // ACLK = VLO (~12[kHz])
 
 // または高精度タイマが必要な場合
 // 32.768[kHz]水晶を使用
 // XIN/XOUTピンに水晶を接続 (MSP430F2013ではP2.6/P2.7)
 BCSCTL1 &= ~XTS;      // LF mode
 BCSCTL3 &= ~(LFXT1S1 | LFXT1S0);  // 32.768kHz crystal
 BCSCTL1 |= XCAP_1;    // 内部負荷容量 ~6pF


ペリフェラルの選択的使用

LPM3 / LPM4では以下に示すペリフェラルが使用可能である。

  • GPIO (外部割り込み)
  • Timer_A (ACLKソース)


LPM3 / LPM4では以下に示すペリフェラルは使用不可となる。

  • SD16_A (SMCLKが必要)
  • USI (SMCLKが必要)
  • ウォッチドッグタイマ (インターバルモード、SMCLKソース時)


LPMモードの比較表

LPMモードとクロックの関係
モード CPU MCLK SMCLK DCO DCジェネレータ ACLK 消費電流
(VCC = 2.2[V])
主な用途
Active 動作 動作 動作 動作 動作 動作 220[uA] @ 1[MHz] 通常処理
LPM0 停止 停止 動作 動作 動作 動作 65[uA] ペリフェラル動作待ち
LPM1 停止 停止 動作 条件付 条件付 動作 65[uA] 同上 (DCO未使用時)
LPM2 停止 停止 停止 停止 動作 動作 22[uA] タイマ動作
LPM3 停止 停止 停止 停止 停止 動作 0.5〜0.7[uA] 定期起床 (超低消費)
LPM4 停止 停止 停止 停止 停止 停止 0.1[uA] 外部イベント待ち (最低消費)



トラブルシューティング

LPMから復帰しない場合

  1. 割り込み有効化を確認する。
    • GIEビット
      __enable_interrupt() または LPMマクロに+GIE
    • 個別の割り込み許可ビット
      例: P1IE, TACCTL0のCCIE
  2. クロックソースを確認する。
    • LPM3 / LPM4ではACLKが必要である。(VLO または LFXT1設定済みかどうか)
    • LPM4ではタイマは使用不可である。
  3. 割り込みフラグのクリア
    • ポート割り込みフラグ (P1IFG, P2IFG) をクリアする。


消費電力が高い場合

  • 浮遊入力の確認
    • 全ピンが確定状態 (出力 または プルアップ / プルダウン付き入力)
  • ペリフェラルの停止確認
    • 未使用のペリフェラルを無効化する。
  • 外部回路の確認
    • LED等の外部負荷を確認する。
    • プルアップ / プルダウン抵抗の電流を確認する。
  • SMCLKクロックソース変更前の遅延 (Errata SYS15)
    • SMCLKソースをDCOからVLOまたはLFXT1に切り替えた直後にLPM3/LPM4に入る場合、最低4クロックサイクルの遅延が必要


DCOが起動しない場合 (LPM3 / LPM4復帰後)

  • キャリブレーション値の確認
    • BCSCTL1 = CALBC1_1MHZ;
    • DCOCTL = CALDCO_1MHZ;
  • 復帰時間の確保
    • DCO起動に約1.5[us]必要
  • RSELビット変更時の注意 (Errata BCL12)
    • RSELx > 13から< 12への変更、または< 12から> 13への変更時にDCOが停止する可能性がある
    • 中間周波数 (RSEL=13) を経由して変更することを推奨


MSP430F2013固有の注意事項

  • LFXT1はLFモードのみサポート
    • MSP430F20xxファミリーではLFXT1のHFモード (高周波モード) は使用不可
    • 32.768[kHz]水晶またはVLOのみ使用可能
  • メモリ容量の制限
    • Flash: 2KB + 256B (Info Memory)
    • RAM: 128B
    • コードサイズの最適化が重要
  • SD16_Aの使用
    • ADC10ではなく16ビットシグマデルタADC (SD16_A) を使用
    • 高分解能だが変換時間がADC10より長い
  • USI通信
    • USCI (UART機能付き) ではなくUSI (SPI/I2Cのみ)
    • UART通信が必要な場合は、タイマを使用したソフトウェアUARTを実装