・ 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 をご利用ください。
4 補足
・ sleepは、LPM0かLPM3を選択できます。
・ クロックを使用するペリフェラルは、LPM0が必須です。
・ exampleはLPM3(強制遷移)を指定しています。 LPM3ではREFO->BCLKでWDTが動作します。
deep-sleep指定をコメントアウトすればLPM0になります。