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