・ ほとんどDIOやRTCからの割り込みを待機するシステムでは、省電力モードのLPM3で待機するのが得策です。
しかし、Timerなどのクロックを使用するペリフェラルを動作させるときはLPM0で待機する必要が有ります。
・ このような、LPM0とLPM3の待機が混在するときに、簡潔にLPM0/3の切り替えを制御する例を説明します。
exampleのプログラムは、下記で説明しましたイベントドリブン構造で作成して有ります。
E2E Japan MSP430 forum参考記事
① MSP432 MSP432 Power Control Manager (PCM)
1 LPM0とLPM3の切り替え制御が必要な理由
・ BCLK以外のクロックが動作していると、デフォルトではLPM3指定してもLPM0で待機(wait)となります。
つまり、どこかのロジックでクロック停止を忘れると、LPM0のままシステムが稼働して省電力が実現できません。
・ 強制的にLPM3に遷移指定すると、クロックを使用しているペリフェラルが異常停止してしまいます。
2 LPM切り替え制御の考え方
・ クロックを使用するときはLPM0の要求をし、クロック使用終了でLPM0要求を解除します。
LPM0使用期間を管理して、LPM0 waitすべきかLPM3 waitすべきかを識別する方法です。
・ 複数の制御プログラムブロックがあるケースでも、各ブロックでIRQnを識別子にしてLPM0要求/解除をします。
これにより、他の制御ブロックのLPM0要求/解除を意識する必要が有りません。
・ LPM0要求がない時は、強制的にLPM3で待機に入ります。
3 ライブラリ・関数
3.1 LPM0の要求
/ declare using LPM0
void Event_UseLpm0( uint8_t irqn ); // irqn: NVIC IRQn と同じです。
3.2 LPM0の解除
// release using LPM0
void Event_ClearLpm0( uint8_t irqn );
3.3 LPM0要求の有無判定
/ if using LPM0, return true
uint16_t Event_SeeLpm0();
return true:LPM0要求あり-> LPM0 wait します
false:LPM要求なし -> LPM3 wait
4 example
1) 動作条件
Vcore: LDO Vcore1, DCO=24MHz->MCLK、 REFO->ACLK/BCLK、 Flash wait=0
2) ペリフェラル動作
WDT(BCLK)1s wake-up-> P6 interrupt 生成
-> TimerA0(ACLK)起動:250ms動作、LPM0要求
RTC(BCLK) 毎分wakeup-> ADC(MODCLK) 1/2AVCCを測定: LPM0要求
3) example project
・ 速度を改善しましたので、下記の 3.example をご利用ください。
5 観測結果
・ 下記はFree runで観測した結果です。 (デバッグモードではMCLKは連続動作します)
黄色 high:LPM3 wait、 青 high:TimerA0動作中LPM0 要求、 赤 low:MCLK動作中
・ TimerA0 LPM0動作中の250ms以外は、LPM3でwaitしています。
・ このLPM0 250msはCPU停止していますが、MCLKは動作しています。 LPM3ではMCLKは停止します。
・ ADC14 LPM0は微小期間の動作なので、観測に出現していません。
・ 質問などが有りましたら、下記からお問い合わせをお願いします。