Title Image

Blog Logo

STM 9. External Interrupt Configuration Example

🌱 STM 9. External Interrupt Configuration Example

    Muốn cấu hình External Interrupt, cần phải cấu hình chân GPIO tương ứng, bộ điều khiển ngắt NVIC và bộ External Interrupt (EXTI). External Interrupt thường đường sử dụng để phát hiện các sự kiện sườn lên/xuống trên các chân, trong các mục đích cần thiết (thay vì kiểm tra theo kiểu polling). Một ví dụ thường sử dụng External Interrupt là sử dụng nút bấm.

    Trước khi config External Interrupt, các bạn cần tìm hiểu về các thanh ghi ngoại vi GPIO, EXTI và NVIC, cũng như các kiến thức liên quan đến 3 bộ này. Các bài viết trước về Core và STM32 về External Interrupt và NVIC:

    Cùng với đó là tham khảo địa chỉ các thanh ghi ngoại vi trong RM cũng như tài liệu về Core. Chúng ta sẽ trải qua các bước cấu hình sau để cấu hình một chân ở chế độ External Interrupt.

    👉 Define địa chỉ và khai báo các thanh ghi

Interrupt

    Các thanh ghi cần sử dụng ở đây bao gồm:

  • Thanh ghi Cấu hình clock cho bus AHB1 (cấp cho GPIOA) - RCC_AHB1ENR và APB2 (cấp cho EXTI) - RCC_APB2ENR
  • Thanh ghi cấu hình Input cho GPIOA - GPIOx_MODER.
  • Thanh ghi Cấu hình EXTI bao gồm thanh ghi interrupt mask EXTI_IMR, thanh ghi cấu hình sườn lên/xuống (ở đây là sườn lên) EXTI_FTSR, thanh ghi pending EXTI_PR.
  • Thanh ghi cấu hình NVIC, ở đây chỉ sử dụng thanh ghi Enable IRQ (Ngoài ra còn có các thanh ghi cấu hình độ ưu tiên của các line ngắt, nếu như có nhiều ngắt).

    👉 Cấu hình mode cho GPIO và cấu hình EXTI

Interrupt

    Ở bước này chúng ta cần làm theo các bước:
  • Cấu hình cho phép Clock GPIOA và Clock cho EXTI.
  • Cấu hình mode cho GPIOA (Ở đây mình để là Input Floating, người ta thường sử dụng Input Pullup cho các nút nhấn).
  • Cấu hình sườn lên/xuống cho EXTI (ở đây mình chọn là sườn lên).
  • Cấu hình cho phép EXTI line tương ứng (ở đây là line 0).
  • Cấu hình Enable NVIC. 

    👉 Viết chương trình con phục vụ ngắt - ISR - Interrupt Service Routine

Interrupt

    Chương trình con phục vụ ngắt sẽ sử dụng tên hàm có định nghĩa sẵn trong file Startup. Ở đây mình dùng External Interrupt trên line 0, vì vậy, tên chương trình con phục vụ ngắt sẽ có tên: EXTI0_IRQHandler (void).
    Trong chương trình con phục vụ ngắt, mình sẽ có thể làm bất cứ điều gì mình thích 😂😂😂 Đùa thôi, một điều cần lưu ý trong ISR đó là bạn nên để chương trình trong đây càng ngắn càng tốt. Bởi vì nếu nó quá dài, thì có thể chiếm dụng thời gian của chương trình chính (hoặc chương trình dài có nguy cơ gây ra treo). 
    Sau khi thực hiện điều mình thích rồi, bạn cần xóa ngắt của mình khỏi hàng đợi Pending, bằng cách set bit tương ứng trên thanh ghi EXTI_PR lên một. 

    Phần còn lại là việc chúng ta thiết kế chương trình main theo ý các bạn thôi là xong!!!

   Chúc các bạn học tập tốt 😊 

Xem Bài STM 8                   Xem Bài STM 10

Đăng nhận xét

10 Nhận xét

  1. Trả lời
    1. ok em, anh k có nhiều time lắm nên mỗi ngày 1 2 bài thôi :v

      Xóa
    2. E gọi thẳng RCC->AHB1ENR không define các thanh ghi có sao không A ?

      Xóa
    3. Đó là nếu em có thư viện STD trong project rồi thì được, còn project anh đang hướng dùng thanh ghi. Thư viện ngta đã define sẵn cho mình rồi, ví dụ Struct pointer RCC ở địa chỉ nào. Nếu không dùng thư viện thì mình sẽ tự define như anh làm đó.

      Xóa
  2. mấy cái ngắt ADC, UART,... là của mode Event à anh?

    Trả lờiXóa
    Trả lời
    1. cái đó cũng là ngắt nha em, còn event là một tính năng không gọi đến các ISR, thường dùng trong power mode

      Xóa
  3. cái thanh ghi ISER của core NVIC xem ở đâu vậy anh

    Trả lờiXóa
    Trả lời
    1. Với các thanh ghi của NVIC em xem trong tài liệu Cortex M Generic User Guide nhé

      Xóa
  4. *pNVICIRQEnReg |= (1<<6) là Enable NVIC trên chân nào vậy ạ, em xem qua thanh ghi pNVICIRQEnReg thấy có tới 32 bit nhưng mà không biết các bit đó khác nhau như nào ạ, em cảm ơn anh

    Trả lờiXóa
    Trả lời
    1. Mỗi bit trên thanh ghi này tương ứng 1 line ngắt đó e, ví dụ thanh ghi NVIC_ER0 thì bit 5 tương ứng với ngắt có IRQ number = 5

      Xóa