单片机看门狗定义及其作用分析
什么是单片机看门狗
看门狗(WDT)是一个定时器,开启看门狗定时器之后(比如定时200ms),在单片机程序中每隔一定的时间(小于200ms)要“喂狗”一次,即将看门狗定时器清零。这样做的用处是,一旦单片机程序跑飞,没有在定时的时间之内去喂狗,那么定时达到200ms时,看门狗自动将单片机复位。
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watchdog)。
单片机看门狗的作用
看门狗的作用是系统CPU正常工作时定时给看门狗喂狗,复位定时器,如果系统出问题,没有给看门狗喂狗,看门狗就由于超时将CPU复位。
系统用初始化后注册看门狗中断request_irq(WDT0_ACCSCSSNBARK_INT, wdog_bark_handler, 0, “apps_wdog_bark”, NULL);
和初始化看门狗的超时时间bark time,
__raw_wri[te](/tags/te/)l(timeout, msm_tmr0_base + WDT0_BARK_TIME);__raw_writel(timeout + 3*WDT_HZ, msm_tmr0_base + WDT0_BITE_TIME);
复位看门狗,使能看门狗和中断极性。
__raw_writel(1, msm_tmr0_base + WDT0_EN);__raw_writel(1, msm_tmr0_base + WDT0_[RS](/tags/rs/)T);enable_percpu_irq(WDT0_ACCSCSSNBARK_INT, IRQ_TYPE_EDGE_RISING);
并且初始化和启动一个定时器,比如10秒一次,
schedule_delayed_w[or](/app/1716)k_on(0, &dogwork_struct, delay_time);stat[ic](/app/1726) DECLARE_DELAYED_WORK(dogwork_struct, pet_watchdog_work);static DECLARE_WORK(init_dogwork_struct, init_watchdog_work);static struct msm_watchdog_pdata msm_watchdog_pdata = {.pet_time = 10000,.bark_time = 11000,.has_secure = true,.needs_ex[pi](/tags/pi/)red_enable = true,};
delay_time = msecs_to_jiffies(pdata-》pet_time);
schedule_work_on(0, &init_dogwork_struct);
定时器定时时间到了对定时器复位pet dog 和重新启动定时器。
static void pet_watchdog_work(struct work_struct *work){pet_watchdog();if (enable)schedule_delayed_work_on(0, &dogwork_struct, delay_time);}
如果系统出问题了,没有办法执行定时器的回到函数,那么看门狗就产生中断,执行中断服务程序static irqreturn_t wdog_bark_handler(int irq, void *dev_id),
执行panic。 panic(“Apps watchdog bark received!”);
单片机独立看门狗和窗口看门狗的区别
早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作。为了避免这个问题,后期的MCU在内部集成了看门狗的功能。
为了满足更多使用场景,现在很多MCU都集成了两个看门狗: 独立看门狗与窗口看门狗 。
拿现在大家熟悉的STM32来说,都集成了独立看门狗和窗口看门狗,下面就展开来讲讲这个两个看门狗以及它们的区别。
独立看门狗
独立看门狗,顾名思义,就是独立的一个看门狗,由其专用低速时钟 (LSI) 驱动,因此,即便在主时钟发生故障时仍然保持工作状态。
IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。
独立看门狗特性:
自由运行递减计数器
时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)
当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)
窗口看门狗
窗口看门狗,之所以称为窗口,是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间:喂狗的时间不能过早也不能过晚。
窗口型看门狗特性:
窗口看门狗的上窗口就是配置寄存器WWDG->CFR里设定的W[6:0];下窗口是固定的0x40;当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。
窗口型看门狗工作原理
上窗口的值可以只有设定,7位二进制数最大只可以设定为127(0x7F),最小又必须大于下窗口的0x40,所以其取值范围为64127(即:0x400x7F);配置寄存器WWDG->CFR中为计数器设定时钟分频系数,确定这个计数器可以定时的时间范围,从而确定窗口的时间范围。
窗口看门狗的时钟来自于PCLK1,在时钟配置中,其频率为外部时钟经倍频器后的二分频时钟,即为36MHz,根据手册可以知道其定时时间计算方法:
两者对比
1. 使用条件对比
2. 特点对比
两者的区别
独立看门狗与窗口看门狗的区别如下:
独立看门狗没有中断,窗口看门狗有中断。独立看门狗有硬件软件之分,窗口看门狗只能软件控制。独立看门狗只有下限,窗口看门狗有下限和上限。独立看门狗是12位递减的,窗口看门狗是7位递减的。独立看门狗是用的内部大约40KHz的RC振荡器,窗口看门狗是用的系统时钟APB1ENR独立看门狗没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位。
要注意看门狗和外接复位IC同时存在的情况,外部电路可能会阻止看门狗复位。
窗口看门狗有中断,这个中断的作用是在计数器达到下限0x40的时候,产生中断,让你喂狗;如果你不喂狗,计数器的值变为0x3f的时候,将会产生系统复位;即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减1也会变成0x3f产生复位。
窗口看门狗还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了;这个值小于计数器初始值的时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器。意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。