一、看门狗介绍
WatchDog是为了能够防止程序跑飞而使用的一种硬件模块。如果你的程序没有跑飞,那么你的程序会 定时的去喂看门狗;如果你的程序跑飞了,那么就不会再去喂狗了,如果超过了喂狗的时间,那么狗就会 自己生成一个信号来重新reset你的CPU,让程序重新开始。
这是一种在很重要的情况下防止系统跑飞的 一种方法。

二、I.MX6ull Watchdog Timer
看门狗定时器(WDOG)通过提供一种方法来避免意外事件或编程错误,从
而防止系统故障
一旦激活了WDOG,就必须由软件定期对其进行服务。如果不进行维修,
计时器将超时。超时时,WDOG向系统复位控制器(SRC)断言内部系统复位
信号WDOG_RESET_B_DEB

Clocks
看门狗的时钟通常由系统时钟或专门的时钟电路提供。系统时钟是整个计算机系统或电子设备中用于同步各个部件工作的基准时钟信号,它可以为看门狗的时钟提供一个稳定的频率来源。在一些情况下,为了提高看门狗的独立性和可靠性,也会采用独立的时钟电路,如晶体振荡器,来专门为看门狗定时器提供时钟信号。
Timeout event
WDOG提供0.5秒到128秒的超时周期,时间分辨率为0.5秒。
用户可以通过写入看门狗控制寄存器(WDOG_WCR)中的WDOG超时字段 WT[7:0])来确定超时周期。必须通过设置看门狗控制寄存器 (WDOG_WCR)的WDE位来启用WDOG,超时计数器才能开始运行。
启用 WDOG后,计数器被激活,加载超时值并从该编程值开始倒计时。计时器 将在计数器达到零并且WDOG输出系统复位信号时超时, WDOG_RESET_B_DEB并断言WDOG_B(WDT位应在看门狗控制寄存器 ()WDOG_WCR)中设置).
但是,如果在计数器达到零之前执行服务例程(请参阅服务WDOG以重新 加载计数器),则可以通过使用新的超时值(WDOG_WCR的WT[7:0])重新加载计数器来防止超时条件。
Servicing WDOG to reload the counter
要将超时值重新加载到计数器,正确的服务序列首先写入0x_5555,然后写入0x_AAAA到看门狗服务寄存器(WDOG_WSR)。两次写入之间可以执行 任意数量的指令。如果WDOG_WSR在写入0x_AAA之前,没有加载0x_5555到 WDOG_WSR ,则不会重新加载计数器。如果在写入0x_5555后,写了 0x_AAAA以外的任何值写入WDOG_WSR,则不会重新加载计数器。此服务序 列将使看门狗控制寄存器(WDOG_WCR)的超时值WT[7:0]重新加载计数 器。超时值可以在任何时候更改;当WDOG由内核提供服务时,它会被重 新加载。
编程思路:
设置复位信号产生后以冷启动方式复位
关闭看门狗控制器
设置看门狗定时器定时时间
使能看门狗
进行喂狗服务,重置看门狗定时器
不喂狗看门狗定时器超时,产生复位信号,复位开发板
三,代码实现
#include "wdog.h"
void wdog_init()
{
CCM->CCGR3 |= (0x3<<16);
WDOG1->WCR &=~(0x1<<2);
SRC->SCR &=~(0x1<<0);
WDOG1->WCR &=~(0x1<<2);
WDOG1->WCR &=~(0xff<<8);
WDOG1->WCR |=(0x9<<8);
WDOG1->WCR |=(0x1<<2);
}
void wdog_service()
{
WDOG1->WSR = 0x5555;
uart_printf("servering ...\r\n");
WDOG1->WSR = 0xAAAA;
}
void wdog_test()
{
wdog_init();
int i;
for(i=0;i<10;i++)
{
wdog_service();
uart_printf("%3d",i);
delay_s(1);
}
}
简单来说,看门狗就是一种保护机制,防止程序卡死或者跑飞的一种复位操作.