・ ISRからアプリケーションに、イベントを通知するexampleについて、説明します。

・ 過去にも、MSP430向けに下記のexampleを投稿していますが、仕組みを大幅に簡素化しました。

  複数ペリフェラルを並行動作させる方式

 

・ LPM0とLPM3を切り替えてsleepする方法は、下記に掲載しました。

  MSP432 LPM0とLPM3のwait切り替えexample

 

 

1 概要

 

・ 複数のペリフェラルを並行動作させているアプリケーション(APP)では、下記の処理が必要になります。

① ISRから割り込み(イベント)を受けているのか調べる

② イベントに対応した処理に分岐する

③ 複数イベントが発生したときも、もれなくイベントを処理する

④ イベントが無ければ、sleepに入る

 

・ 例えば、portに複数の割り込みが発生したことを識別できる必要が有ります。

・ これを簡潔に処理する仕組み・関数のexampleを提供します。

 

2 ライブラリ・関数

 

2.1 ISRからAPPへイベント通知

 

1) 関数

void           Event_Send( uint8_t ev_irqn, uint8_t ev_flag );

uint8_t ev_irqn: ペリフェラルのIRQnを指定

uint8_t ev_flag: イベント内容、例: PxIFGのビッ���(複数bit onが可能)

 

2) ISRへの追加処理

・ イベントをAPPに通知するときは、下記のように関数callを追加します。

void WDT_A_IRQHandler(void)

{

        Event_Send( WDT_A_IRQn, 1 );

}

 

2.2 APPでイベントを受信

 

1) 関数

uint16_t       Event_Read( );

return: 下位uint8_t ev_irqn, 上位 uint8_t ev_flag

 

・ ev_irqn(IRQn)でペリフェラルごとの処理に分岐し、ev_flagで個別の処理をします。

・ イベントがない時(ev_irqn=_false)は、sleepします。

  例

Event_num = Event_Read( );

ev_irqn = (Event_num & 0x00FF);

ev_flag = (Event_num >> 8);

switch ( ev_irqn ) {

   case         WDT_A_IRQn:

   { break;}

   case         PORT6_IRQn:

   { break;}

   case         Event_false:

   {

        __sleep();

        __no_operation();                   // For debugger

        break;

   }

 

3 example

 

・ デバッグを終了するときは、必ず停止(suspend)してから終了(exit)します。

  停止せずに終了すると、次のprogram-loadで異常が起きるケースが有ります。 ボード電源off/onで復旧できます。

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

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

 

 

4 補足

 

・ sleepは、LPM0LPM3を選択できます。

・ クロックを使用するペリフェラルは、LPM0が必須です。

・ exampleLPM3(強制遷移)を指定しています。 LPM3ではREFO->BCLKWDTが動作します。

  deep-sleep指定をコメントアウトすればLPM0になります。

 

Anonymous