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