割り込みは、I / Oまたは命令がプロセッサの通常の実行を一時停止し、優先度が最も高いようにそれ自体が処理されるメカニズムです。たとえば、通常の実行を実行しているプロセッサは、ある種のイベントや割り込みの発生を継続的に監視することもできます。つまり、外部割り込みが発生すると(センサーなどから)、プロセッサは通常の実行を一時停止し、最初に割り込みを処理してから、通常の実行を続行します。
このプロジェクトでは、STM32F103C8の割り込みを理解するために、プッシュボタンを外部割り込みとして使用します。ここでは、0から数値をインクリメントして16x2 LCDに表示します。プッシュボタンを押すと、LEDがオンになり、LCDディスプレイにINTERRUPTが表示されます。ボタンを離すとすぐにLEDが消灯します。
割り込みの種類とISR
割り込みは大きく2つのタイプに分類できます。
ハードウェア割り込み: プロセッサへの信号がボタンやセンサーなどの外部デバイスからのものであるか、信号を生成してプロセッサにISRに存在する特定のタスクを実行するように指示する他のハードウェアデバイスからのものである場合、ハードウェア割り込みと呼ばれます。
ソフトウェア割り込み:ソフトウェア命令によって生成される割り込み。
割り込みサービスルーチン
割り込みサービスルーチンまたは割り込みハンドラは、命令の小さなセットが含まれるイベントであり、割り込みが発生すると、プロセッサは最初にISRに存在するこれらのコードを実行し、次に割り込みの前に実行していたタスクを続行します。
STM32での割り込みの構文
ISRには、Arduinoで次の構文attachInterrupt(digitalPinToInterrupt(pin)、ISR、mode)があり、arduino IDEを使用してコードをアップロードするため、STM32でも同じものを使用できます。
- digitalPinToInterrupt(pin): ArduinoボードUnoのように、ピン2、3があり、メガでは、割り込み用に2、3、18、19、20、21があります。STM32F103C8には、割り込みピンもあります。GPIOピンは割り込みに使用できます。割り込みに使用する入力ピンを指定するだけです。ただし、同時に複数の割り込みを使用する場合は、いくつかの制限に従う必要がある場合があります。
- ISR:外部割り込みが発生したときに呼び出される割り込みハンドラ関数です。引数はなく、戻り値の型はvoidです。
- モード:割り込みをトリガーする遷移のタイプ
- RISING:ピンがLOWからHIGHに遷移するときに割り込みをトリガーします。
- FALLING:ピンがHIGHからLOWに遷移するときに割り込みをトリガーします。
- 変更:ピンがLOWからHIGHまたはHIGHからLOWに遷移するとき(つまり、ピンが変更されるとき)に割り込みをトリガーします。
割り込み使用中のいくつかの条件
- 割り込みサービスルーチン機能(ISR)はできるだけ短くする必要があります。
- Delay()関数はISR内では機能しないため、回避する必要があります。
必要なコンポーネント
- STM32F103C8
- ボタンを押す
- 導いた
- 抵抗器(10K)
- LCD(16x2)
回路図と接続
押しボタンピンの一方の側はSTM32の3.3Vに接続され、もう一方の側はプルダウン抵抗を介してSTM32の入力ピン(PA0)に接続されます。
プルダウン抵抗は、ボタンが押されたときまたは離されたときにのみマイクロコントローラが入力でHIGHまたはLOWになるように使用されます。そうしないと、プルダウン抵抗がないと、MCUが混乱して、ランダムな浮動値を入力に供給する可能性があります。
STM32F103C8とLCD間の接続
次の表に、LCD(16X2)とSTM32F103C8マイクロコントローラ間のピン接続を示します。
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
ポテンショメータセンターPINへ |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
割り込み用のSTM32F103C8のプログラミング
このチュートリアルのプログラムは単純で、このチュートリアルの最後に記載されています。STM32をプログラミングするのにFTDIプログラマーは必要ありません。PCをSTM32のUSBポートに接続し、ArduinoIDEでプログラミングを開始するだけです。USBポートを介したSTM32のプログラミングの詳細をご覧ください。
このチュートリアルで述べたように、0から数値をインクリメントして16x2 LCDに表示し、プッシュボタンを押すとLEDがオンになり、LCDディスプレイに「INTERRUPT」と表示されます。
まず 、STM32でLCDピン接続を定義します。要件に応じて変更できます。
const int rs = PB10、en = PB11、d4 = PB0、d5 = PB1、d6 = PC13、d7 = PC14;
次に、 LCDディスプレイのヘッダーファイルを インクルードします。これにより、STM32がLCDと通信する方法のコードを含むライブラリが呼び出されます。また、関数 LiquidCrystal が、上記で定義したピン名で呼び出されていることを確認して ください 。
含める
グローバル変数は、ISRとメインプログラムの間でデータを渡すために使用されます。変数 ledOn を揮発性として宣言し、TrueまたはFalseを指定するブール値としても宣言します。
揮発性ブールledOn = false;
void setup() 関数内に、イントロメッセージを表示し、2秒後にクリアします。
lcd.begin(16,2); lcd.print( "CIRCUIT DIGEST"); delay(2000); lcd.clear();
再び同じ voidsetup() 関数で、入力ピンと出力ピンを指定する必要があります。LEDへの出力用にPA1ピンを設定し、押しボタンからの入力用にPA0を設定します。
pinMode(PA1、OUTPUT) pinMode(PA0、INPUT)
また、数値をインクリメントするので、値がゼロの変数を宣言します。
int i = 0;
コードの重要な部分は attachInterrupt() 関数であり、 void setup() 内にも含まれてい ます。
attachInterrupt(digitalPinToInterrupt(PA0)、buttonPressed、CHANGE)
外部割り込み用に PA0 ピンを指定しました 。buttonPressed は、PA0ピンにCHANGE(LOWからHIGHまたはHIGHからLOW)があるときに呼び出される関数です。要件に応じて、他の関数名、ピン、およびモードを使用することもできます。
void loop() 内で、数値(i)をゼロからインクリメントし、LCD(16x2)に数値を出力します。
lcd.clear(); lcd.print( "NUMBER:"); lcd.print(i); ++ i; delay(1000);
最も重要な部分は、 attachInterrupt() 関数で使用した名前に従って割り込みハンドラー関数を作成することです。 buttonPressed を使用したので、ここで関数 void buttonPressed() を作成しました
void buttonPressed() { if(ledOn) { ledOn = false; digitalWrite(PA1、LOW); } else { ledOn = true; digitalWrite(PA1、HIGH); lcd.setCursor(0,1); lcd.print( "割り込み"); } }
この buttonPressed() ISRの動作:
ledOn 変数の値に 応じて 、LEDがオン/オフします。
ボタンの状態 |
ledOn(値) |
LED(赤) |
LCD(16x2) |
押されていない |
誤り |
オフ |
- |
押された |
本当 |
オン |
''割り込み 'を表示します |
ledOn 値がfalseの場合、LEDはオフのままになり、 ledOn 値がTrueの場合、LEDがオンになり、LCDディスプレイに「割り込み」と表示されます。
注:スイッチのデバウンス効果がある場合があり、プッシュボタンが押されたときに複数のトリガーがカウントされる場合があります。これは、プッシュボタンを切り替える機械的な理由による電圧のスパイクがいくつかあるためです。これは、RCフィルターを導入することで減らすことができます。
STM32F103C8での割り込みの完全な 動作は 、 以下のビデオに示されています。