Previous: 9.2. EXTI割込み(ライン5-15) |
Up: 9. 外部割込み/イベントコントローラ(EXTI) |
Next: 10. 低電力モード |
サンプルプログラム |
exti_software_interrupt |
ソフトウェア割り込みを使用してLEDの点灯をコントロールするプログラムです。
TIM4が割込み処理によりオンボードLEDを0.1秒間隔で点滅させます。その間に、EXTI9_5割込みが発生し、0.5秒間隔でLEDを消灯させます。結果、TIM4割込みとEXTI9_5割込みが競合することになりますが、NVICでEXTI9_5割込みの方がTIM4割込みよりも割込み優先度が高く設定されているため、TIM4割込みハンドラが実行中であっても、中断されてEXTI9_5割込みが実行されます。EXTI9_5割込みハンドラが実行中にTIM4割込みが発生しても、TIM4割込みは、EXTI9_5割込みハンドラの処理が終了するまでは実行されません。EXTI9_5割込みはソフトウェア割込みになっており、メインルーチンが発生させているものなので、EXTIラインにボタンを接続する必要も、EXTIラインをプルアップ・プルダウンする必要も、EXTIラインにつないだボタンを押す必要はありません。
サンプルプログラム中、EXTIの初期化方法は前項までと同じです。NVICに設定している優先度がTIM4よりも高い(設定値が小さい)ことに着目してください。
メインルーチンからソフトウェア割込みを発生させるためには、EXTI_GenerateSWInterrupt関数(ライブラリ 15?6)を使用します。
ライブラリ 15?6 EXTI_GenerateSWInterrupt関数
関数プロトタイプ |
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line )
|
|
動作 |
ソフトウェア割込みを発生させます。 |
|
引数 |
EXTI_Line |
確認する対象のEXTIラインをEXTI_Linexで指定します。xには0から19までの数値が入ります。 |
戻り値 |
無し |
サンプルプログラムでは以下の通り無限ループ内で0.1秒毎にEXTIライン5の割込みを発生させています。TIM4割込みが並行して動作しているのですが、EXTI9_5割込みの優先度を高く設定しているので、メインルーチンが呼び出したEXTI9_5割込みハンドラの処理が優先して実行されます。
while (1) ? { ??? //PCLK2 is 36 MHz. Wait time is twice of argument. ??? delay_ms(500); ??? // Generate software interrupt ??? EXTI_GenerateSWInterrupt(EXTI_Line5); ? } |
これでメインルーチンから既存の割込み処理より優先度の高い処理を実行できたことになります。もちろんタイマを止めるなり、割込みを禁止するなりの処理ができる場合であればよいのですが、タイマのタイミングを狂わせたくない場合やタイマの割込み処理はそれはそれで実行したい場合もあるでしょう。またEXTIラインの割込みハンドラ関数を、EXTIボタンが押されていない場合にも利用したいということもあるかと思います。そのような場合にソフトウェア割込みは非常に便利な機能であるといえます。
Previous: 9.2. EXTI割込み(ライン5-15) |
Up: 9. 外部割込み/イベントコントローラ(EXTI) |
Next: 10. 低電力モード |