Cách phân biệt các chân sinh ra ngắt trên vi điều khiển STM32

Làm sao để biết yêu cầu ngắt được tạo ra từ chân GPIO nào khi chương trình của bạn sử dụng nhiều chân External Interrupt? Trong bài viết này, mình sẽ giúp các bạn giải quyết được vấn đề trên với các ví dụ cụ thể. Mình sử dụng vi điều khiển STM32F103C8T6, cấu hình bằng STM32CubeMX sau đó code bằng Keil C IDE, sử dụng thư viện HAL. 

[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

Ví dụ mình có 02 nút bấm ở chân PA1 và PA2 khai báo External Interrupt, sử dụng trở kéo lên để định mức logic khi không nhấn nút, sử dụng sườn xuống để kích hoạt ngắt. Mình cấu hình thêm chân PC13 là GPIO OUTPUT để điều khiển LED.  

Khi sinh code ra thì sẽ có các hàm liên quan đến ngắt ngoài trong thư viện HAL như sau:

Trong file stm32f1xx_hal_gpio.c

Trong file stm32f1xx_it.c: 

Bình thường, với 1 chương trình đơn giản, các bạn vào file stm32f1xx_hal_gpio.c copy cả phần định nghĩa hàm Callback ra file main.c, bỏ đi từ khóa weak và viết chương trình phục vụ ngắt vào đấy là xong. Ví dụ khi phát hiện nhấn nút (có sườn xuống tại bất 1 trong 2 chân đã khai báo) thì đảo trạng thái của LED.

Nếu bài toán không phải là đảo LED khi nhấn bất kì 1 trong 2 nút bấm mà là nhấn nút PA1 thì bật LED còn nhấn nút PA2 thì tắt LED thì các bạn phải trả lời được câu hỏi:Làm sao để có thể phân biệt được chân nào đang sinh ra ngắt?
Có 2 cách:
Cách 1: Sử dụng hàm Callback như trên, tuy nhiên trong hàm Callback các bạn kiểm tra xem chân nào đang được truyền vào hàm thì chính là ngắt tại chân đó. Ví dụ:

Cách 2: Viết nội dung ngắt riêng cho từng line ngay tại các hàm phục vụ ngắt theo line trong file thư viện file stm32f1xx_it.c

Xem thêm: Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây. Nếu có bất kì thắc mắc gì, hãy để lại bình luận.

Chúc các bạn thành công! 

Nhóm TAPIT ARM R&D