前回ではGPIOを用いてLEDの点灯/点滅を制御しました.
今回は,割り込みという機能を用いて,主に外部(またはペリフェラル)からの信号をもとにしてプログラムを動かす方法について検討します.(?)
WDGタイマも紹介したい.

割り込み

マイコンは,外部(またはペリフェラル)からの信号を検知したとき,プログラムの実行を一時停止して特別な処理に移行することができます.特別な処理が完了したら元の処理を再開します.この動作を割り込みといい,"特別な処理"にあたる関数を割り込みハンドラといいます.

トリガ(?)

割り込みのソース(?;割り込みを発生させるもの)には様々なものがあります.GPIOピンやタイマーの状態変化,ADCの処理完了などがその例ですが,他にも多数あります.
/* 割り込みソースのテーブルを追加 */

NVIC

STM32マイコン(に限らず恐らくほぼすべてのARMマイコン?)はNVIC(Nested Vector Interrupt Controller?)というペリフェラルをもっています.NVICは,個別の割り込みの有効/無効,優先度を設定するのに用いられます.これによって,例えば2つ以上の割り込みが同時に発生したときに,それらを開発者が意図した順番で処理することが可能となります(なるはずです?).

HardFaultとか

書きかけ
NVICはほぼ全ての割り込みを制御できますが,一部の割り込みは対象外です.例:Hard_Fault,NMI (Non-Maskable Interrupt) など

C++ での割り込みの利用

STM32で割り込みを使用するコードをC++で書いたとき,割り込みハンドラが正常に呼び出されない場合があります.
これは,割り込みハンドラ関数が.cppファイルに記述されている場合に発生します.
割り込みハンドラ関数は,Cリンケージであることが求められます.これは,関数の定義にextern "C"と記載するか,割り込みハンドラ関数の定義全体をextern "C" { ... }ブロックで囲うことで実現されます.

具体的には,次のようです.
extern "C" void SysTick_IRQHandler(void)
{
    ...
} 

あるいは,次のようです.
extern "C" {
 
void SysTick_IRQHandler(void)
{
    ...
}
 
} 

1つのファイルに複数の割り込みハンドラ関数が含まれる場合は後者の書き方のほうが楽でしょう.
最終更新:2017年11月25日 20:59