看门狗(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
最后编辑:罗珍雪 更新时间:2026-11-02 20:02