Sử dụng Watchdog Timer trên MCU STM32F103C8T6

Các sản phẩm khi sử dụng thực tế yêu cầu có sự ổn định cao trong suốt quá trình sử dụng. Một hệ thống có thể bị treo từ rất nhiều nguyên nhân như chương trình code chưa chặt chẽ, ngoại vi không phản hồi, nhiễu, tràn bộ nhớ… Lúc này các bạn cần khởi động lại hệ thống để mọi thứ có thể chạy lại từ đầu, kết hợp với việc báo lỗi để chúng ta tìm ra nguyên nhân và chỉnh sửa kịp thời. Watchdog timer là một chức năng của vi điều kiển giúp các bạn có thể phát hiện ra hệ thống bị treo và thực hiện reset. Các dòng micros STM32 chung có 2 chế độ watchdog timers (WDT):

  • Independent Watchdog (IWDG)
  • Window Watchdog (WWDG)

[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

Clock options:

– External sources (ngoại)

+ HSE (High Speed External): Bộ dao động HSE chấp nhận input frequency từ 4 – 25 MHz. Nguồn clock chủ yếu là bộ dao động thạch anh hoặc mạch tạo tín hiệu xung (clock signal generating circuit).

+ LSE (Low Speed External):  có chức năng tương tự như bộ dao động HSE  nhưng chấp nhận input frequency bằng 32.768 kHz. LSE được sử dụng để cấp nguồn cho module Real Time Clock (RTC) bên trong STM32.

– Internal sources (nội)

+ HSI (High Speed Internal): nguồn clock cố định cấp cho HSI bằng 8Mhz

+ LSI (Low Speed Internal): input frequency dao động từ 30-60 kHz. Tần số phổ biến 40 kHz.

– PLL (Phase-Lock-Loop): bộ nhân tần số HSE hoặc HSI lên nhiều lần, nhằm tạo ra giá trị lớn hơn cho clock.

Independent Watchdog:

– Là bộ đếm giờ hoàn toàn độc lập vì nó có bộ clock riêng biệt và vẫn hoạt động ngay cả khi bộ clock chính của vi điều khiển fail.

– Nguồn clock cho IWDG đến từ LSI clock. Nó có tần số dao động khoảng 40 kHz (từ 30 đến 60 kHz).

– Chức năng: Reset lại MCU khi giá trị của down counter đếm xuống 0x00. Phù hợp trong ứng dụng cần reset lại STM32 MCU khi MCU bị treo.

– Các thanh ghi liên quan đến IWDG và bản đồ thanh ghi cho IWDG:

+ Key Register (IWDG_KR)

  • = 0xCCCC: bắt đầu watchdog.
  • = 0xAAAA: Nạp lại giá trị counter bằng với giá trị của thanh ghi IWDG_RLR. 
  • = 0x5555: Cho phép cấu hình thay đổi giá trị thanh ghi IWDG_PR và thanh ghi IWDG_RLR.

Tính năng bảo vệ: Việc ghi giá trị vào thanh ghi Prescaler IWDG_PR và thanh ghi Reload IWDG_RLR được bảo vệ bởi thanh ghi Key IWDG_KR. Để có thể thay đổi giá trị các thanh ghi được bảo vệ thì cần ghi giá trị 0x5555 vào thanh ghi IWDG_KR trước, sau đó mới khi ghi giá trị mong muốn vào thanh ghi IWDG_PR hoặc thanh ghi IWDG_RLR

+ Prescaler Register (IWDG_PR)

+ Reload Register (IWDG_RLR)

  • Định giá trị được đưa vào bộ đếm watchdog mỗi khi thanh ghi IWDG_KR được nạp giá trị 0xAAAA, sau đó bộ đếm watchdog sẽ bắt đầu đếm xuống từ giá trị này.
  • Có thể định giá trị cho IWDG_RLR bằng cách lập trình hoặc thông qua việc cấu hình trên CubeMX.

– Các bước để cấu hình cho IWDG:

+ Khởi tạo giá trị cho thanh ghi IWDG_KR bằng 0x5555 để bỏ chế độ bảo vệ ghi đè lên 2 thanh ghi IWDG_PR và IWDG_RLR, cho phép thay đổi giá trị lên 2 thanh ghi đó.

+ Thay đổi giá trị IWDG_PR và IWDG_RLR tùy theo yêu cầu

+ Bật chế độ bảo vệ ghi đè lại bằng cách ghi 0xAAAA lên thanh ghi IWDG_KR

+ Bắt đầu IWDG bằng cách ghi 0xCCCC lên thanh ghi IWDG_KR

– Cách tính thời gian Timeout:

(1)

**Hướng dẫn chức năng WDT với CUBE MX :

Bước 1:

– Tạo project đổi trạng thái LED sử dụng IWDG trên phần mềm CubeMX

 Bước 2:

Cấu hình việc nạp code ở module SYS sang Serial Wire.

 Bước 3:

Ở chức năng IWDG kích chọn ô Activated.

Thiết lập giá trị cho các thanh ghi IWDG_PR và IWDG_RLR:

Ví dụ ở đây chọn bộ chia /256 nên PR = 256 và cho RLR = 312. Áp dụng công thức (1), ta có Timeout = 2s.

 Bước 4:

Chọn chân PB0 làm input, PC13 làm output.

Bước 5:

Sau khi hoàn thành các bước trên chuyển sang mục Setting để cài đặt việc tạo code cấu hình từ CubeMX

Bước 6:

Code example

 

Giải thích:

Một LED được kết nối với chân PC13 có trạng thái ban đầu là bật cho đến khi nút nhấn được kết nối với chân PB1 được nhấn. Một khi nút nhấn được nhấn thì LED đảo trạng thái qua tắt, và giữ nguyên trạng thái đó trong vòng 2 giây. Sau đó MCU bị reset và LED chuyển qua bật, giống như trạng thái lúc setup ban đầu.

Xem thêm: Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây.

Nhóm TAPIT ARM R&D