1 本节介绍
📝本节您将学习如何设置看门狗
🏆学习目标
1️⃣了解 看门狗【WDT】的基本概念。
2️⃣如何设置看门狗让他能按时复位整个系统。
2 名词解释
名词 | 说明 |
---|---|
看门狗【WDT】 | Watchdog Timer是嵌入式系统中的一种硬件定时器,主要用于提供系统运行时的自我检测和恢复机制。 |
注意:
看门狗复位会导致整个系统全部重启,如果此时连接了CanMV IDE K230,在规定时间未进行喂狗操作时,也会断开与IDE的通讯连接。
K230内部有两个看门狗,目前只能使用WDT1
,WDT0
暂时不可以使用。
3 什么是看门狗
看门狗是嵌入式系统中的一种硬件定时器,主要用于系统运行时的自我检测和恢复机制。它的核心功能是通过计时器来检测系统是否正常运行,当发现系统“卡死”或出现异常时,触发复位操作,使系统重新启动,以达到提高系统可靠性的目的。
简单来说,看门狗就像一个“监督者”,会一直盯着系统运行。如果系统“卡住”了或运行异常,看门狗就会触发复位,把系统重新启动,让它回到正常状态。为了让看门狗知道系统是正常的,程序需要定期“喂狗”,也就是告诉看门狗:“我还在正常工作”。如果程序没有按时“喂狗”,看门狗就会认为系统出问题了,从而启动复位操作。这种机制可以有效防止系统长时间停滞或崩溃,提升系统的稳定性和可靠性。
3.1 看门狗的工作原理
- 初始化看门狗: 系统启动后,首先初始化看门狗定时器,并设置一个超时时间(喂狗时间)。
- 定时复位看门狗: 在正常运行中,系统需要定期向看门狗发送信号(称为“喂狗”),重置看门狗的计时器。
- 触发复位: 如果系统未能及时“喂狗”,看门狗计时器超时会触发硬件复位操作,将系统恢复到初始状态。
3.2 看门狗的主要用途
- 检测系统卡死: 防止系统因为死循环、异常中断等原因失去响应。
- 提高系统可靠性: 对嵌入式系统进行实时监控,确保系统长时间稳定运行。
- 提供自动恢复机制: 当系统陷入不可控状态时,快速恢复到初始状态,减少人工干预。
4 WDT使用指南
K230 内部包含两个 WDT(看门狗定时器)硬件模块,主要用于在应用程序崩溃或进入不可恢复状态时重启系统。一旦启动 WDT,如果在设定的超时时间内没有进行“喂狗”操作,系统将自动复位。
WDT 类位于 machine
模块中。
4.1 示例代码
import time
from machine import WDT
# 实例化 WDT1,超时时间设置为 3 秒
wdt1 = WDT(1, 3)
# 等待 2 秒
time.sleep(2)
# 喂狗操作,重置 WDT 计时器
wdt1.feed()
# 再次等待 2 秒
time.sleep(2)
2
3
4
5
6
7
8
9
10
11
12
13
14
- 实例化 WDT:
- 创建
WDT
对象,参数为 WDT 编号和超时时间(单位:秒)。在本例中,超时时间设置为 3 秒。
- 创建
- 延迟操作:
time.sleep(2)
暂停执行 2 秒。在此期间,如果没有进行喂狗操作,WDT 将计时到 3 秒后重启系统。
- 喂狗操作:
- 调用
wdt1.feed()
方法,重置 WDT 计时器,以防止超时重启。
- 调用
- 再次延迟:
- 再次暂停 2 秒。此后,由于没有调用
feed()
,WDT 将在超时后触发重启。
- 再次暂停 2 秒。此后,由于没有调用
在IDE中运行以上代码,程序执行完成后看门狗定时器依旧在工作,会让庐山派重启。
4.2 构造函数
wdt = WDT(id=1, timeout=5)
参数
id
: WDT 模块编号,取值范围为 [0, 1],默认为 1。timeout
: 超时值,单位为秒(s),默认为 5。
注意: WDT0 暂不可用。
4.3 feed
方法
WDT.feed()
执行喂狗操作。
参数
无
返回值
无
5 看门狗复位
# 立创·庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源
# 开发板官网:www.lckfb.com
# 技术支持常驻论坛,任何技术问题欢迎随时交流学习
# 立创论坛:www.jlc-bbs.com/lckfb
# 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
# 不靠卖板赚钱,以培养中国工程师为己任
import time
from machine import Pin, FPIOA, WDT
# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()
# 设置引脚功能,将指定的引脚配置为普通GPIO功能
fpioa.set_function(62,FPIOA.GPIO62)
fpioa.set_function(20,FPIOA.GPIO20)
fpioa.set_function(63,FPIOA.GPIO63)
fpioa.set_function(53,FPIOA.GPIO53)
# 实例化Pin62, Pin20, Pin63为输出,分别用于控制红、绿、蓝三个LED灯
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 红灯
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 绿灯
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 蓝灯
# 按键引脚为53,设为下拉输入:未按下为低电平,按下为高电平
button = Pin(53, Pin.IN, Pin.PULL_DOWN)
# 板载RGB灯是共阳结构,高电平=关,低电平=亮
# 初始化时先关闭所有LED
LED_R.high()
LED_G.high()
LED_B.high()
# 定义LED颜色状态 0=红, 1=绿, 2=蓝
color_state = 0
# 初始化硬件看门狗WDT,通道1, 超时时间10秒
wdt = WDT(1, 10)
# 首先喂一次狗,确保开始有充足时间
wdt.feed()
while True:
# LED轮询:先关全,再亮指定颜色
LED_R.high()
LED_G.high()
LED_B.high()
if color_state == 0:
LED_R.low() # 点亮红灯
elif color_state == 1:
LED_G.low() # 点亮绿灯
elif color_state == 2:
LED_B.low() # 点亮蓝灯
# 切换到下一个颜色状态
color_state = (color_state + 1) % 3
# 检测按钮,如果按下则喂狗
if button.value() == 1:
wdt.feed() # 喂狗,重置WDT计时
print("wdt feed!")
# 简单去抖延时
time.sleep(0.2)
# 每0.5秒切换一次LED颜色
time.sleep(0.5)
# 长时间未喂狗情况:3秒后WDT会超时自动复位
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
建议将以上代码通过IDE保存到开发板上,让之上电后就执行(注意:如果你把看门狗的时间设置的太短,会导致你的板子在还未连上电脑IDE前就会重启,导致你无法更换默认运行的代码,此时可以把TF卡重新拿出来刷个新固件),首先利用FPIOA配置GPIO功能脚,驱动RGB共阳LED依次显示红、绿、蓝三色并循环闪烁。同时,通过一个按键(USR用户侧按按钮)进行看门狗(WDT)喂狗操作:在10秒内若没有按下按键喂狗,WDT将触发复位;如果按下按键则喂狗重置计时,确保程序持续运行。
整体流程是:程序上电初始化并启动循环,每隔0.5秒切换LED颜色,若期间检测到按键按下则重置WDT计数,否则在3秒后自动复位,实现对系统的重启。
看门狗(WDT)的主要作用是就是监控系统是否正常运行,并在系统出现异常时触发复位,上面例程并不是真实的使用场景,大家根据自己的时间项目自由设置。