How to Use Interrupts in STM32F103C8
Ngắt là một cơ chế mà I / O hoặc một lệnh có thể tạm dừng việc thực thi bình thường của bộ xử lý và tự nó được phục vụ giống như nó có mức ưu tiên cao nhất. Chẳng hạn như, một bộ xử lý đang thực hiện một quá trình bình thường cũng có thể liên tục theo dõi một số loại sự kiện hoặc một ngắt xảy ra. Đó là khi một ngắt bên ngoài xảy ra (như từ một số cảm biến) thì bộ xử lý tạm dừng thực thi bình thường của nó và đầu tiên phục vụ ngắt và sau đó tiếp tục thực thi bình thường của nó.
Ở đây trong dự án này, để hiểu về các ngắt trong STM32F103C8, chúng tôi sẽ sử dụng nút nhấn làm ngắt bên ngoài. Ở đây chúng ta sẽ tăng một số từ 0 và hiển thị nó trên màn hình LCD 16x2, và bất cứ khi nào nhấn nút nhấn, đèn led sẽ BẬT và màn hình LCD hiển thị INTERRUPT. Đèn LED tắt ngay khi thả nút.
Types of Interrupts and ISR
Syntax for Interrupt in STM32
Components Required
- STM32F103C8
- Push button
- LED
- Resistor (10K)
- LCD (16x2)
Connection between STM32F103C8 and LCD
STM32F103C8 | LCD |
GND | VSS |
+5V | VDD |
To Potentiometer Centre PIN | V0 |
PB0 | RS |
GND | RW |
PB1 | E |
PB10 | D4 |
PB11 | D5 |
PC13 | D6 |
PC14 | D7 |
+5V | A |
GND | K |
Programming STM32F103C8 for interrupts
const int rs= PB10,en= PB11,d4= PB0,d5= PB1,d6= PC13,d7= PC14;
include<LiquidCrystal.h> LiquidCrystal lcd (rs,en,d4,d5,d6,d7);
volatile boolean ledOn = false;
lcd.begin(16,2); lcd.print("CIRCUIT DIGEST"); delay(2000); lcd.clear();
pinMode(PA1,OUTPUT) pinMode(PA0,INPUT)
int i = 0;
attachInterrupt(digitalPinToInterrupt(PA0),buttonPressed,CHANGE)
lcd.clear(); lcd.print("NUMBER:"); lcd.print(i); ++i; delay(1000);
void buttonPressed() { if(ledOn) { ledOn=false; digitalWrite(PA1,LOW); } else { ledOn = true; digitalWrite(PA1,HIGH); lcd.setCursor(0,1); lcd.print("Interrupt"); } }
Working of this buttonPressed() ISR:
const int rs= PB10,en= PB11,d4= PB0,d5= PB1,d6= PC13,d7= PC14; // declaring pin names and pin numbers of lcd
#include<LiquidCrystal.h> // including lcd display library
LiquidCrystal lcd (rs,en,d4,d5,d6,d7); // setting lcd and its parameters
volatile boolean ledOn = false; // variable declared as global
void setup()
{
lcd.begin(16,2); // setting LCD as 16x2 type
lcd.print("CIRCUIT DIGEST"); // puts CIRCUIT DIGEST IN LCD
delay(2000); // delay time
lcd.clear(); // clears lcd display
pinMode(PA1,OUTPUT); // set pin PA1 as output
pinMode(PA0,INPUT); // set pin PA0 as input
int i = 0; // declare variable i and initiliaze with 0
attachInterrupt(PA0,buttonPressed,CHANGE); // function for creating external interrupts
}
void loop() // void loops runs continuously
{
lcd.clear(); // clears lcd display
lcd.print("NUMBER:"); // puts NUMBER: in LCD display
lcd.print(i); // prints the values of i in LCD
++i; // increments value of i
delay(1000); // delays time
}
void buttonPressed() //
{
if(ledOn) // if statement depends on LedOn value
{
ledOn=false; // Makes ledOn false if it is True
digitalWrite(PA1,LOW); // digital writs the low vale to PA1 pin makes led OFF
}
else
{
ledOn = true; // Makes ledOn True if it is False
digitalWrite(PA1,HIGH); // digital writs the HIGH vale to PA1 pin makes led ON
lcd.setCursor(0,1); // sets cursor at first column and second row
lcd.print("Interrupt"); // puts INTERRUPT in LCD display
}
}