マイコン入門spacer ad
トップページに戻る(マイコン徹底入門:STM32で始めるARM/Cortex-M3組み込み開発)
「マイコン徹底入門」とは? |  「マイコン徹底入門」を読む |  ダウンロード |  掲示板 |  筆者の自己紹介


Previous: 9.2. EXTI割込み(ライン5-15)

Up: 9. 外部割込み/イベントコントローラ(EXTI)

Next: 10. 低電力モード


マイコン徹底入門:周辺回路編:STM32のペリフェラルを活用: 9. 外部割込み/イベントコントローラ(EXTI):

9.3. ソフトウェア割り込み

サンプルプログラム

exti_software_interrupt

 ソフトウェア割り込みを使用してLEDの点灯をコントロールするプログラムです。

 TIM4が割込み処理によりオンボードLED0.1秒間隔で点滅させます。その間に、EXTI9_5割込みが発生し、0.5秒間隔でLEDを消灯させます。結果、TIM4割込みとEXTI9_5割込みが競合することになりますが、NVICEXTI9_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. 低電力モード


このページはITと知的財産の法律情報「法務ネット」の管理人が制作・運営しています。
_Toc266801166