🌱 STM32 - 7. Giới thiệu về Ngắt ngoài trong Vi Điều Khiển - External Interrupt

🌱 STM32 - 7. Giới thiệu về Ngắt ngoài trong Vi Điều Khiển - External Interrupt

    Bộ điều khiển ngắt ngoài bao gồm tối đa 23 bộ phát hiện cạnh lên/cạnh xuống để tạo ra các yêu cầu ngắt. Mỗi line ngắt đầu vào có thể được cấu hình độc lập để chọn loại (ngắt hoặc sự kiện) kích hoạt tương ứng (falling/rising hoặc cả hai). Mỗi line ngắt cũng có thể được che - mask một cách độc lập. Một thanh ghi Pending để duy trì ngắt ở trạng thái chờ xử lý..

STM32F401 NUCLEO Board

Hình 1: Board STM32F401 NUCLEO với các chân GPIO

Ngắt ngoài là gì và tại sao cần dùng?

    Ngắt ngoài (External Interrupt - EXTI) là cơ chế cho phép vi điều khiển phản ứng ngay lập tức với các sự kiện xảy ra từ bên ngoài, chẳng hạn như nhấn nút, tín hiệu từ cảm biến, hoặc thay đổi trạng thái trên một chân I/O. Không giống như việc kiểm tra trạng thái liên tục (polling), ngắt ngoài giúp tiết kiệm tài nguyên CPU bằng cách chỉ kích hoạt xử lý khi có sự kiện cụ thể xảy ra. Trong STM32, EXTI được thiết kế linh hoạt, hỗ trợ nhiều nguồn ngắt và có thể cấu hình để phù hợp với các ứng dụng khác nhau.

    Ví dụ: Khi nhấn một nút bấm trên board NUCLEO STM32F401 (GPIOC.13), ngắt ngoài có thể được kích hoạt để bật/tắt LED mà không cần CPU liên tục kiểm tra trạng thái nút.

Kiến thức cần thiết

    Để hiểu hơn về ngắt ngoài, các bạn cần đọc hai bài viết sau:

👉 Vector Table và mức ưu tiên ngắt

    Các mức độ ưu tiên ngắt (có thể lập trình), địa chỉ của Vector ngắt, và các Line tương ứng với từng ngắt được quy định trong bảng Vector ngắt - Vector Table. Xem trong Reference Manual (ví dụ, với STM32F401, Vector Table nằm ở Table 38, trang 203).

Interrupt Vector Table

Hình 1: Một phần của Vector Table trong STM32F401

👉 Các nguồn ngắt ngoài trong STM32F401

    Trong STM32F401, EXTI hỗ trợ tối đa 23 line ngắt (EXTI0 đến EXTI22), được kết nối với các nguồn khác nhau:

  • EXTI0 đến EXTI15: Liên kết với các chân GPIO (PAx, PBx, PCx,...). Ví dụ, EXTI0 có thể được gắn với PA0, PB0, hoặc PC0 tùy cấu hình.
  • EXTI16: Dành cho PVD (Programmable Voltage Detector) để phát hiện sự thay đổi điện áp nguồn.
  • EXTI17: Liên kết với RTC Alarm (báo thức thời gian thực).
  • EXTI18: Dùng cho USB OTG FS Wakeup.
  • EXTI19 đến EXTI22: Dành cho các sự kiện khác như RTC Tamper, RTC Wakeup,...

    Các nguồn này được chọn thông qua thanh ghi SYSCFG_EXTICR, sẽ được đề cập chi tiết trong bài tiếp theo.

👉 Một số đặc điểm của ngắt ngoài

  • Mỗi ngắt có thể kích hoạt độc lập và có thể được che - mask độc lập. Mỗi ngắt cũng có những bit status riêng.
  • Có thể xử lý lên đến 23 ngắt/sự kiện.
  • Kiểm tra tín hiệu ngoài có độ rộng xung nhỏ hơn clock trên APB2.

👉 So sánh ngắt ngoài với polling

    Trong lập trình vi điều khiển, có hai cách phổ biến để xử lý tín hiệu từ bên ngoài:

Tiêu chí Polling Ngắt ngoài (EXTI)
Cách hoạt động CPU liên tục kiểm tra trạng thái chân I/O. CPU chỉ phản ứng khi có sự kiện xảy ra.
Hiệu suất Tốn tài nguyên CPU, không hiệu quả với nhiều sự kiện. Tiết kiệm CPU, phù hợp với ứng dụng thời gian thực.
Độ phức tạp Đơn giản, dễ lập trình. Phức tạp hơn, cần cấu hình thanh ghi và NVIC.

    Ngắt ngoài là lựa chọn tối ưu khi cần xử lý nhanh các sự kiện không thường xuyên, như nhấn nút hoặc tín hiệu từ cảm biến.

👉 Sơ đồ khối chức năng của ngắt ngoài STM32F401

External Interrupt Block Diagram

Hình 2: Sơ đồ khối chức năng của ngắt ngoài trong STM32F401

    Có thể thấy các khối thanh ghi của External Interrupt được cấp xung nhịp bằng bus APB2. Đặc điểm các khối chức năng trong External Interrupt:

  • Khối Edge detect circuit, kết nối trực tiếp với các chân I/O (Input line), dùng để phát hiện sườn lên/sườn xuống trên các chân I/O tương ứng được cài đặt chế độ ngắt ngoài.
  • Hai khối Rising/Falling trigger selection register dùng để chọn sườn lên/sườn xuống hoặc cả hai để phát hiện ngắt.
  • Khối Software Interrupt Event register dùng để tạo các ngắt/sự kiện bằng phần mềm.
  • Interrupt mask register, dùng để cho phép che/không che ngắt. Hai chức năng ngắt ở trên (Software hoặc Edge Trigger) khi xảy ra sẽ cần kiểm tra xem ngắt có bị che hay không.
  • Nếu ngắt xảy ra mà không bị che, chúng sẽ được xử lý bằng thanh ghi Pending Request Register. Sau đó, yêu cầu ngắt tương ứng sẽ được gửi đến bộ điều khiển ngắt NVIC để chờ xử lý.

👉 Ví dụ minh họa về ngắt ngoài

    Giả sử bạn muốn dùng nút User Button (GPIOC.13) trên board NUCLEO STM32F401 để kích hoạt ngắt ngoài khi nhấn nút:

  • Cấu hình GPIOC.13 làm nguồn ngắt trên EXTI13.
  • Chọn sườn xuống (falling edge) vì nút bấm nối với GND khi nhấn.
  • Kích hoạt ngắt EXTI13 trong NVIC.
  • Khi nhấn nút, CPU sẽ nhảy đến hàm xử lý ngắt (IRQ Handler) để thực hiện hành động, ví dụ như bật LED (GPIOA.5).

    Ví dụ này sẽ được triển khai chi tiết trong bài tiếp theo với các thanh ghi EXTI.

>>>>>> Follow ngay <<<<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn
//