QC

How to Use Interrupts in STM32F103C8

 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

Ngắt có thể được phân loại rộng rãi thành hai loại:

Ngắt phần cứng: Nếu tín hiệu đến bộ xử lý là từ một số thiết bị bên ngoài như nút hoặc cảm biến hoặc từ một số thiết bị phần cứng khác tạo ra tín hiệu và yêu cầu bộ xử lý thực hiện tác vụ cụ thể hiện có trong ISR được gọi là ngắt phần cứng.

Ngắt phần mềm: Ngắt do phần mềm hướng dẫn tạo ra.

 
Quy trình dịch vụ gián đoạn

Quy trình dịch vụ ngắt hoặc trình xử lý ngắt là một sự kiện có một tập hợp nhỏ các lệnh trong đó và khi xảy ra ngắt, bộ xử lý đầu tiên thực thi các mã này có trong ISR và sau đó tiếp tục với tác vụ mà nó đã thực hiện trước khi có ngắt.

Syntax for Interrupt in STM32

ISR có cú pháp đính kèm sau (digitalPinToInterrupt (pin), ISR, chế độ) trong Arduino và tương tự cũng có thể được sử dụng trong STM32 khi chúng ta sử dụng arduino IDE để tải lên mã.

digitalPinToInterrupt (pin): Giống như trong board Arduino Uno, chúng ta có các chân 2,3 & trong mega, chúng ta có 2,3,18,19,20,21 cho các ngắt. Trong STM32F103C8 chúng tôi cũng có các chân ngắt bất kỳ chân GPIO nào có thể được sử dụng cho ngắt. Chúng tôi chỉ xác định chân đầu vào mà chúng tôi đang sử dụng để ngắt. Nhưng trong khi sử dụng nhiều ngắt cùng lúc, chúng ta có thể cần tuân theo một số hạn chế.
ISR: Đây là một hàm xử lý ngắt được gọi khi xảy ra ngắt bên ngoài. Nó không có đối số và kiểu trả về void.
Chế độ: Loại chuyển đổi để kích hoạt ngắt
RISING: Để kích hoạt ngắt khi chân chuyển từ THẤP đến CAO.
FALLING: Để kích hoạt ngắt khi chân chuyển từ CAO xuống THẤP.
THAY ĐỔI: Để kích hoạt ngắt khi chân chuyển từ THẤP sang CAO hoặc CAO sang THẤP (tức là khi chân thay đổi).
Một số điều kiện khi sử dụng ngắt

Chức năng định kỳ dịch vụ ngắt (ISR) phải càng ngắn càng tốt.
Hàm Delay () không hoạt động bên trong ISR và nên tránh.

Components Required

  • STM32F103C8
  • Push button
  • LED
  • Resistor (10K)
  • LCD (16x2)



Một bên của chân nút nhấn được kết nối với 3,3V của STM32 và bên kia được kết nối với chân đầu vào (PA0) của STM32 thông qua một điện trở kéo xuống.

Điện trở Kéo Xuống được sử dụng để bộ vi điều khiển chỉ nhận được mức CAO hoặc THẤP tại đầu vào của nó khi nút được nhấn hoặc thả. Nếu không, nếu không có điện trở kéo xuống, MCU có thể bị nhầm lẫn và cấp một số giá trị thả nổi ngẫu nhiên vào đầu vào.


Connection between STM32F103C8 and LCD

Bảng sau đây cho thấy kết nối chân giữa màn hình LCD (16X2) và vi điều khiển STM32F103C8.

STM32F103C8LCD
GNDVSS
+5VVDD
To Potentiometer Centre PINV0
PB0RS
GNDRW
PB1E
PB10D4
PB11D5
PC13D6
PC14D7
+5VA
GNDK



Programming STM32F103C8 for interrupts

Chương trình cho hướng dẫn này rất đơn giản và được đưa ra ở cuối hướng dẫn này. Chúng tôi không cần lập trình viên FTDI để lập trình STM32, chỉ cần kết nối PC của bạn với cổng USB của STM32 và bắt đầu lập trình với Arduino IDE. Tìm hiểu thêm về lập trình STM32 qua cổng USB.

Như chúng tôi đã nói ở đây trong hướng dẫn này, chúng tôi 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’.

Đầu tiên xác định các kết nối chân LCD với STM32. Bạn có thể sửa đổi nó theo yêu cầu của bạn.

const int rs= PB10,en= PB11,d4= PB0,d5= PB1,d6= PC13,d7= PC14;    
Tiếp theo, chúng tôi bao gồm tệp tiêu đề cho màn hình LCD. Điều này gọi thư viện chứa mã về cách STM32 sẽ giao tiếp với màn hình LCD. Ngoài ra, hãy đảm bảo rằng hàm LiquidCrystal được gọi bằng các tên pin mà chúng ta vừa xác định ở trên.

include<LiquidCrystal.h>                                         
LiquidCrystal lcd (rs,en,d4,d5,d6,d7);        
Các biến toàn cục được sử dụng để truyền dữ liệu giữa ISR và chương trình chính. Chúng tôi khai báo biến ledOn là biến và cũng như Boolean để chỉ định True hoặc False.


volatile boolean ledOn = false;
Bên trong hàm void setup (), chúng tôi sẽ hiển thị thông báo giới thiệu và xóa nó sau 2 giây.

lcd.begin(16,2);                                                
lcd.print("CIRCUIT DIGEST");                                   
delay(2000);                                                   
lcd.clear();     
Một lần nữa trong cùng một hàm void setup (), chúng ta cần chỉ định các chân đầu vào và đầu ra. Chúng tôi đặt chân PA1 cho đầu ra đến LED và PA0 cho đầu vào từ nút nhấn.

pinMode(PA1,OUTPUT)
pinMode(PA0,INPUT)
Chúng ta cũng sẽ tăng một số, vì vậy hãy khai báo một biến có giá trị bằng không.

int i = 0;
Bây giờ phần quan trọng của mã là hàm đính kèm (), nó cũng được bao gồm bên trong void setup ()
attachInterrupt(digitalPinToInterrupt(PA0),buttonPressed,CHANGE)
Chúng tôi đã chỉ định chân PA0 cho ngắt bên ngoài và buttonPressed là chức năng được gọi khi có THAY ĐỔI (THẤP đến CAO hoặc CAO thành THẤP) trong chân PA0. Bạn cũng có thể sử dụng bất kỳ tên chức năng, mã pin và chế độ nào khác tùy theo yêu cầu.

Bên trong vòng lặp void (), chúng tôi tăng một số (i) từ 0 và in số đó trong màn hình LCD (16x2).
lcd.clear();                                                    
lcd.print("NUMBER:");                                           
lcd.print(i);                  
++i;                                                           
delay(1000);   
Phần quan trọng nhất là tạo một hàm xử lý ngắt theo tên mà chúng ta đã sử dụng trong hàm AttachInterrupt (). Chúng tôi đã sử dụng buttonPressed nên ở đây chúng tôi đã tạo một hàm void buttonPressed ()


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:


Theo giá trị của biến ledOn, đèn LED BẬT và TẮT.


Nếu giá trị ledOn là false thì đèn LED vẫn tắt và nếu giá trị ledOn là True thì đèn LED sẽ bật và màn hình LCD hiển thị ‘Ngắt’ trên đó.

LƯU Ý: Đôi khi có thể có hiệu ứng xóa công tắc và nó có thể đếm nhiều lần kích hoạt khi nhấn nút nhấn, điều này là do một số đột biến điện áp do lý do cơ học của nút nhấn chuyển đổi. Điều này có thể được giảm bớt bằng cách sử dụng bộ lọc RC.

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
  }
}



























Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...