🌱 STM32 - 18. Tổng Quan và Thanh Ghi của Ngoại vi Systick Timer

🌱 STM32 - 18. Tổng Quan và Thanh Ghi của Ngoại vi Systick Timer

    Các bạn sử dụng thư viện HAL chắc hẳn đã gặp trường hợp dùng hàm HAL_Delay() mà không sử dụng được các ngắt chương trình đúng theo ý mình. Bởi vì hàm HAL_Delay() này được viết sử dụng một ngắt đặc biệt của hệ thống - Systick Timer.

STM32F401 NUCLEO Board

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

👉 Systick Timer là gì?

    Systick Timer đúng như tên gọi của nó, là một Timer, nhưng không giống như các ngoại vi Timer, Systick Timer là một Timer độc lập nằm trong lõi Cortex.
Một điểm khác biệt nữa so với Timer Peripheral, Systick Timer là một Timer 24-bit, đếm ngược, xảy ra ngắt khi giá trị đếm bằng 0, và tự nạp lại giá trị đếm ban đầu.

    Ứng dụng của Systick Timer điển hình nhất chính là tạo hàm delay, cụ thể là HAL_Delay() một cách chính xác hơn so với mấy vòng lặp for, while. Một ứng dụng khác có thể kể đến là tạo Time-Slice trong các ứng dụng RTOS.

👉 Hoạt động của Systick Timer

    Không khác là mấy so với một Timer thông thường, Systick cũng bao gồm:

  • Một Bộ đếm Counter để đếm xuống.
  • Một thanh ghi chứa giá trị nạp lại.
  • Một cờ báo tràn Timer.
  • Một bộ phận để cấu hình xung clock đầu vào.
    Cụ thể cấu tạo của Systick có trong sơ đồ dưới đây.

Systick Timer
Systick Timer Block Diagram

👉 Các thanh ghi của Systick

    Cortex-M cung cấp một số thanh ghi sau để cấu hình và điều khiển Systick Timer. Dưới đây là định nghĩa bare-metal của các thanh ghi này:

<Tham khảo Tài liệu Cortex -M4 Devices Generic User Guide Generic User Guide>

// Định nghĩa địa chỉ cơ bản của Systick (trong NVIC)
#define SYSTICK_BASE    0xE000E010

// Định nghĩa các thanh ghi Systick
#define SYST_CSR        (*(volatile uint32_t *)(SYSTICK_BASE + 0x00)) // Control & Status
#define SYST_RVR        (*(volatile uint32_t *)(SYSTICK_BASE + 0x04)) // Reload Value
#define SYST_CVR        (*(volatile uint32_t *)(SYSTICK_BASE + 0x08)) // Current Value
#define SYST_CALIB      (*(volatile uint32_t *)(SYSTICK_BASE + 0x0C)) // Calibration Value

// Định nghĩa các bit trong SYST_CSR
#define SYST_CSR_COUNTFLAG  (1 << 16) // Cờ tràn
#define SYST_CSR_CLKSOURCE  (1 << 2)  // Nguồn clock: 1 = AHB, 0 = AHB/8
#define SYST_CSR_TICKINT    (1 << 1)  // Bật ngắt Systick
#define SYST_CSR_ENABLE     (1 << 0)  // Bật Systick
    

💬 Thanh ghi SYST_CSR - Systick Control & Status Register

SYST_CSR

Hình 2: Thanh ghi SYST_CSR

    Thanh ghi này dùng để cấu hình điều khiển và trạng thái của Systick Timer:

  • Bit[16] - COUNTFLAG: Cờ này được tự động set lên 1 khi bộ đếm tràn (đếm về 0). Đọc thanh ghi sẽ xóa cờ này.
  • Bit[2] - CLKSOURCE: Chọn nguồn cấp xung clock cho timer:
    0 = External Clock (AHB/8).
    1 = Processor Clock (AHB).
  • Bit[1] - TICKINT: Cho phép ngắt Systick nếu bit này bằng 1.
  • Bit[0] - ENABLE: Cho phép bộ đếm hoạt động:
    0 = DISABLE.
    1 = ENABLE.
    Khi được ENABLE, bộ đếm sẽ lấy giá trị từ SYST_RVR và đếm ngược.

💬 Thanh ghi SYST_RVR - Systick Reload Value Register

    Thanh ghi này chứa giá trị nạp lại để bắt đầu đếm, chỉ sử dụng 24 bit thấp (0x0000.0001 - 0x00FF.FFFF). Khi bộ đếm về 0, giá trị này sẽ được tự động nạp lại vào SYST_CVR.

💬 Thanh ghi SYST_CVR - Systick Current Value Register

    Thanh ghi này lưu giá trị hiện tại của bộ đếm, bắt đầu từ giá trị trong SYST_RVR và đếm ngược về 0. Chỉ sử dụng 24 bit thấp. Ghi vào thanh ghi này sẽ xóa nó về 0.

💬 Thanh ghi SYST_CALIB - Systick Calibration Value Register

    Thanh ghi này dùng để hiệu chuẩn Systick Timer, cung cấp giá trị tham chiếu cho độ trễ 10ms. Tuy nhiên, trong hầu hết ứng dụng đơn giản (như delay), chúng ta ít dùng đến nó do không yêu cầu độ chính xác cao.

    ➤ Cách làm việc với Systick + Example mình sẽ nói đến ở post sau!

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

4 Nhận xét

  1. Nhận xét này đã bị tác giả xóa.

    Trả lờiXóa
    Trả lời
    1. RCC anh có viết 2 bài rồi nhé, bài 2 và 3 đó:
      https://laptrinhcnhung.blogspot.com/2021/09/STM2.html
      https://laptrinhcnhung.blogspot.com/2021/09/STM3.html

      Xóa
  2. Bài viết của a rất hay ạ. Cảm ơn a rất nhiều!!!

    Trả lờiXóa
    Trả lời
    1. Thank e đã ủng hộ, nếu thấy hay cho a xin 1 lượt share cho nhiều người biết đến nha 😁

      Xóa
Mới hơn Cũ hơn
//