STM32 WWDG hay Window Watchdog timer là một timer định thời sử dụng trong việc kiểm lỗi phần mềm, bằng cách kiểm tra các tác vụ phần mềm có chạy đúng thời gian quy định hay không.
Bài 15 trong serie Học lập trình STM32 từ A tới Z
WWDG là gì?
WWDG (Window Watchdog timer) là một bộ định thời sử dụng trong việc phát hiện lỗi phần mềm bởi các tác nhân như code không chặt chẽ, nhiều bug, các tác nhân bên ngoài làm ảnh hưởng tới sự đúng đắn của chương trình.
Cũng giống như IWDG, WWDG sẽ tạo ra 1 tín hiệu reset hệ thống khi phát hiện sự cố, chỉ khác là thời điểm để làm mới bộ định thời phải trong khoảng từ: Tmin – Tmax, nếu sớm hơn hoặc muộn hơn đều không được.
Sơ đồ và nguyên lý hoạt động của STM32 WWDG
Sơ đồ khối của STM32 WDG
Bộ STM32 WWDG bao gồm:
- WWDG_CRF: Thanh ghi chứa giá trị so sánh (Window)
- WWDG_CR: Thanh ghi điều khiển, gồm 1 Bit điều khiển WDGA và 7 bit giá trị nạp lại cho counter
- WWDGTB: Bit xác định giá chị chia tần
Bộ STM32 WWDG sử dụng xung clock từ bộ dao động của chương trình vậy nên nếu clock bị treo thì nó cũng sẽ không hoạt động.
Nguyên lý làm việc của WWDG Timer
Khi bit WDGA được Active, Timer sẽ bắt đầu đếm xuống từ giá trị của 7-bit counter tới 0
Trong khi counter đếm, nếu có 1 lệnh refesh (Write WWDG_CR) sẽ sảy ra 3 tình huống.
- Nếu giá trị của counter > Giá trị thanh ghi WWDG_CRF ( Window) => sảy ra sự kiện reset sớm EWI, có thể được bật để nhảy vào ngắt reset sớm
- Nếu giá trị của Counter < WWDG_CRF < 0x40 => không sảy ra reset và Counter sẽ được nạp lại
- Nếu giá trị Counter < 0x40 => Sảy ra sự kiện ngắt
Nghĩa là Nếu nạp lại giá trị cho Counter trong khoảng T Window => chương trình chạy bình thường, ngoài khoảng đó sẽ sảy ra ngắt.
Giá trị Twindow = Tmax – Tmin
Công thức tính thời gian
Công thức tính thời gian time out có thể tham khảo công thức và bảng tham khảo thời gian Time out cho f = 36Mhz
Công thức tính toán khi lập trình
Khi lập trình ta sẽ ước tính sẵn thời gian Twindow chương trình hoạt động. Vây nên ta cần tính 2 giá trị để nạp vào Counter và Window theo công thức
Lập trình STM32 WWDG với CubeMx và Keil C
Mô tả phương pháp: Chúng ta sử dụng led PC13 khi vào trương trình sẽ nháy 1 lần, trong while(1) chúng ta sẽ delay(ms) sau đó refesh lại STM32 WWDG, nếu thời gian refesh nằm trong khoảng Window, chương trình sẽ chạy ở trong đó và Led PC13 sẽ sáng.
Nếu refresh ngoài window, chip sẽ bị reset và PC13 sẽ nháy liên tục.
Cấu hình trong CubeMx
Trong SYS để Debug là Serial Wire
Trong RCC để chip chạy thạch anh ngoài HSE
Trong GPIO chọn PCB 13 là Output và đổi tên thành LED
Trong WWDG chọn Active và setup thông số như hình
Trong Clock chọn tần số dao động là 36 Mhz
Giải thích giá trị nạp vào:
Ta sẽ chọn thời gian Window từ 30ms – 50ms => Tmin = 30, Tmax = 50. Áp dụng công thức với AHBI CLK = 36 000 000. Ta sẽ tính ra được Counter và Window là 119 và 86.
Nạp giá trị Window vào WWDG window value, Counter vào WWDG free-running
Lập trình STM32 WDG trên Keil C
Trước while(1) chúng ta bật tắt led PC13, sau đó khởi động WWDG với lệnh Init.
Trong While(1) delay 1 khoảng thời gian sau đó refesh lại counter
Nếu thời gian delay từ 30 – 50ms led sẽ luôn sáng, nếu vượt ra khoảng này led sẽ nhấp nháy liên tục
Kết
STM32 WWDG là một timer nâng cao trong việc tìm kiếm và sửa lỗi phần mềm. Vậy nên Timer này dường như ít được mọi người sử dụng. Thế nhưng hiệu quả nó đem lại thì rất ấn tượng nếu chương trình cần tính chính xác cao.
Nếu thấy bài viết này hữu ích hãy chia sẻ cho người khác nhé, chúc các bạn học tập thật tốt !!!