Files
STM8_Mesh_Control/src/drivers/watchdog.c
T

43 lines
1.2 KiB
C

/**
* @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)
{
/* 等待硬件看门狗复位;故意不刷新计数器。 */
}
}