中斷是一種機制,通過這種機制,I/O或指令可以暫停處理器的正常執(zhí)行,并像具有最高優(yōu)先級一樣先執(zhí)行自己的任務。也就是說,當外部中斷發(fā)生時(比如來自某個傳感器),處理器暫停其正在執(zhí)行,首先提供中斷服務,然后繼續(xù)其正常執(zhí)行。
為了了解 STM32F103C8 中的中斷,我們將使用按鈕作為外部中斷。在這里,我們讓一個變量從 0 開始每秒增1,并將其顯示在16x2 LCD上,每當按下按鈕時,LED 亮起,LCD 顯示屏會顯示 INTERRUPT。
中斷類型和 ISR(中斷服務程序)
中斷大致可以分為兩類:
1.硬件中斷: 如果到處理器的信號來自某些外部設備,例如按鈕或傳感器,或者來自其他信號并告訴處理器執(zhí)行 ISR 中存在的特定任務的硬件設備,則稱為硬件中斷。
2.軟件中斷: 由軟件指令產(chǎn)生的中斷。
ISR 中斷服務程序:
中斷服務程序或中斷處理程序是其中包含少量指令的事件,當發(fā)生中斷時,處理器首先執(zhí)行 ISR 中的這些代碼,然后再繼續(xù)執(zhí)行中斷之前正在執(zhí)行的任務。
STM32中的中斷語法
在Arduino IDE中,啟用ISR具有以下語法attachInterrupt (digitalPinToInterrupt(pin), ISR, mode),同樣可以在 STM32 中使用,因為本文正是使用 arduino IDE 上傳代碼。
digitalPinToInterrupt(pin)
在STM32F103C8中,任何GPIO引腳都可以用于中斷。我們只需要指定用于中斷的輸入引腳。但是,當同時使用多個中斷時,我們可能需要遵循一些限制。
ISR 中斷子程序
它是一個在發(fā)生外部中斷時調用的中斷處理函數(shù)。它沒有參數(shù)和返回值。
mode:觸發(fā)中斷的方式條件
上升沿觸發(fā):當引腳從 低電平變?yōu)?高電平時觸發(fā)中斷。
下降沿觸發(fā):當引腳從 高電平變?yōu)?低電平時觸發(fā)中斷。
雙邊沿觸發(fā):當引腳從 低電平變?yōu)?高電平或 高電平變?yōu)?低電平時觸發(fā)中斷(即,當引腳電平發(fā)生變化時)。
使用中斷注意事項
中斷服務程序功能 (ISR) 必須盡可能短。
避免在ISR中使用delay函數(shù)。
電路圖和連接說明
按鈕引腳的一側連接到 STM32 的 3.3V,另一側通過下拉電阻連接到 STM32 的輸入引腳(PA0)。
關于使用下拉電阻器,當按下或釋放按鈕時,微控制器只會在其輸入端獲得高電平或低電平。如果沒有下拉電阻,按鈕沒有按下,輸入端狀態(tài)不確定(不是高也不是低),并且容易受外界影響,輸入端電平可能是浮動隨機值(忽高忽低)。
STM32F103C8與LCD的連接
下表顯示了 LCD (1602) 和 STM32F103C8 微控制器之間的引腳連接。
STM32F103C8中斷編程
程序很簡單,使用Arduino IDE編程。
我們將一個變量從 0 開始每秒自增1并將其顯示在 1602 LCD 上,每當按下按鈕時,LED亮起,LCD 顯示屏會顯示“Interrupt”,松開按鈕LED熄滅。
//聲明LCD 引腳連接到STM32 的哪個引腳
const int rs= PB10,en= PB11,d4= PB0,d5= PB1,d6= PC13,d7= PC14;
#include //LCD 庫
LiquidCrystal lcd (rs,en,d4,d5,d6,d7);//初始化LCD
volatile boolean ledOn = false; //LED狀態(tài)標識
void setup()
{
lcd.begin(16,2);// 將 LCD 設置為 16x2 類型
lcd.print("Hello World"); //LCD 顯示 Hello World!
delay(2000); //延時2秒
lcd.clear(); //清屏
pinMode(PA1,OUTPUT); //將引腳 PA1 設置為輸出
pinMode(PA0,INPUT); //將引腳 PA0 設置為輸入
int i = 0;
attachInterrupt(PA0,buttonPressed,CHANGE);// 創(chuàng)建外部中斷
}
void loop()
{
lcd.clear();//清屏
lcd.print("NUMBER:"); //LCD顯示NUMBER:
lcd.print(i);//LCD 顯示“i”值
++i; //“i” 自增 1
delay(1000); //延時1秒
}
void buttonPressed() //ISR中斷子函數(shù)
{
//松開按鈕
if(ledOn) //當發(fā)生中斷時判斷LED 狀態(tài)標識,如果LED是亮起狀態(tài)
{
ledOn=false; //則設置LED狀態(tài)標識為熄滅
digitalWrite(PA1,LOW); //同時把PA1設置為低電平,熄滅LED
}
//按下按鈕
else // 否則(即如果LED狀態(tài)標識為熄滅)
{
ledOn = true; //則設置LED狀態(tài)標識為亮起
digitalWrite(PA1,HIGH); //同時把PA1設置為高電平,點亮LED
lcd.setCursor(0,1); //將光標設置在第一列和第二行
lcd.print("Interrupt"); //LCD顯示Interrupt
}
}
-
處理器
+關注
關注
68文章
19286瀏覽量
229855 -
中斷
+關注
關注
5文章
898瀏覽量
41502 -
i/o
+關注
關注
0文章
33瀏覽量
4593
發(fā)布評論請先 登錄
相關推薦
評論