・ ほとんどDIORTCからの割り込みを待機するシステムでは、省電力モードのLPM3で待機するのが得策です。

  しかし、Timerなどのクロックを使用するペリフェラルを動作させるときはLPM0で待機する必要が有ります。

・ このような、LPM0LPM3の待機が混在するときに、簡潔にLPM0/3の切り替えを制御する例を説明します。

  exampleのプログラムは、下記で説明しましたイベントドリブン構造で作成して有ります。

  MSP432 イベントドリブン example

 

E2E Japan MSP430 forum参考記事

① MSP432 MSP432 Power Control Manager (PCM)

② MSP432 LPMとWakeup

 

 

1 LPM0LPM3の切り替え制御が必要な理由

 

・ 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 trueLPM0要求あり-> 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 生成

                -> TimerA0ACLK)起動:250ms動作、LPM0要求

RTC(BCLK) 毎分wakeup-> ADC(MODCLK) 1/2AVCCを測定: LPM0要求

 

3) example project

 

・ 速度を改善しましたので、下記の 3.example をご利用ください。

   MSP432 イベントドリブン 速度性能

 

 

5 観測結果

 

・ 下記はFree runで観測した結果です。 (デバッグモードではMCLKは連続動作します)

  黄色 highLPM3 wait、 青 high:TimerA0動作中LPM0 要求、 赤 low:MCLK動作中

 

・ TimerA0 LPM0動作中の250ms以外は、LPM3waitしています。

・ このLPM0 250msCPU停止していますが、MCLKは動作しています。 LPM3ではMCLKは停止します。

・ ADC14 LPM0は微小期間の動作なので、観測に出現していません。

 

・ 質問などが有りましたら、下記からお問い合わせをお願いします。

   MSP430とMSP432に関するお問い合わせ方法

 

Anonymous