Bài viết 16 thuộc series STM32F103C8T6 tập trung theo hướng “học để làm được việc”. Với chủ đề Watchdog trên STM32F103C8T6: IWDG và WWDG, bạn sẽ đi từ lý thuyết cốt lõi đến quy trình triển khai thực tế trong phòng lab. Nội dung được thiết kế để sinh viên, kỹ thuật viên bảo trì và người mới chuyển từ PLC sang Embedded đều có thể áp dụng ngay vào project mẫu.

Một hệ thống công nghiệp không chỉ cần chạy đúng mà còn phải tự phục hồi khi có lỗi bất thường. Watchdog là lớp bảo vệ tối quan trọng để tránh treo chương trình kéo dài gây dừng máy.

Watchdog IWDG WWDG
Minh họa cho bài 16: Watchdog trên STM32F103C8T6: IWDG và WWDG.

1. Mục tiêu bài học

Bài này tập trung vào thiết kế watchdog có chủ đích: timeout hợp lý, điểm refresh đúng chỗ và cơ chế ghi nhận nguyên nhân reset để phục vụ bảo trì.

  • Phân biệt IWDG và WWDG về nguồn clock và hành vi.
  • Tính timeout watchdog theo yêu cầu ứng dụng.
  • Thiết kế điểm refresh an toàn theo trạng thái hệ thống.
  • Ghi nhận và phân tích nguyên nhân reset để cải tiến firmware.

Sau khi hoàn thành, bạn nên tự trả lời được ba câu hỏi: hệ thống cần đo/điều khiển đại lượng gì, vòng đời xử lý dữ liệu chạy theo chu kỳ nào, và cơ chế bảo vệ lỗi nào cần có để hệ thống ổn định khi chạy liên tục ngoài hiện trường.

2. Kiến thức nền tảng

STM32F103C8T6 dùng lõi ARM Cortex-M3, phù hợp để học đồng thời kiến trúc MCU và phương pháp lập trình thời gian thực. Khi học theo lộ trình chuẩn, bạn nên nắm đồng thời phần cứng (clock, GPIO, bus, nguồn), firmware (HAL/LL, ngắt, timer), và phương pháp test (scope, logic analyzer, UART log). Việc kết hợp đủ ba lớp kiến thức giúp quá trình debug nhanh hơn nhiều so với chỉ học code thuần.

  • Khái niệm fail-safe trong hệ thống nhúng.
  • RCC reset flag và cách đọc nguyên nhân reset.
  • Health monitor cho task định kỳ.
  • Nguyên tắc phục hồi mềm trước khi reset cứng.

Trong quá trình thực hành, bạn nên duy trì checklist kiểm thử ở từng vòng: xác nhận wiring, xác nhận xung clock, xác nhận trạng thái ngoại vi, sau đó mới kiểm tra thuật toán. Cách làm này giảm đáng kể lỗi dây chuyền và giúp nhóm dự án phối hợp hiệu quả giữa phần cứng và phần mềm.

3. Phân tích kỹ thuật

IWDG cho bảo vệ toàn cục

IWDG dùng clock độc lập nên vẫn hoạt động khi clock chính gặp vấn đề. Đây là lựa chọn phổ biến cho lớp bảo vệ cuối cùng trong thiết bị cần chạy liên tục và khó can thiệp trực tiếp.

  • Tính prescaler + reload theo timeout mong muốn.
  • Khởi tạo IWDG sớm sau khi hệ thống ổn định cơ bản.
  • Không refresh trong nhánh lỗi chưa xử lý xong.

WWDG cho giám sát cửa sổ thời gian

WWDG bổ sung cơ chế “refresh đúng thời điểm”, giúp phát hiện cả trường hợp loop chạy quá nhanh bất thường. Cơ chế này phù hợp để bắt lỗi logic khi firmware mất đồng bộ trạng thái.

  • Xác định cửa sổ refresh đủ rộng cho jitter bình thường.
  • Đặt refresh tại điểm kết thúc chu kỳ task chính.
  • Theo dõi reset do WWDG để khoanh vùng lỗi logic.

Kết hợp watchdog với health-check

Watchdog chỉ thực sự hiệu quả khi kết hợp bộ kiểm tra sức khỏe tác vụ: UART alive, timer tick alive, sensor update alive. Nếu một tác vụ chết, hệ thống không refresh watchdog để buộc reset có kiểm soát.

  • Tạo bitmap health flag cho từng tác vụ quan trọng.
  • Refresh watchdog khi và chỉ khi tất cả flag đạt.
  • Lưu mã lỗi vào backup register trước reset nếu có.

Từ góc nhìn hệ thống, chủ đề này không chỉ là “chạy được chức năng”, mà còn là bài toán tối ưu độ tin cậy, độ trễ xử lý, khả năng mở rộng khi thêm cảm biến hoặc thêm kênh truyền thông. Nếu ngay từ đầu bạn chuẩn hóa cấu trúc code theo module driver/app/service thì giai đoạn mở rộng về sau sẽ nhẹ hơn rất nhiều.

4. Các bước thực hiện

Refresh watchdog chỉ nên thực hiện khi hệ thống thực sự khỏe mạnh, không đặt bừa trong mọi vòng lặp.

  1. Xác định hậu quả khi treo hệ thống và timeout mục tiêu.
  2. Cấu hình IWDG (và WWDG nếu cần) trong CubeMX.
  3. Tạo health-check cho các tác vụ quan trọng.
  4. Đặt điểm refresh watchdog ở cuối chu kỳ kiểm tra health.
  5. Mô phỏng treo tác vụ để xác nhận watchdog reset đúng.
  6. Ghi log nguyên nhân reset phục vụ bảo trì.

Ở mỗi bước, bạn nên lưu log kỹ thuật (ảnh wiring, ảnh cấu hình CubeMX, thông số timer/UART/ADC, snapshot kết quả đo). Bộ log này giúp giảng viên hoặc trưởng nhóm đánh giá tiến độ nhanh và giảm thời gian trao đổi khi cần hỗ trợ từ xa.

5. Ví dụ refresh IWDG theo health-check

Code dưới đây là mẫu rút gọn theo HAL Library, tập trung phần cốt lõi để bạn nhìn rõ luồng xử lý. Khi đưa vào dự án thực, hãy tách code thành các module rõ ràng, thêm kiểm tra lỗi trả về và timeout cho mọi giao tiếp ngoại vi.

volatile uint8_t task_uart_ok = 0;
volatile uint8_t task_sensor_ok = 0;
volatile uint8_t task_ctrl_ok = 0;

void Watchdog_Service(void)
{
    if (task_uart_ok && task_sensor_ok && task_ctrl_ok) {
        HAL_IWDG_Refresh(&hiwdg);
        task_uart_ok = task_sensor_ok = task_ctrl_ok = 0;
    }
}

Nguyên tắc quan trọng: giữ hàm ngắt ngắn gọn, xử lý nặng chuyển về vòng lặp chính hoặc task nền; dùng biến trạng thái rõ ràng để tránh race condition; thêm timeout cho mọi thao tác có thể block. Đây là nền tảng để firmware ổn định khi chạy lâu dài.

6. Lỗi thường gặp

Phần lớn lỗi trong STM32F103C8T6 đến từ cấu hình chưa đồng bộ giữa clock, ngoại vi và wiring thực tế. Nếu bạn xử lý theo thứ tự “đọc triệu chứng -> khoanh vùng lớp lỗi -> test độc lập từng khối”, thời gian debug sẽ giảm rất rõ.

  • Refresh watchdog ở mọi nơi khiến mất ý nghĩa bảo vệ.
  • Timeout quá ngắn gây reset giả khi tải tăng.
  • Không phân tích reset flag sau khi khởi động lại.
  • Không mô phỏng lỗi nên watchdog chưa được kiểm chứng.
  • Quên đồng bộ health-check giữa các tác vụ.

Hãy kết hợp watchdog với state health-check thay vì chỉ “đá chó” theo chu kỳ cứng.

7. Bài tập thực hành

Để chuyển từ mức “hiểu lý thuyết” sang “làm chủ kỹ năng”, bạn nên làm các bài tập sau theo đúng thứ tự từ dễ đến khó, sau mỗi bài đều ghi lại tiêu chí đạt/chưa đạt và thông số đo thực tế.

  1. Thiết kế watchdog cho hệ gồm 3 task định kỳ khác chu kỳ.
  2. Mô phỏng treo UART task và ghi nhận hành vi reset.
  3. So sánh IWDG-only và IWDG+WWDG trong cùng project test.
  4. Viết báo cáo FMEA ngắn cho cơ chế chống treo firmware.

Khuyến nghị chấm bài theo rubric: đúng chức năng (40%), độ ổn định 30 phút chạy liên tục (30%), chất lượng cấu trúc code (20%), tài liệu kỹ thuật và báo cáo đo kiểm (10%).

Tài liệu tham khảo

  • STMicroelectronics, STM32F103x8/B Datasheet.
  • STMicroelectronics, RM0008 Reference Manual: STM32F10xxx advanced ARM-based 32-bit MCUs.
  • STMicroelectronics, UM1850 STM32CubeMX user manual và tài liệu STM32Cube liên quan.
  • ARM, Cortex-M3 Technical Reference Manual.
  • STMicroelectronics Application Notes về GPIO, ADC, Timer, UART, I2C, SPI, DMA và Watchdog.