看门狗(WDT)

芯片内置 WDT,当前超时 4 秒,超时直接复位。

一、API(User/bsp.c)

void LT_WDT_Init(void)
{
    WDT->WCR &= ~0x01;   // 清 EN,先关狗
    WDT->WCR |= 0x70;    // WDP[6:4]=7,预分频 16
    WDT->WCR |= 0x08;    // IF=1,写 1 清中断标志
    WDT->WMR = 32000;    // 8000=1s 16000=2s 24000=3s 32000=4s
    WDT->WCR |= 0x02;    // CU=1,让 WMR 生效
    WDT->WCR |= 0x01;    // EN=1,启动
}

void WDT_FeedDog(void)
{
    WDT->WSR = 0x5555;   // 先 0x5555
    WDT->WSR = 0xAAAA;   // 再 0xAAAA,顺序不可颠倒
}

声明在 bsp.h。

WCR 位(Lib/include/lt168_wdt.h)

位 名 说明
0 EN 使能
1 CU 更新 WMR
2 IE 中断使能(当前未开)
3 IF 中断标志,写 1 清
6:4 WDP 预分频
7 IS 中断状态
8-11 DBG/STOP/DOZE/WAIT 低功耗行为

二、启动时机

  • 关狗:main.c 的 InitialChip() 里 WDT->WCR = 0x0;,防止初始化期被复位
  • 开狗:LT_WDT_Init();,放在所有耗时初始化之后(main.c)

三、喂狗点

  • 主循环:第一行就是 WDT_FeedDog()
  • UI_update == 1 的内层 while(1) 里也有

其它长循环内的喂狗(新增长耗时循环要照做):

文件 场景
Function/rtc.c RTC 起振等待
Function/rtp.c 触摸校准
Function/LT758.c 各类等待循环(13 处)
Function/if_port.c 接口等待
Function/w25qxx.c / w25n01.c Flash 操作
Function/LT758_NandFlash.c NAND 操作

写法:

while (1) {
    WDT_FeedDog();
    ...
}

四、改参数

需求 改动
改超时 bsp.c 的 WDT->WMR(按 8000 = 1s 线性换算,8 秒写 64000)
换预分频 bsp.c 的 `WDT->WCR
不启动 注释掉 main.c 里的 LT_WDT_Init()(InitialChip 已保证关狗)
运行时关 / 开 WDT->WCR &= ~0x01; / `WDT->WCR
超时改为中断而非复位 LT_WDT_Init() 里加 `WDT->WCR

五、库 API(Lib/src/lt168_wdt.c)

API 作用
WDT_Init(config) 按 wdt_config_ts 初始化
WDT_Set_Modulus(m) 写 WMR 并置 CU
WDT_Enable / WDT_Disable 开关
WDT_Feed_Dog 喂狗
WDT_Clear_Interrupt_Flag 清 IF
WDT_Interrupt_Enable 置 IE

配置结构体 wdt_config_ts(lt168_wdt.h):modulus / prescaler / interrupt / en。
预分频 wdt_prescaler_te(lt168_wdt.h):2048 / 1024 / 512 / 256 / 128 / 64 / 32 / 16。

作者:罗珍雪  创建时间:2026-10-20 10:25
最后编辑:罗珍雪  更新时间:2026-11-02 20:02
上一篇:
下一篇: