- Các loại ngắt và ISR
- Cú pháp ngắt trong STM32
- Thành phần bắt buộc
- Sơ đồ mạch và kết nối
- Lập trình STM32F103C8 cho ngắt
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. Như ví dụ, một bộ xử lý thực hiện một quá trình thực thi 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 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.
Các loại ngắt và 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ể có trong ISR được gọi là ngắt phần cứng.
Ngắt phần mềm: Các 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ý trước 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 ngắt.
Cú pháp ngắt trong STM32
ISR có cú pháp đính kèm theo cú pháp (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 bảng 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. Tuy nhiên, 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.
Thành phần bắt buộc
- STM32F103C8
- Nút ấn
- Đèn LED
- Điện trở (10K)
- LCD (16x2)
Sơ đồ mạch và kết nối
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.
Kết nối giữa STM32F103C8 và LCD
Bảng sau đây cho thấy kết nối chân giữa LCD (16X2) và vi điều khiển STM32F103C8.
STM32F103C8 |
LCD |
GND |
VSS |
+ 5V |
VDD |
Đến mã PIN của trung tâm chiết áp |
V0 |
PB0 |
RS |
GND |
RW |
PB1 |
E |
PB10 |
D4 |
PB11 |
D5 |
PC13 |
D6 |
PC14 |
D7 |
+ 5V |
A |
GND |
K |
Lập trình STM32F103C8 cho ngắt
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 giao tiếp với màn hình LCD. Đồng thời đảm bảo rằng hàm LiquidCrystal được gọi với các tên pin mà chúng ta vừa xác định ở trên.
bao gồm
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.
boolean dễ bay hơi 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 ("ĐOẠN MẠCH"); chậm trễ (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 thành 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 ta tăng một số (i) từ 0 và in số đó trong màn hình LCD (16x2).
lcd.clear (); lcd.print ("SỐ:"); lcd.print (i); ++ tôi; chậm trễ (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, CAO); lcd.setCursor (0,1); lcd.print ("Ngắt"); } }
Hoạt động của nút này ISR được nhấn () :
Theo giá trị của biến ledOn , đèn LED BẬT và TẮT.
NÚT STATE |
ledOn (Giá trị) |
LED (Đỏ) |
LCD (16x2) |
CHƯA BIẾT |
Sai |
TẮT |
- |
ĐÃ BÁO CHÍ |
Thật |
TRÊN |
Hiển thị '' INTERRUPT ' |
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 giới thiệu bộ lọc RC.
Hoạt động hoàn chỉnh của ngắt trong STM32F103C8 được hiển thị trong video dưới đây.