Bài 15: Lập trình STM32 WWDG Window Watchdog Timer kiểm lỗi phần mềm

STM32 WWDG kiểm lỗi phần mềm

STM32 WWDG hay Window Watchdog Timer là một bộ định thời dùng để kiểm tra 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 dùng để phát hiện lỗi phần mềm gây ra bởi các tác nhân như code không chặt chẽ, nhiều bug, hoặc 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ố. Điểm khác là thời điểm làm mới bộ định thời phải nằm trong khoảng Tmin – Tmax, làm mới sớm hơn hoặc muộn hơn đều bị reset.

Giống như uống thuốc theo đơn của bác sĩ: uống muộn quá thì mất tác dụng, mà uống sớm quá cũng không được, phải uống đúng khung giờ quy định.

Sơ đồ và nguyên lý hoạt động của STM32 WWDG

Sơ đồ khối của STM32 WDG

so do khoi stm32 wwdg

Bộ STM32 WWDG bao gồm:

  • WWDG_CFR: thanh ghi cấu hình, chứa giá trị cửa sổ so sánh W[6:0] (Window)
  • WWDG_CR: thanh ghi điều khiển, gồm 1 bit kích hoạt WDGA và 7 bit giá trị bộ đếm T[6:0]
  • WDGTB: các bit trong WWDG_CFR xác định giá trị chia tần

Bộ STM32 WWDG sử dụng xung clock PCLK1 (bus APB1) của chương trình chính, vậy nên nếu clock hệ thống 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 bật, Timer sẽ bắt đầu đếm xuống từ giá trị 7 bit đã nạp. Khi bộ đếm giảm từ 0x40 xuống 0x3F (bit T6 về 0), chip sẽ bị reset.

Trong khi counter đếm, nếu có 1 lệnh làm mới (refresh, ghi vào WWDG_CR) sẽ xảy ra các tình huống sau:

  1. Nếu giá trị counter vẫn còn lớn hơn giá trị cửa sổ trong WWDG_CFR (làm mới quá sớm) => chip bị reset
  2. Nếu 0x40 ≤ counter ≤ giá trị cửa sổ => không reset, counter được nạp lại và đếm tiếp
  3. Nếu không làm mới, counter đếm tới 0x40 sẽ sinh ra ngắt cảnh báo sớm EWI (nếu được bật), đếm tiếp xuống 0x3F thì chip bị reset

Nghĩa là nếu nạp lại giá trị cho Counter trong khoảng Twindow => chương trình chạy bình thường, ngoài khoảng đó chip sẽ bị reset. Ngắt EWI là cơ hội cuối để chương trình lưu lại dữ liệu hay ghi log lỗi trước khi bị reset.

Giá trị Twindow = Tmax – Tmin

STM32 WWDG

Công thức tính thời gian

Công thức tính thời gian timeout và bảng thời gian timeout tham khảo cho PCLK1 = 36MHz như sau:

3 1 4 1

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 khoảng thời gian Twindow mà chương trình cần. Vậy nên ta cần tính 2 giá trị để nạp vào Counter và Window theo công thức:

WWDG FORMULA NEW

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 chương trình led sẽ nháy 1 lần. Trong while(1) chúng ta delay một khoảng (ms) rồi refresh lại STM32 WWDG. Nếu thời điểm refresh nằm trong khoảng Window, chương trình sẽ chạy mãi trong while và led PC13 sẽ sáng đứng yên.
Nếu refresh ngoài Window, chip sẽ bị reset liên tục 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.

STM32 WWDG

Trong GPIO chọn PC13 là Output và đổi tên thành LED.

STM32 WWDG 2

Trong WWDG chọn Activated và đặt thông số như hình.

STM32 WWDG 3

Trong Clock Configuration chọn tần số APB1 (PCLK1) là 36MHz.

STM32 WWDG 5

Giải thích giá trị nạp vào:

Ta sẽ chọn khoảng Window từ 30ms – 50ms => Tmin = 30, Tmax = 50. Áp dụng công thức với PCLK1 = 36 000 000Hz và Prescaler = 8, ta 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 downcounter value.

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 đó refresh lại counter.

STM32 WWDG 4

Nếu thời gian delay từ 30 – 50ms led sẽ luôn sáng, nếu vượt ra khỏi khoảng này led sẽ nhấp nháy liên tục. Các bạn thử đổi delay thành 20ms và 60ms để thấy cả 2 trường hợp refresh quá sớm và quá muộn nhé.

Lưu ý: Khi dừng chương trình ở breakpoint trong chế độ Debug, WWDG vẫn tiếp tục đếm và chip sẽ bị reset ngay. Muốn debug thoải mái, các bạn gọi __HAL_DBGMCU_FREEZE_WWDG(); sau khi khởi tạo để WWDG dừng đếm khi CPU bị halt.

Kết

STM32 WWDG là một bộ timer nâng cao trong việc phát hiện và xử lý lỗi phần mềm. 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 rất ấn tượng nếu chương trình cần tính chính xác cao về thời gian.

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

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

Để 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 *