基于亚博K210开发板——看门狗实验
开发板
亚博K210开发板
实验目的
本节课主要学习 K210 的看门狗超时复位的功能
实验准备
实验元件
K210 芯片中的看门狗。
元件特性
WDT 是外围总线(APB)的一种从外设,并且也是“同步化硬件组件设计”的组成部分,具有两个 WDT,分别为 WDT0 和 WDT1 看门狗定时器,主要包含的模块有一个 APB 从接口,一个当前计数器同步的寄存器模块,一个随着计数器递减的中断/系统重置模块和逻辑控制电路,一个同步时钟域来为异步时钟同步做支持。
看门狗定时器支持如下设置:
-
APB 总线宽度可配置为 8、16 和 32 位
-
时钟计数器从某一个设定的值递减到 0 来指示时间的计时终止
-
可选择的外部时钟使能信号,用于控制计数器的计数速率
-
一个时钟超时 WDT 可以执行以下任务:
– 产生一个系统复位信号
– 首先产生一个中断,即使该位是否已经被中断服务清除,其次它会产生一 -
个系统复位信号
-
占空比可编程调节
-
可编程和硬件设定计数器起始值
-
计数器重新计时保护
-
暂停模式,仅当使能外部暂停信号时
-
WDT 偶然禁用保护
-
测试模式,用来进行计数器功能测试(递减操作)
-
外部异步时钟支持。当该项功能启用时,将会产生时钟中断和系统重置信号,即使 APB 总线时钟关闭的情况下
SDK 中对应 API 功能
对应的头文件 wdt.h
WDT 看门狗在开发单片机中作用巨大,可以在程序出现死机的情况自动重启系统,而不需要手动操作。
相关接口:
• wdt_init:配置看门狗参数,启动看门狗,不使用中断的话,将 on_irq 设置为 NULL。返回值为看门狗实际超时时间,一般比设置的时间稍微大一些。
• wdt_start(0.6.0 后不再支持,请使用 wdt_init)
• wdt_stop:关闭看门狗。
• wdt_feed:重置看门狗计时器,俗称喂狗。
• wdt_clear_interrupt:清除中断,如果在中断函数中清除中断,看门狗不会重启。
实验原理
看门狗其实就是一个需要在设定一定时间内被复位的计数器,如果没有按时复位,则会强制系统复位。在看门狗启动前需要配置超时时间,当看门狗启动后,计数器开始自动计数,经过一定时间,如果没有被复位,计数器溢出就会对 CPU产生一个复位信号使系统重启(俗称“被狗咬”)。要保证系统正常运行时,需要在看门狗超时时间内重置看门狗计数器(俗称“喂狗”)。
实验过程
- 首先在系统启动的时候答应一次“system start!”提示,可以清楚地知道系统什么时候重启过。times 用于记录喂狗的次数。然后初始化系统中断以及使能全局中断。
/* 打印系统启动信息 */
printf("system start!\n");
/* 记录feed的次数 */
int times = 0;/* 系统中断初始化 */
plic_init();
sysctl_enable_irq();
- 配置看门狗的参数,使用的是看门狗 WDT0,设置超时时间为 2 秒,中断函数函数为 wdt0_irq_cb,返回值是看门狗实际超时的时间,一般会比设置的时间稍微大一些。这里注意中断函数不是超时的时候调用的,而是实际超时时间的一半调用的。比如这里设置了 2 秒超时时间,实际超时时间约 2.58 秒,如果在 1.29秒之前没有喂狗,则会调用中断回调函数。
/* 启动看门狗,设置超时时间为2秒后调用中断函数wdt0_irq_cb */
int timeout = wdt_init(WDT_DEVICE_0, 2000, wdt0_irq_cb, NULL);/* 打印看门狗实际超时的时间 */
printf("wdt timeout is %d ms!\n", timeout);
- 在 WDT0 的中断回调中打印系统超时的信息,默认 WDT_TIMEOUT_REBOOT 为1,看门狗超时重启,如果把 WDT_TIMEOUT_REBOOT 设置为 0,则重启只会打印提示,不会重启。
#define WDT_TIMEOUT_REBOOT 1
int wdt0_irq_cb(void *ctx)
{#if WDT_TIMEOUT_REBOOTprintf("%s:The system will reboot soon!\n", __func__);while(1);#elseprintf("%s:The system is busy but not reboot!\n", __func__);wdt_clear_interrupt(WDT_DEVICE_0);#endifreturn 0;
}
- 前五次每隔 1 秒钟喂狗一次,所以在五秒之后没有喂狗,系统约过 2.6 秒后重启。
while(1){sleep(1);if(times++ < 5){/* 打印feed的次数 */printf("wdt_feed %d times!\n", times);/* 重置看门狗的计时器,重新开始计时 */wdt_feed(WDT_DEVICE_0);}}
- 编译调试,烧录运行
进入自己项目 build目录,运行以下命令编译。
cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make
编译完成后,在 build 文件夹下会生成 watchdog.bin 文件。使用type-C 数据线连接电脑与 K210开发板,打开kflash,选择对应的设备,再将程序固件烧录到 K210 开发板上。
实验现象
烧录完成固件后,系统会弹出一个终端界面,如果没有弹出终端界面的可以打开串口助手显示调试内容。
实验总结
1.看门狗的作用是当没有在设定的时间内喂狗,则系统会发送中断使系统强制重启。
2.看门狗必须在系统正常运行的情况下喂狗,这样系统异常时就能够及时重启系统。
3.看门狗的定时中断是实际超时时间的一半,需要在这个时间内喂狗