🌱 STM32 - 8. Thanh ghi Ngoại vi External Interrupt EXTI Vi điều khiển STM32

🌱 STM32 - 8. Thanh ghi Ngoại vi External Interrupt EXTI Vi điều khiển STM32

    Ở post trước mình đã nói tổng quan về External Interrupt trong Vi điều khiển STM32. Với sơ đồ khối hoạt động của External Interrupt, thì ở post này chúng ta sẽ cùng tìm hiểu về các thanh ghi tương ứng với các khối chức năng đó!

STM32F401 NUCLEO Board

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

Tổng quan về thanh ghi EXTI

    Sơ đồ khối External Interrupt và tổng quan về chức năng của từng khối có trong post trước. Để xem được các thanh ghi cấu hình cho chúng, chúng ta sẽ xem trong tài liệu Reference Manual (RM) của STM32F401 - Table 39, trang 212. Tại đây, RM cung cấp một bảng các thanh ghi (Register Map), bao gồm tên, địa chỉ offset, và giá trị khi reset của các thanh ghi.

EXTI Register Map

Hình 1: Bảng Register Map của EXTI trong STM32F401

Cách các thanh ghi EXTI hoạt động

    Các thanh ghi EXTI phối hợp với nhau để xử lý ngắt ngoài theo một quy trình rõ ràng:

  1. Cấu hình nguồn ngắt: Chọn nguồn ngắt (ví dụ: GPIO, PVD, RTC) thông qua thanh ghi SYSCFG_EXTICR.
  2. Kích hoạt ngắt: Sử dụng EXTI_IMR để bật ngắt cho line mong muốn.
  3. Chọn loại kích hoạt: Dùng EXTI_RTSR và EXTI_FTSR để chọn sườn lên, sườn xuống, hoặc cả hai.
  4. Kích hoạt phần mềm (tuỳ chọn): Dùng EXTI_SWIER để tạo ngắt bằng phần mềm nếu cần.
  5. Xử lý ngắt: Khi ngắt xảy ra, bit tương ứng trong EXTI_PR được set. Sau khi xử lý xong, phần mềm phải xoá bit này để chuẩn bị cho ngắt tiếp theo.

    Quy trình này sẽ được minh họa chi tiết hơn trong bài ví dụ thực hành tiếp theo.

👉 Thanh ghi EXTI_IMR - Interrupt Mask Register

EXTI_IMR

Hình 2: Cấu trúc thanh ghi EXTI_IMR

Tương ứng với 23 line ngắt trong STM32F401, thanh ghi EXTI_IMR cung cấp 1 bit cho mỗi line ngắt để cho phép (che hay không che) các line ngắt tương ứng.

👉 Thanh ghi EXTI_EMR - Event Mask Register

    Thanh ghi EXTI_EMR có cấu trúc tương tự EXTI_IMR, nhưng thay vì dùng cho ngắt (interrupt), nó dùng để bật/tắt sự kiện (event) cho 23 line. Sự kiện khác với ngắt ở chỗ nó không gửi yêu cầu đến NVIC mà thường được dùng để kích hoạt các ngoại vi khác (như Wakeup hoặc Timer).

    Mỗi bit trong EXTI_EMR tương ứng với một line (0-22): - 0: Sự kiện bị che (masked). - 1: Sự kiện được bật (unmasked).

👉 Thanh ghi EXTI_RTSR - Rising Trigger Selection Register

EXTI_RTSR

Hình 3: Cấu trúc thanh ghi EXTI_RTSR

    Thanh ghi này dùng để cấu hình cho phép phát hiện sườn lên (rising edge) cho 23 line ngắt.

👉 Thanh ghi EXTI_FTSR - Falling Trigger Selection Register

    Thanh ghi EXTI_FTSR có cấu trúc giống EXTI_RTSR, nhưng dùng để cấu hình phát hiện sườn xuống (falling edge) cho 23 line ngắt. Mỗi bit tương ứng với một line: - 0: Không phát hiện sườn xuống. - 1: Phát hiện sườn xuống.

    Khi kết hợp với EXTI_RTSR, bạn có thể cấu hình một line ngắt để phát hiện cả sườn lên và sườn xuống, rất hữu ích trong các ứng dụng như phát hiện nút bấm hoặc tín hiệu xung.

👉 Thanh ghi EXTI_SWIER - Software Interrupt Event Register

EXTI_SWIER

Hình 4: Cấu trúc thanh ghi EXTI_SWIER

    Thanh ghi này dùng để kích hoạt Software Interrupt tương ứng với 23 line ngắt. Nó có thể được sử dụng thay thế cho ngắt bằng phần cứng thông qua sườn tín hiệu như ở trên.

👉 Thanh ghi EXTI_PR - Pending Register

EXTI_PR

Hình 5: Cấu trúc thanh ghi EXTI_PR

    Mỗi khi có một tín hiệu ngắt xảy ra (theo sườn hoặc bằng phần mềm), bit tương ứng trên thanh ghi EXTI_PR sẽ được set lên, cho đến khi ngắt đó được xử lý.

👉 Bổ sung: 23 Line ngắt trong STM32F401

Interrupt Lines

Hình 6: Các nguồn ngắt ngoài trong STM32F401

    Tham khảo Reference Manual trang 208, STM32F401 có thể có tới 81 GPIO được kết nối với 16 line ngắt (từ line 0 đến line 15), được cấu hình bằng thanh ghi SYSCFG_EXTICR1. Năm line ngắt còn lại (EXTI16 đến EXTI22) được kết nối với các chức năng khác như PVD, RTC, USB như trong hình (RM) có đề cập.

👉 Lưu ý khi sử dụng thanh ghi EXTI

  • Xoá bit Pending: Sau khi xử lý ngắt, phải ghi 1 vào bit tương ứng trong EXTI_PR để xoá trạng thái chờ, nếu không ngắt sẽ liên tục xảy ra.
  • Cấu hình Clock: EXTI được cấp clock từ bus APB2, cần bật clock cho SYSCFG qua thanh ghi RCC_APB2ENR trước khi cấu hình SYSCFG_EXTICR.
  • Tránh nhiễu: Khi dùng ngắt ngoài với GPIO (như nút bấm), nên bật pull-up/pull-down để tránh tín hiệu nhiễu gây ngắt không mong muốn.
  • NVIC: Sau khi cấu hình EXTI, cần kích hoạt ngắt tương ứng trong NVIC (ví dụ: EXTI0_IRQn) để CPU xử lý.

    Ở post sau, mình sẽ cùng các bạn thực hành cấu hình các thanh ghi này cho một chương trình sử dụng External Interrupt để giúp các bạn hiểu hơn về chúng.

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