BÀI 04 : NGẮT NGOÀI TRONG STM8S.


  1. Giới thiệu về ngắt.
  2. Ngắt là một phần không thể thiếu, là cốt lõi của vi điều khiển. Bản thân Ngắt được chia làm 2 loại chính theo nguyên nhân tác động là ngắt ngoài(do sự tác động của các yếu tố bên ngoài) và ngắt nội(do các yếu tố bên trong chip như tràn timer…). Ví dụ một VĐK không có ngắt, nó sẽ thực hiện chương trình từ bắt đầu hàm main -> nhảy vào trong vòng lặp while -> đi đến câu lệnh cuối cùng của vòng lặp while -> quay trở lại câu lệnh đầu tiên của vòng lặp while… lặp đi lặp lại như thế. Đó là điều bất lợi khi gặp trường hợp sau:

    Vòng lặp while quá dài hoặc tác động bên ngoài quá nhanh - ví dụ Khi có 1 tác động từ bên ngoài(chẳng hạn nhấn nút nhấn) thì nhiều lúc chương trình sẽ không thực hiện câu lệnh đọc nút nhấn khi ta nhấn nút(vì câu lệnh xử lí đặt trong while, lặp đi lặp lại nhiều khi không thực hiện kịp). Kết quả là các hành động thực hiện khi có nút nhấn tác động có thể sẽ không xảy ra.Khi có ngắt xảy ra thì sẽ khác, chương trình trong while sẽ tạm dừng để ưu tiên phục vụ ngắt xong sau đó mới quay trở lại thực hiện tiếp câu lệnh kế tiếp trong while, chương trình sẽ mạch lạc, chính xác hơn.

    CHÚ Ý:

    • Vì khi thực hiện ngắt, chương trình trong vòng lặp while phải tạm dừng nên các lệnh xử lý trong ngắt càng ngắn càng tốt, hạn chế sử dụng các hàm Delay trong đoạn code chương trình ngắt.
    • Khi có nhiều ngắt, cần xem xét mức độ quan trọng để cấu hình ưu tiên ngắt nào xảy ra trước, ngắt nào sau.

    Một vài đặc điểm chính Ngắt trong STM8S:

    • Mỗi chân GPIO đều có thể cấu hình ngắt ngoài, phân biệt các chân trong Port bằng thanh ghi GPIO_IDR.
    • Có 32 vector ngắt phần cứng.
    • Có 4 vector ngắt phần mềm để cấu hình ưu tiên ngắt.
    • TLI,RESET và TRAP(Management of software interrupt) là 3 ngắt mặc định có mức ưu tiên cao nhất.

    Có 5 vector phục vụ ngắt ngoài trong stm8s:

    • 5 lines on Port A: PA[6:2].
    • 8 lines on Port C:PB[7:0].
    • 8 lines on Port C: PC[7:0].
    • 7 lines on Port D: PD[6:0].
    • 8 lines on Port E : PE[7:0].

    Thứ tự ưu tiên ngắt phần mềm và phần cứng được miêu tả trong sơ đồ ở dưới:

  3. Cấu hình ngắt trong phần mềm lập trình
    1. Với chương trình chỉ có 1 ngắt ngoài xảy ra.
      • Cấu hình ngắt khi khởi động(trong hàm main).
      • Hàm phục vụ ngắt(trong file stm8s_it.c)
      • CHÚ Ý :

      • Cấu hình ngắt thì có thể viết trong hàm main.c hoặc 1 file do chúng ta tự định nghĩa. Còn hàm phục vụ ngắt thì nên viết trong hàm stm8s_it.c vì để phân biệt rõ chương trình, tránh nhầm lẫn khi viết chương trình. Nhà sản xuất đã cố tình tạo ra 1 file ngắt riêng để chúng ta thực hiện ngắt.
      • Thư viện cấu hình ngắt ngoài nằm trong file stm8s_exti.c và stm8s_exti.h khi sử dụng nhiều ngắt(ngắt trên các port khác nhau hoặc có nhiều loại ngắt khác nhau) trong chương trình thì ta cần thêm file stm8s_itc.c để cấu hình ưu tiên ngắt.
    2. Với chương trình có nhiều ngắt ngoài xảy ra trên cùng 1 Port(VD PC4,PC5).
      • Cấu hình phần cứng:
      • Cấu hình ngắt :
      • Chương trình phục vụ ngắt trong file stm8s_it.c :

      LƯU Ý:các bạn nên để mode của nút nhấn là GPIO_MODE_IN_PU_IT(ngắt có trở kéo nguồn) vì khi nút nhấn không tác động thì trạng thái logic ở chân đó sẽ là mức cao, tránh trùng trạng thái với khi nút nhấn được tác động.

    3. Với chương trình có nhiều ngắt ngoài khác Port(vd PA3,PC6
    4. Đối với chương trình này chúng ta cần thêm file stm8s_itc.c để cấu hình ưu tiên ngắt bằng phần mềm. Nếu không có chương trình cấu hình ưu tiên ngắt bằng phần mềm thì chương trình sẽ mặc định cấu hình ưu tiên ngắt theo phần cứng. Khi có ngắt thì cấu hình phần mềm sẽ được ưu tiên trước, nếu phần mềm bằng nhau thì sẽ tính đến phần cứng. Có những ngắt ngoại lệ như LTI,RESET, TRAP. Các bạn tham khảo thêm trong file stm8s_itc.c và stm8s_itc.h trong đó ITC_PRIORITYLEVEL_3 là mức ưu tiên phần mềm cao nhất và ITC_IRQ_TLI(1)là ngắt có mức ưu tiên phần cứng cao nhất.

  4. Thanh ghi ngắt ngoài trong STM8S.
    1. EXTI_CR1 – external interrupt control register 1
    2. Mỗi PXIS gồm 2 bit tương ứng với chọn chế độ ngắt cho mỗi Port. Mỗi Port chỉ được phép cấu hình 1 chế độ cho các chân trên cùng 1 Port vd: Port A chân PA3 là cạnh lên thì các chân còn lại cũng là cạnh lên. Giá trị của cặp bit tương ứng:

      • 00 : chế độ cạnh xuống và mức thấp.
      • 01 : chỉ cạnh lên.
      • 10 : chỉ cạnh xuống.
      • 11 : cả cạnh lên và cạnh xuống.
    3. EXTI_CR2 – external interrupt control register 2
    4. Tương tự như các Port A, B, C,D ở trên, đây sẽ là Port E và có thêm bit TLIS(top level interrupt sensitivity) tức là cấu hình để đưa chân ngắt lên mức ưu tiên cao nhất(chỉ chân PD7 và PD3). Các VĐK STM8S có 20 chân thì k có loại này.

  5. Bài tập
    1. Cấu hình ngắt ngoài cho nút nhấn trên PA3 để thực hiện đảo trạng thái led trên chân PD2. Nhấn lần 1 đèn ở chân PD2 sáng, nhấn lần 2 đèn trên chân PD2 tắt.
    2. Cấu hình ngắt ngoài nút nhấn trên chân PC4 và PC5 để đảo trạng thái led trên chân PD2. Nhấn nút trên chân PC4 led ở chân PD2 sáng, nhấn nút ở chân PC5 đèn ở chân Pd2 tắt. lặp đi lặp lại.
    3. Cấu hình ngắt ngoài trên 2 chân PA3 và PC5 với mức ưu tiên trên chân PC5 cao hơn chân PA3 là thay đổi trạng thái led giống ví dụ 2(gợi ý dùng thêm file stm8s_itc.c)


    DOWNLOAD CODE

Link tải chương trình chỉ có 1 ngắt ngoài: STVP Project IAR Project

Link tải chương trình có 2 ngắt ngoài trên 1 port : STVP Project IAR Project