Site icon TAPIT

Sử dụng The Window Watchdog trên MCU STM32F103C8T6

Window Watchdog (WWDG) là một watchdog timer nâng cao, dùng để phát hiện nếu có sự xuất hiện của một lỗi phần mềm nào đó. Không giống như Independent Watchdog Timer (IWDG), bộ đếm của WWDG phải được reload (refreshed) trong khoảng thời gian window giới hạn. Nếu reload trước hoặc sau khoảng thời gian đó sẽ dẫn đến reset MCU.

Sau khi nạp chương trình, bộ đếm của WWDG sẽ bắt đầu đếm xuống từ giá trị khởi tạo ban đầu. Giá trị khởi tạo phải lớn hơn 0x40 vì tại thời điểm count bằng 0x40, chương trình sẽ thực hiện một Early Wakeup Interrupt (EWI) dưới dạng một interrupt. EWI được sử dụng để thực hiện một hoạt động trước khi diễn ra reset (ví dụ như log error, data,…).

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

Reset MCU khi:

– Downcounter có giá trị bé hơn 0x40

– Giá trị của 7 bit downcounter (T[6:0]) bị refresh trước khi downcounter đạt đến giá trị window register (W[6:0]) có software reload thanh ghi counter khi nằm trong vùng “Refresh not allowed”.

– Downcounter tự động đếm kể cả khi watchdog không được kích hoạt. Vì vậy khi kích hoạt watchdog thì phải set bit T6 lên 1 để ngăn ngừa bị reset tức thì.

** Downcounter phải được reset trong thời gian giới hạn.

Ngăn reset MCU:

 Reload giá trị downcounter khi giá trị của nó nằm trong vùng “Refresh allowed” (bé hơn giá trị của Window Register và lớn hơn 0x3F) trước khi MCU bị reset.

WWDG register map:

– Control register (WWDG_CR):

+ Reset value: 0x0000 007F

+ Bit 7: WDGA: Activation bit

+ Bit T[6:0]: 7 bit counter chứa giá trị của watchdog counter

– Configuration register (WWDG_CFR):

+ Reset value: 0x0000 007F

+ Có thể cấu hình giá trị của WWDG_CFR bằng phần mềm CubeMX

– Status register (WWDG_SR)

+ Bit 0 EWIF: Early wakeup interrupt flag

+ Bit EWIF nên xóa về 0

Cách tính thời gian TIME OUT cho WWDG:

Ví dụ sử dụng chức năng WWDT

Trong ví dụ này sử dụng 2 LED: Một LED được kết nối với chân PC13 (mainLed) và một LED được kết nối với chân PA0 (watchdogLed), cả 2 LED đều có trạng thái ban đầu là off. Khi chương trình bắt đầu, mainLed sẽ đảo trạng thái cứ mỗi 300ms. Mục đích của việc đảo trạng thái là để kiểm tra chương trình có hoạt động bình thường sau khi MCU bị reset hay không. Trong khi đó watchdogLed sẽ được bật khi downcounter đếm xuống 0x40 và gọi Early wakeup, sau đó downcounter sẽ được reload.

Cho đến khi nút nhấn được kết nối với chân PB1 được nhấn, downcounter sẽ bị gán về 0, dẫn đến MCU bị reset và LEDs chuyển qua giống như trạng thái lúc setup ban đầu.

Bước 1:

 Tạo project chạy chức năng WWDG 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 WWDG kích chọn ô Activated.

Chọn prescaler = 8 => WDGTB = 3, Window = 80, Counter = 127

36 x 10^6 / 4096 / 8 = 1098 Hz => clock time = 910.7us

Không được phép refresh trước 910.7us * (127 – 80) = 42.8 ms.

Time out = 64 x 910.7 us = 58.2 ms. WWDG sẽ reset sau khoảng thời gian này.

**Refresh downcounter trong khoảng thời gian từ 42.8 ms đến 58.2 ms

 EWI interrupt khi counter bằng 0x40.

Bước 4:

Chuyển sang mục NVIC Settings

Bước 5:

Chọn chân PB1 làm input, PC13 và PA0 làm output.

Bước 6:

Chuyển sang mục Clock Configuration để chọn tần số PCLK1 (f = 36 MHz)

Bước 7:

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 8: Code example

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