/** * @file watchdog.c * @brief STM8S003 独立看门狗实现。 * * 看门狗只在主循环末尾刷新。任何任务死循环或长期阻塞超过约 5 秒, * 都会触发 MCU 复位;复位后 main() 从头执行,继电器首先被置为断开。 */ #include "watchdog.h" #include "stm8s003_registers.h" /** 启动看门狗并设置约 5 秒量级的预分频和重装值。 */ void Watchdog_Init(void) { REG8(IWDG_KR_ADDR) = 0xCCu; REG8(IWDG_PR_ADDR) = 0x06u; REG8(IWDG_RLR_ADDR) = 0xFFu; REG8(IWDG_KR_ADDR) = 0xAAu; } /** 刷新看门狗,防止正常运行时复位。 */ void Watchdog_Refresh(void) { REG8(IWDG_KR_ADDR) = 0xAAu; } /** * 立即触发看门狗复位。 * * UART发送函数在返回前会等待最后一个字节写入发送寄存器,因此OTA校验 * 成功分支可以先发送0x8B,再调用本函数。这里把看门狗重装值改为最小值, * 随后不再刷新计数器,避免等待原先约5秒的完整超时时间。 */ void Watchdog_ResetNow(void) { REG8(IWDG_KR_ADDR) = 0x55u; REG8(IWDG_RLR_ADDR) = 0x01u; REG8(IWDG_KR_ADDR) = 0xAAu; while (1) { /* 等待硬件看门狗复位;故意不刷新计数器。 */ } }