中斷是MCU的特征之一,STM32F103C8T6也不例外。以下通過STM32F103C8T6 Blue Pill外接一個按鈕,向MCU觸發(fā)外部中斷。
STM32F103C8T6中斷特征
中斷有硬件中斷和軟件中斷兩種,當(dāng)一個中斷發(fā)生時,相應(yīng)的中斷服務(wù)程序(ISR)和中斷處理程序就開始運行了。其中,ISR的指令必須盡可能小,ISR中也不能出現(xiàn)delay ()之類的阻塞函數(shù)。
STM32 Blue Pill或者STM32F103C8T6 MCU指定NVIC來管理所有外部中斷和外設(shè)中斷,其應(yīng)用采用了Arduino IDE。因此,我們可使用相同的句法來配置外部中斷,這可通過以下稱作 “attachInterrupt ()” 的句法給出:
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
該句法的第一個參數(shù) digitalPinToInterrupt(pin) 代表預(yù)期外部中斷的MCU引腳,例如,如果按鈕連接于PA0,該參數(shù)就變成“digitalPinToInterrupt(PA0)”。
第二個參數(shù)是ISR函數(shù),該函數(shù)必須具有 void 返回類型,不能代任何參數(shù)。
第三個函數(shù)是是觸發(fā)中斷的模式,例如,信號突變到哪個點位時,必須觸發(fā)一個中斷。Arduino環(huán)境下,該參數(shù)通常為5個用戶預(yù)定義的常數(shù),但STM32須從如下3個選項中選取:
?CHANGE: 在引腳數(shù)值改變時觸發(fā)中斷。
?RISING: 當(dāng)引腳數(shù)值從LOW 上升到 HIGH 時觸發(fā)中斷。
?FALLING: 當(dāng)引腳數(shù)值從 HIGH 回落到 LOW 時觸發(fā)中斷。
用按鈕為STM32 MCU觸發(fā)一個中斷
本項目所需元件包括:STM32F103C8T6藍(lán)丸版、按鈕、USB-UART轉(zhuǎn)換器、USB電纜,杜邦線。
首先,將按鈕連接到 PA0 引腳,并通過一個4.7KΩ電阻器上拉到HIGH ,另一引腳接 GND。
以下代碼用以激勵 PA0 引腳的中斷,button_ISR用來切換LED。
int ledPin = PC13;
int buttonPin = PA0;
int ledToggle;
int previousState = HIGH;
unsigned int previousPress = 0;
volatile int buttonFlag;
int buttonDebounce = 20;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), button_ISR, CHANGE);
}
void loop()
{
if((millis() – previousPress) > buttonDebounce && buttonFlag)
{
previousPress = millis();
if(digitalRead(buttonPin) == LOW && previousState == HIGH)
{
ledToggle =! ledToggle;
digitalWrite(ledPin, ledToggle);
previousState = LOW;
}
else if(digitalRead(buttonPin) == HIGH && previousState == LOW)
{
previousState = HIGH;
}
buttonFlag = 0;
}
}
void button_ISR()
{
buttonFlag = 1;
}
本項目演示了STM32F103C8T6 Blue Pill外部中斷的操作,每按一次按鈕就觸發(fā)一次中斷,STM32 MCU就執(zhí)行一次簡單ISR,返回來切換LED狀態(tài)。
-
mcu
+關(guān)注
關(guān)注
146文章
17317瀏覽量
352630 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41746 -
STM32F103C8T6
+關(guān)注
關(guān)注
109文章
162瀏覽量
83981
發(fā)布評論請先 登錄
相關(guān)推薦
評論