Skip to content

13 Giới Thiệu Nguyên Lý Ngắt (Interrupt)

Kiến Thức Cơ Bản Về Ngắt

Ngắt Là Gì?

Việc sử dụng ngắt một cách linh hoạt giúp tăng cường khả năng xử lý sự kiện ngẫu nhiên theo thời gian thực cho vi điều khiển, từ đó nâng cao hiệu suất hệ thống.

Ví dụ đơn giản: bạn đang ngồi lập trình, bỗng có cuộc điện thoại gọi đến → bạn ngừng lập trình để nghe điện thoại, sau khi xong mới quay lại lập trình tiếp. Trong ví dụ này:

  • Cuộc điện thoại chính là ngắt (interrupt) – làm gián đoạn công việc hiện tại.

  • Việc nghe điện thoại là trình phục vụ ngắt (ISR – Interrupt Service Routine).

  • Sau khi xử lý xong, quay lại công việc trước đó.

    img

Ngắt Ngoài (External Interrupt)

Trong STM32, EXTI (External Interrupt/Event Controller) gồm 23 kênh phát hiện cạnh độc lập, có thể tạo ra yêu cầu ngắt hoặc sự kiện đánh thức (wake-up).

EXTI hỗ trợ 3 chế độ kích hoạt:

  • Cạnh lên (rising edge)
  • Cạnh xuống (falling edge)
  • Cạnh bất kỳ (both edges)

Mỗi kênh có thể cấu hình riêng biệt và có thể bật/tắt độc lập.

Mỗi ngắt có 4 bit cấu hình ưu tiên, cho phép thiết lập 16 mức ưu tiên khác nhau.

Nguồn Kích Hoạt Ngắt (Interrupt Sources)

Vi điều khiển STM32F407 có 23 đường EXTI, bao gồm:

  • EXTI 0–15: Tương ứng với các chân IO ngoài (ví dụ: PA0–PA15, PB0–PB15,...)
  • EXTI 16: Kết nối với tín hiệu từ PVD (Power Voltage Detector)
  • EXTI 17: Kết nối với sự kiện báo thức từ RTC
  • EXTI 18: Kết nối với sự kiện đánh thức từ USB OTG FS
  • EXTI 19: Kết nối với sự kiện đánh thức từ Ethernet
  • EXTI 20: Kết nối với sự kiện đánh thức từ USB OTG HS
  • EXTI 21: Kết nối với sự kiện timestamp/intrusion từ RTC
  • EXTI 22: Kết nối với sự kiện đánh thức từ RTC

Sự Kiện Ngắt (Interrupt Events)

Ngoài ngắt, EXTI còn có thể tạo ra sự kiện (event) để đánh thức hệ thống. STM32 tích hợp một bộ điều khiển đánh thức (WIC - Wake-up Interrupt Controller) giúp hệ thống (CPU và NVIC) vào chế độ siêu tiết kiệm điện, và chỉ đánh thức lại khi có sự kiện quan trọng.

EXTI có thể đánh thức hệ thống từ trạng thái tiết kiệm điện khi xảy ra sự kiện kích hoạt đã định trước.

Ưu Tiên Ngắt (Interrupt Priority)

Mỗi ngắt có 4 bit ưu tiên có thể cấu hình. Khi lập trình, ta cần xác định:

  • Ưu tiên tiền chiếm (Preemption Priority) – xác định ngắt có thể ngắt giữa một ngắt khác hay không.
  • Ưu tiên phản hồi (Subpriority / Response Priority) – xác định thứ tự xử lý nếu nhiều ngắt xảy ra cùng lúc.

Quy tắc hoạt động:

  • Ngắt có tiền chiếm thấp hơn (giá trị lớn hơn) không thể chen vào khi ngắt ưu tiên cao hơn đang chạy.
  • Nếu tiền chiếm bằng nhau, ngắt đến sau phải chờ ngắt đến trước xử lý xong.
  • Nếu nhiều ngắt đến cùng lúc và có cùng tiền chiếm, thì ngắt có phản hồi cao hơn (subpriority thấp hơn) sẽ được xử lý trước.
  • Nếu cả hai giống nhau → chọn theo vị trí trong bảng vector ngắt, cái nào ở trên sẽ được ưu tiên.

Việc cấu hình nhóm ưu tiên thường chỉ cần thiết lập một lần duy nhất cho toàn hệ thống. Sau đó, ta chỉ cần gán giá trị tiền chiếm và phản hồi cho từng ngắt cụ thể.