ソフトウェア割込み(SWI)を管理する SwiManager クラスのデモ・プログラム

Dependencies:   mbed PushButton SwiManager

Committer:
MikamiUitOpen
Date:
Fri Apr 24 10:30:41 2020 +0000
Revision:
0:30022cf02315
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:30022cf02315 1 //-------------------------------------------------------------------------
MikamiUitOpen 0:30022cf02315 2 // SwiManager クラスのデモ・プログラム
MikamiUitOpen 0:30022cf02315 3 // SWI には CAN2_TX_IRQn を使用
MikamiUitOpen 0:30022cf02315 4 //
MikamiUitOpen 0:30022cf02315 5 // マイコン・ボードの青色の押しボタン SW 押下の割込みを受け付けると,
MikamiUitOpen 0:30022cf02315 6 // TeraTerm に表示される数値がインクリメントする
MikamiUitOpen 0:30022cf02315 7 //
MikamiUitOpen 0:30022cf02315 8 // EXTI15_10_IRQn の優先順位により動作が異なる
MikamiUitOpen 0:30022cf02315 9 // 優先順位 = 0 : LED1 が点灯中でも押しボタン SW の割込みを受け付ける
MikamiUitOpen 0:30022cf02315 10 // 優先順位 < 0 : LED1 が点灯中には押しボタン SW の割込みを受け付けず,
MikamiUitOpen 0:30022cf02315 11 // 消灯してから PbIsr() が実行される
MikamiUitOpen 0:30022cf02315 12 //
MikamiUitOpen 0:30022cf02315 13 // 2020/04/24, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 0:30022cf02315 14 //-------------------------------------------------------------------------
MikamiUitOpen 0:30022cf02315 15
MikamiUitOpen 0:30022cf02315 16 #include "SwiManager.hpp"
MikamiUitOpen 0:30022cf02315 17 #include "PushButton.hpp"
MikamiUitOpen 0:30022cf02315 18 using namespace Mikami;
MikamiUitOpen 0:30022cf02315 19 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:30022cf02315 20
MikamiUitOpen 0:30022cf02315 21 DigitalOut led_(LED1); // マイコンボードの LED
MikamiUitOpen 0:30022cf02315 22
MikamiUitOpen 0:30022cf02315 23 void SwiIsr();
MikamiUitOpen 0:30022cf02315 24
MikamiUitOpen 0:30022cf02315 25 SwiManager swi1_(CAN2_TX_IRQn, (uint32_t)SwiIsr, 1); // 割込み優先順位:1
MikamiUitOpen 0:30022cf02315 26
MikamiUitOpen 0:30022cf02315 27 // PushButton に対応する割込みサービス・ルーチン
MikamiUitOpen 0:30022cf02315 28 void PbIsr()
MikamiUitOpen 0:30022cf02315 29 {
MikamiUitOpen 0:30022cf02315 30 static int count = 0;
MikamiUitOpen 0:30022cf02315 31 printf("%d\r\n", count++);
MikamiUitOpen 0:30022cf02315 32 }
MikamiUitOpen 0:30022cf02315 33
MikamiUitOpen 0:30022cf02315 34 // ソフトウェア割込みに対する割込みサービス・ルーチン
MikamiUitOpen 0:30022cf02315 35 void SwiIsr()
MikamiUitOpen 0:30022cf02315 36 {
MikamiUitOpen 0:30022cf02315 37 led_ = 1; // LED 点灯
MikamiUitOpen 0:30022cf02315 38 wait(2);
MikamiUitOpen 0:30022cf02315 39 led_ = 0; // LED 消灯
MikamiUitOpen 0:30022cf02315 40 }
MikamiUitOpen 0:30022cf02315 41
MikamiUitOpen 0:30022cf02315 42 // Ticker に対する割込みサービス・ルーチン
MikamiUitOpen 0:30022cf02315 43 void TickerIsr() { swi1_.Invoke(); }
MikamiUitOpen 0:30022cf02315 44
MikamiUitOpen 0:30022cf02315 45 int main()
MikamiUitOpen 0:30022cf02315 46 {
MikamiUitOpen 0:30022cf02315 47 printf("\r\n\nSwiManager の 使用例\r\n");
MikamiUitOpen 0:30022cf02315 48 printf("マイコン・ボードの LED はプログラム開始 3 秒後から点滅を始めます\r\n");
MikamiUitOpen 0:30022cf02315 49
MikamiUitOpen 0:30022cf02315 50 // チャタリング防止機能付きの外部入力
MikamiUitOpen 0:30022cf02315 51 PushButton sw(USER_BUTTON, PullNone, PushButton::FALL, &PbIsr, 0.5);
MikamiUitOpen 0:30022cf02315 52 NVIC_SetPriority(EXTI15_10_IRQn, 0); // 割込み優先順位の設定
MikamiUitOpen 0:30022cf02315 53 // NVIC_SetPriority(EXTI15_10_IRQn, 2); // 割込み優先順位の設定
MikamiUitOpen 0:30022cf02315 54
MikamiUitOpen 0:30022cf02315 55 printf("割込み優先順位\r\n");
MikamiUitOpen 0:30022cf02315 56 printf(" EXTI15_10_IRQn: %d\r\n", NVIC_GetPriority(EXTI15_10_IRQn));
MikamiUitOpen 0:30022cf02315 57 printf(" swi1_ : %d\r\n", swi1_.GetPriority());
MikamiUitOpen 0:30022cf02315 58
MikamiUitOpen 0:30022cf02315 59 Ticker timer;
MikamiUitOpen 0:30022cf02315 60 timer.attach(&TickerIsr, 3);
MikamiUitOpen 0:30022cf02315 61
MikamiUitOpen 0:30022cf02315 62 swi1_.Enable();
MikamiUitOpen 0:30022cf02315 63 while (true) {}
MikamiUitOpen 0:30022cf02315 64 }