BÀI 05 : Ngắt ngoài với STM32F1.


  1. Sơ lược về lý thuyết.
  2. NVIC - Nested vectored interrupt controller là bộ vector ngắt lồng nhau. Nghĩa là chúng ta có thể sử dụng kết hợp nhiều ngắt trong một chương trình. Ngắt là một phần quan trọng và thiết yếu của chương trình. Nếu không có ngắt thì chương trình sẽ thực hiện theo 1 trình tự từ trên xuống dưới mà không có bất kì sự can thiệp nào. Điều đó là bất lợi khi có 1 tác động ngoài xảy ra, chương trình sẽ không xử lí kịp thời dẫn đến việc bỏ qua tác động đó. Ngắt ra đời để phục vụ cho các sự cố đó.

    Một số thông số ngắt chính của STM32F103:

    • 16 mức ưu tiên có thể lập trình được.
    • Độ trễ thấp (xảy ra ngắt cực kì nhanh).
    • Có quản lí năng lượng cho vector ngắt.
    • Có các thanh ghi điều khiển quá trình ngắt.
    • 68 vector ngắt(xem thêm trong reference manual).

    Ngắt ngoài nằm trong 1 phần của ngắt NVIC. Mỗi EXTI – interrupt/event controller có thể được lập trình chọn loại sự kiện/ ngắt, chọn cạnh lên, cạnh xuống hoặc cả 2, mức ưu tiên ngắt.

    Một số tính năng chính của ngắt ngoài:

    • Kích hoạt độc lập và mặt nạ cho mỗi line sự kiện/ngắt.
    • Có bit trạng thái riêng cho mỗi line ngắt.
    • Có thể có tối đa 20 sự kiện/ ngắt, tham khảo thêm trong reference manual.
    • Kiểm tra tín hiệu ngoài có độ rộng xung nhỏ hơn clock trên APB2.

    Sơ đồ khối của các khối điều khiển ngắt ngoài:

  3. Cấu hình với thư viện chuẩn của ST.
  4. Có 2 loại ngắt ngoài chính đó là ngắt ngoài trên các chân điều khiển ở dạng thông thường và ngắt ngoài trên các ứng dụng như : PVD, RTC, USB, Ethernet.

    1. Chương trình con cấu hình ngắt ngoài và thứ tự ưu tiên:
    2. LƯU Ý:

      • Cấu hình line ngắt tương ứng với chân xảy ra ngắt, ở đây chân PC13 nên line ngắt sẽ là EXTI_Line13.
      • Mode GPIO sử dụng ở đây là IPU tương ứng với input có trở kéo lên, khi chưa tác động thì chân PC13 ở mức cao, và tác động thì sẽ ở mức thấp(tức là được nối GND).
      • Cấu hình cạnh lên và cạnh xuống hoặc cả 2 phụ thuộc vào mục đích sử dụng. Ở đây cấu hình là cạnh xuống : EXTI_Trigger_Falling.
      • Cấu hình vector ngắt ở đây là EXTI15_10_IRQn vì từ chân Px0 -> Px4 tương ứng sẽ có 1 line ngắt riêng từ EXTI0_IRQ -> EXTI4_IRQ; chân Px5 -> Px9 chỉ có 1 line ngắt là EXTI9_5_IRQn; chân Px10 -> Px15 chỉ có 1 line ngắt là EXTI15_10_IRQn. Px ở đây là chung cho tất cả các Port từ PortA -> Port G. Vd PortA, PortB….
      • Cấu hình mức độ ưu tiên xảy ra khi có nhiều ngắt. Ở đây là NVIC_IRQChannelPreemptionPriority + NVIC_IRQChannelSubPriority. Đây là 2 mức ưu tiên với tổng số bit là 4 tương ứng với 16 giá trị. Bảng ở dưới tương ứng với các giá trị. NVIC_IRQChannelPreemptionPriority có giá trị càng cao thì mức ưu tiên càng thấp và ngược lại với NVIC_IRQChannelSubPriority.
    3. Chương trình con thực thi ngắt trong file stm32f10x_it.c:
      • Xóa bit báo ngắt ở line tương ứng.
      • Đảo trạng thái led ở chân PB9 tương ứng với mỗi lần nhấn nút.
    4. Chương trình trong main và cấu hình ban đầu:
  5. Một số thanh ghi quan trọng.
    1. EXTI_IMR – Interrupt mask register.
    2. Thanh ghi này cho phép có kiểm tra ngắt ngoài trên chân tương ứng hay chưa.

    3. EXTI_EMR- Event mask register.
    4. Thanh ghi này cho phép có cấu hình sự kiện trên chân tương ứng hay chưa.

    5. EXTI_RTSR – Rising trigger selection register.
    6. Thanh ghi này cho phép chân xảy ra sự kiện/ ngắt là cạnh lên hay không.

    7. EXTI_FTSR – Falling trigger selection register.
    8. Thanh ghi này cho phép chân xảy ra sự kiện/ ngắt là cạnh xuống hay không.

    9. EXTI_SWIER – Software interrupt even register.
    10. Thanh ghi này cho phép mô phỏng ngắt ngoài xảy ra trên chân đã được cấu hình(thay vị tác động bằng cạnh lên/xuống trên chân vi điều khiển ta có thể sử dụng nó để giả lập tác động từ bên ngoài bằng việc set hoặc reset bit tương ứng).

    11. EXTI_PR – Pending register.
    12. Thanh ghi này được sử dụng xóa bit(nhưng thực ra là ghi giá trị =1) để kiểm tra tín hiệu sự kiện/ ngắt xảy ra cho các lần tiếp theo.

  6. Bài tập.
    1. Viết chương trình đọc nút nhấn trên chân PC13 sử dụng ngắt ngoài, nhấn lần 1 đèn trên chân PB9 sáng, lần thứ 2 led trên chân PB9 tắt… lặp đi lặp lại như vậy.
    2. Viết chương trình đọc 2 nút nhấn trên chân PC13 và PB8 sử dụng ngắt ngoài. Nút nhấn trên chân PC13 có mức ưu tiên cao hơn chân PB8. Khi nhân nút trên chân PC13 led trên chân PB9 sáng, và khi nhấn nút trên chân PB8 led trên chân PB9 tắt. Lặp đi lặp lại quá trình đó.
Link tải chương trình ngắt trên chân PC13
Link tải chương trình ngắt có ưu tiên trên chân PC13 và PB8