BÀI 05 : TIMER BASE và NGẮT TIMER.


  1. Giới thiệu về timer.
  2. Timer là 1 phần quan trong và không thể thiếu đối với bất kì một loại vi điều khiển nào. Timer liên quan tới nhiều ứng dụng như: tạo hàm Delay chính xác, tạo xung(PWM), encoder, đo chu kì(hoặc tần số) của tín hiệu ngoại vi, xuất xung để đồng bộ hóa với các thiết bị ngoại vi. STM8S(STM8S003F3P6) có 3 timer là TIM1,TIM2(16 bit) và TIM4(8) bit. TIM1 là timer đặc biệt, nó được nhà sản xuất phát triển với nhiều tính năng hơn các timer thông thường như : có các kênh xuất PWM với tín hiệu đảo của kênh chính với các cặp tương ứng vd : TIM1_CH1 –TIM1_CH1N(điều này rất quan trong khi điều khiển đảo chiều động cơ), xuất xung trigger để điều khiển các thiết bị ngoại vi, ngắt input(với chức năng bảo về khi có sự cố), có 16 bit prescaler so với 4 bit prescaler của timer2 giúp điều khiển tần số với khoảng chia nhỏ hơn. TIM4 là timer nội nghĩa nó chỉ có chức năng định thì, không giao tiếp được với các ngoại vi bên ngoài.

    Cách chia với chức năng timer base(chia cơ bản) phụ thuộc vào 3 yếu tố là : clock cấp cho timer đó là bao nhiêu(tính bằng Hz), số bit thanh ghi prescaler, số bit thanh ghi auto reload. Việc chia tần số khau đối với các timer trong STM8S khác nhau do 3 yếu tố kể trên khác nhau. Sau đây là cách chia:

    Tần số sau bộ chia tấn số Presccaler sẽ là : FCK_CLK = FCK_PSC/(PSC+1).

    • FCK_CL : là tần số mong muốn sau bộ chia.
    • FCK_PSC : clock hệ thống được chia đến bộ timer đó.
    • PSC : là thanh ghi prescaler của timer đó.
    • CHÚ Ý:

    • Với timer1 thanh ghi PSC là 16 bit nên có thể chia từ 0 -> 65535. Độ chia có thể chia mịn nhất trong 3 timer.
    • Với timer 2(độ chia từ 0 -> 32768) thanh ghi PSC là 8 bit nên độ chia độ chia sẽ là TIM2_PRESCALER_1 tương ứng với (PSC+1)=1 - thanh ghi prescaler =0…. TIM2_PRESCALER_16 tương ứng với (PSC+1)=16 - thanh ghi prescaler =4. Chú ý độ chia theo hệ số mũ 2x không có dạng lẻ.
    • Với timer 4(độ chia từ 0 -> 128) thanh ghi PSC chỉ có 3 bit sử dụng được nên độ chia sẽ là TIM4_PRESCALER_1 tương ứng với (PSC+1)=1 - thanh ghi prescaler =0…. TIM4_PRESCALER_16 tương ứng với (PSC+1)=16 - thanh ghi prescaler = 4. Chú ý độ chia theo hệ số mũ 2x không có dạng lẻ.

    Sơ đồ khối của timer1 – timer đầy đủ chức năng nhất trong stm8s003f3p6:

  3. Cấu hình sử dụng thư viện ST.
    1. Chương trình delay sử dụng timer4.
      • Chương trình con sử dụng delay bằng timer:
      • Hàm thực thi trong main:

      LƯU Ý:nên sử dụng timer4 cho các ứng dụng định thì như chương trình delay vì timer 4 không tương tác trực tiếp với các chân ngoại vi cũng như chức năng hạn chế. Tiết kiệm các timer2 và timer1 cho các ứng dụng khác. Hàm delay bằng timer thì chính xác, sai số rất nhỏ.

    2. Sử dụng ngắt khi tràn timer1.
      • Chương trình cấu hình ngắt khi tràn timer:
      • Chương trình thực thi ngắt trong file stm8s_it.c:

      LƯU Ý:chương trình thực thi nằm trong chương trình ngắt file stm8s_it.c.

  4. Một vài thanh ghi cơ bản của timer1(là timer đầy đủ các chức năng và thanh ghi nhất).
    1. TIM1_CR1 – regiter control 1
    2. Thanh ghi này quyết định có APRE - auto reload(nạp lại giá trị đếm khi đếm xong); CMS – cấu hình mode output compare(thấy rõ khi xuất pwm với mode này);DIR - chiều đếm lên hay đếm xuống của counter;OPM – one-pulse mode : chỉ xuất 1 xung khi không cho phép counter update lần tiếp theo; CEN – counter enable hoặc disable.

    3. TIM_CR2 – register control 2
    4. Thanh ghi nay có MSS – Master mode select – điều khiển quá trình xuất xung TRGO để điều khiên quá trình lấy giá trị ADC hoắc sử dụng timer này để điều khiển hoạt động của timer khác. COMS – cập nhật các quá trình reload để thực hiện xuất xung, đọc tần số được thực hiện liên tục…; CCPC – cho phép reload ở thanh ghi TIM1_CCERx.

    5. TIM1_SR1 – TIM1_SR2 – status register 1,2
    6. Các thanh ghi này thông báo trạng thái của timer, các cờ báo tràn… BIF – break interrupt flag – thông báo rằng có ngắt đầu vào ở các chân VĐK cho phép ngắt input hay không;TIF – Trigger interrupt flag – thông báo có ngắt xung trigger ở chân VĐK khi được cấu hình cho phép;COMIF – commutation interrupt flag – thông báo trạng thái chuyển đổi các bit CCiE,CCiNE,OCiM khi cấu hình timer ở mode capture/compare; CC1IF -> CC4IF là các cờ báo tràn khi sử dụng mode capture/compare….

    7. TIM1_PSCRH – TIM1_PSCRL – prescaler high/low
    8. Là thanh ghi chia clock hệ thống thành clock của timer. Chỉ có duy nhất timer1 là 16 bit nên ta có thể chia nhỏ các giá trị clock.

    9. TIM1_ARRH – TIM1_ARRL – auto-reload register high/low
    10. Là thanh ghi chứa giá trị đích đếm(vd đếm từ 0 -> 100 thì ARR =100) của counter. 2 thanh ghi này ghép lại tạo thành thanh ghi 16 bit lên giá trị đếm tối đa là 65535.

    11. TIM1_CNTRH – TIM1_CNTRL – counter register high/low.
    12. Là thanh ghi chứa giá trị đếm thay đổi sau mỗi lần đếm. Giá trị đếm luốn nhỏ hơn hoặc bằng giá trị của thanh ghi auto-reload.

  5. Bài tập
    1. Cấu hình hàm delay mili giây dùng timer 2.
    2. Cấu hình đảo trạng thái LED ở chân PD2,PD3 sau mỗi 1 giây dùng ngắt tràn timer1.


    DOWNLOAD CODE

Link tải chương trình delay dùng timer4 : STVP Project IAR Project

Link tải chương trình ngắt tràn dùng timer1 : STVP Project IAR Project