Bài 14: Sử dụng STM32 IWDG Independent Watchdog Timer chống treo vi điều khiển

Sử dụng STM32 IWDG chống treo vi điều khiển

STM32 IWDG (Independent Watchdog Timer) là một loại Timer rất hay được sử dụng trong thực tế. Chức năng chủ yếu của Timer này là kiểm tra vi điều khiển có bị treo hay hoạt động sai không, từ đó đưa ra lệnh Reset khiến chương trình chạy lại từ đầu.

Bài 14 trong serie Học lập trình STM32 từ A tới Z

Watchdog Timer là gì?

Watchdog dịch ra nghĩa là Nhìn Chó….. Đùa đấy =)). Theo Google dịch, Watchdog là người canh gác, bảo vệ để các tác nhân bên trong hoặc bên ngoài không mong muốn không làm ảnh hưởng tới sự hoạt động của vi điều khiển.

Bảo vệ của MCU

STM32 IWDG trong vi điều khiển STM32

Watchdog Timer là bộ ngoại vi tích hợp trên vi điều khiển STM32, có khả năng giúp người dùng phát hiện ra hệ thống bị treo, chạy sai và tạo ra một ngắt hoặc một tín hiệu reset chip.

Đối với các sản phẩm điện tử đã bán ra thị trường, do nhiều yếu tố bên trong (code chưa chặt chẽ, code có bug…) và yếu tố bên ngoài (nhiễu, nhiệt độ, độ ẩm), vi điều khiển có thể chạy sai chức năng hoặc treo chip.

Trong trường hợp như vậy chúng ta cần có biện pháp khắc phục tạm thời, ví dụ như reset chip để chạy lại chương trình. Bộ Watchdog Timer được sinh ra với mục đích đó: nếu phần mềm không “báo danh” kịp thời, phần cứng Watchdog sẽ tự tạo ra tín hiệu reset.

Trong STM32, Watchdog Timer có 2 loại:

  • Independent Watchdog Timer hay STM32 IWDG
  • Window Watchdog Timer hay STM32 WWDG

Sự khác nhau giữa IWDG và WWDG

IWDG và WWDG được tạo ra với cùng một mục đích, thế nhưng chúng có sự khác nhau một chút về cách hoạt động và mục đích sử dụng.

Independent Watchdog Timer

Đúng như cái tên, Independent chính là độc lập, nghĩa là bộ Timer này sử dụng nguồn xung LSI (Low-speed internal clock) riêng, vì vậy nó vẫn hoạt động ngay cả khi nguồn clock của chương trình chính không hoạt động. Điều này phù hợp với chức năng phát hiện lỗi treo chip do cả phần cứng lẫn phần mềm. Khi bộ đếm IWDG về 0, MCU sẽ lập tức bị reset, không có ngắt báo trước.

Có thể tưởng tượng IWDG là một người bảo vệ của tòa nhà, trong tòa nhà đó có 1 công ty là MCU của các bạn. Vì bảo vệ đó không phải nhân viên của công ty MCU, nên dù MCU có hoạt động hay không, gã bảo vệ vẫn sẽ thực hiện công việc của mình.

Window Watchdog Timer

WWDG lấy nguồn xung từ APB1 Clock, nghĩa là bộ Timer này chỉ hoạt động khi chương trình chính hoạt động. Một khi hệ thống bị treo liên quan tới Clock chính, bộ Timer này cũng không hoạt động.

Vậy nên chức năng chính của WWDG là kiểm soát lỗi phần mềm (các bug). Nếu các tác vụ (Task) hoạt động bất thường như kết thúc sớm hơn hoặc muộn hơn dự kiến, WWDG sẽ reset chip. WWDG còn có ngắt cảnh báo sớm cho phép chương trình thực thi một số lệnh trước khi MCU bị reset hoàn toàn.

Có thể tưởng tượng WWDG chính là một người quản lý của công ty. Người này có nhiệm vụ kiểm soát hoạt động của nhân viên, ghi lại các lỗi nếu thấy nhân viên làm sai, từ đó tìm ra các phần tử không đạt yêu cầu. Tất nhiên, nếu toàn bộ công ty ngừng hoạt động thì người quản lý này cũng nghỉ luôn.

Independent Watchdog Timer trong STM32

Sơ đồ khối của bộ STM32 IWDG

Sơ đồ khối của bộ IWDG
Sơ đồ khối của bộ IWDG

Bao gồm:

  1. IWDG_PR: thanh ghi hệ số chia, xác định thời gian cho mỗi lần giảm của counter
  2. IWDG_SR: thanh ghi trạng thái, báo prescaler update và reload update khi có sự kiện ghi vào 2 thanh ghi trên
  3. IWDG_RLR: thanh ghi lưu giá trị nạp lại cho bộ đếm xuống 12-bit (reload counter)
  4. IWDG_KR: thanh ghi điều khiển việc chạy và nạp lại cho bộ IWDG

Nguyên lý hoạt động của STM32 IWDG

  • IWDG_PR và IWDG_RLR được nạp vào để xác định chu kì tràn của bộ đếm xuống (downcounter)
  • Khi ghi vào thanh ghi IWDG_KR giá trị 0xCCCC, timer sẽ bắt đầu hoạt động
  • Trước khi downcounter đếm từ giá trị nạp lại về 0, nếu ghi vào IWDG_KR giá trị 0xAAAA thì bộ counter sẽ đếm lại từ đầu (giá trị reload)
  • Nếu downcounter đếm đến 0, một sự kiện reset sẽ được sinh ra và reset chip

Vậy nên để chip không bị reset, chúng ta cần nạp 0xAAAA vào IWDG_KR trước khi counter đếm đến 0.

Các tham số cần quan tâm

Khi khởi tạo Timer, trước khi ghi vào 2 thanh ghi PR và RLR cần ghi vào KR giá trị 0x5555 để bỏ chế độ bảo vệ ghi của timer.

Chu kì đếm của Timer được xác định bởi hệ số chia và giá trị thanh ghi Reload, theo công thức:

IWDG công thức

Trong chế độ Debug, để chip không bị reset liên tục mỗi khi dừng ở breakpoint, ta cần bật bit DBG_IWDG_STOP để dừng timer này lại.

Lưu ý: IWDG một khi đã được start thì không thể tắt bằng phần mềm, chỉ có reset mới dừng được. Vì vậy hãy chọn thời gian tràn đủ dài so với vòng lặp chậm nhất của chương trình, nếu không chip sẽ bị reset liên tục ngay cả khi không treo.

Lập trình STM32 IWDG

Kịch bản đặt ra: trong chương trình chính ta sẽ đảo trạng thái led PC13 liên tục, sau mỗi lần đảo trạng thái chúng ta sẽ làm mới timer, vậy nên MCU sẽ không reset.
Khi nhấn nút tại PA0, chương trình sẽ rơi vào một vòng while(1) và không làm mới timer nữa. Khi đó led sẽ đứng yên tại thời điểm nhấn nút, sau 2 giây MCU bị reset rồi bắt đầu nháy lại như thường.

Cấu hình STM32 IWDG trên CubeMX

Mở CubeMX chọn chip, trong SYS chọn Debug: Serial Wire.

Trong tab IWDG chọn Activated và đặt thông số như hình, ta sẽ có chu kì tràn của Timer là 2s.

IWDG

Trong tab GPIO chọn PC13 là GPIO_Output đặt tên là Led, PA0 là GPIO_Input (Pull-up) đặt tên là Button.

IWDG led

Phần cứng nối nút nhấn giữa PA0 và GND giống hệt bài GPIO:

Sơ đồ đấu nối STM32F103C8T6 Blue Pill với nút nhấn: PA0 nối nút nhấn xuống GND, LED PC13 có sẵn trên board

Gen code và mở trong Keil C.

Lập trình STM32 IWDG trên KeilC

Trước while(1) chúng ta khởi tạo bộ IWDG, trong while đảo trạng thái led mỗi 0,5s, sau đó làm mới timer.

IWDG code
Khi nút nhấn PA0 được bấm, chương trình sẽ rơi vào vòng lặp vô hạn. Ở trong vòng lặp đó đủ 2s, MCU sẽ tự reset và bắt đầu nháy lại từ đầu.

KẾT

STM32 IWDG là 1 Timer được sử dụng khá phổ biến, nó rất hữu dụng khi đối phó với các tác nhân không thể kiểm soát được từ bên ngoài làm hệ thống hoạt động sai.
Chúc các bạn học tập thật tốt, và nhớ đánh giá bài viết này nếu thấy hay nhé!!!

5/5 - (3 bình chọn)

3 những suy nghĩ trên “Bài 14: Sử dụng STM32 IWDG Independent Watchdog Timer chống treo vi điều khiển”

  1. minh anh nói:

    set thông số 256 và 312 –> chu kì tràn của Timer là 2s: Ad giải thích giúp mình tính toán ntn được k ah. Thanks ad nhiều

  2. Đậu nói:

    Các bài viết của anh rất hay. Cảm ơn anh rất nhiều. Nếu có thời gian anh làm thêm kênh Youtube quay lại màn hình quá trình làm việc và giải thích thì sẽ tuyệt vời hơn nhiều. Chúc anh luôn thành công

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *