看门狗

看似乖巧的看门狗,也有比较调皮的一面,在烧录无法喂狗的特殊情况下仍会毫不留情的复位芯片,造成烧录失败,该如何避免这种情况的发生吗?

初识看门狗

嵌入式产品设备在电源瞬变、电磁干扰、 静电放电、极端温湿度等复杂环境的干扰下可能会造成程序异常,从而使系统陷入瘫痪状态,这时候我们就希望设备能够自动复位,而不需要人工干预,看门狗定时器可以帮助捕获和重置已经“失控”的设备,实现无人值守,提高系统可靠性。看门狗又叫 watchdog timer,是一个定时器电路,一般有一个输入端用来喂狗,一个输出端RST接到芯片的复位引脚,芯片正常工作的时候,每隔一段时间输出一个信号到喂狗端,给看门狗清零,如果超过规定的时间不喂狗,看门狗溢出,就会给出一个复位信号,拉低RST引脚使得芯片复位。ZL6300 是广州致远微电子有限公司自行设计的一款集欠压监测复位、手动复位和超时复位功能的看门狗芯片,具有以下特性:上电复位脉冲200mS;支持手动复位;看门狗定时器溢出周期1.7S;低功耗仅9uA;欠压复位。

1.png

图1 ZL6300内部结构

应用电路

通过之前对看门狗的初步认识,好的看门狗设计可以大大提升产品的稳定可靠性,我司基于该理念,核心板上均板载独立看门狗,为适应各种复杂环境保驾护航。下面以我司性能卓越的M3568核心板为例,看下它如何灵活设计看门狗电路,对应的原理图如下图2所示,看门狗芯片选型ZL6300,支持手动按键复位和看门狗溢出复位,当系统正常运行时从芯片上电启动到加载看门狗喂狗驱动所需时长约为1S左右,ZL6300溢出周期为1.7S,可以在看门狗溢出周期内及时喂狗清除定时器。

2.png

 图2 看门狗电路

当芯片处于烧录状态时因内核停止工作,喂狗程序不能正常运行,不能及时喂狗,看门狗溢出拉低芯片复位引脚,导致程序下载失败。为应对这种特殊情况,预留了跳线冒选项,插上短路帽即可禁用看门狗,当J2插上短路帽时WDO_EN被拉至低电平,Q1三级管处于关断状态,WDI引脚处于高组态,当WDI引脚检测到它处于高阻抗状态时将产生自己的WDI脉冲,对应的喂狗波形如下图3所示。

3.png

图3 看门狗禁能时喂狗波形

当烧录完成后拔掉跳线帽,Q3处于导通状态,芯片产生的喂狗脉冲WDI_GPIO可通过Q3传递到WDI引脚,实现正常喂狗,对应的喂狗波形如下图4所示。

4.png

图4 看门狗使能时喂狗波形

总结

下面简单汇总看门狗电路设计注意事项

  • 看门狗复位脉冲时长要大于CPU的最少复位时间;

  • 看门狗溢出周期要大于系统启动到加载看门狗驱动时长,并留有一定的余量;

  • 充分利用WDI引脚在高阻态时看门狗定时器功能禁用;

  • 避免通过使能看门狗的电源来控制看门狗工作与否,否则会造成系统一直重启,看门狗芯片上电后会输出一个时长200mS的POR信号。

来源:ZLG致远电子

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 66

01、简介

在单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序跑飞而陷入死循环,程序的正常运行被打断,从而导致由单片机控制的系统无法继续工作,整个系统陷入停滞状态,发生不可预料的后果。这时候就需要使用专用的复位芯片来达到更可靠的复位。现在讲的“复位”,其作用就是通过相关电路产生“复位信号”, 让单片机能在上电后或者运行中恢复到默认的起始状态。

中微爱芯推出电压监控型以及看门狗型的复位电路,拥有齐全的复位电压点,可满足客户在不同条件下的使用需求,为整个系统的正常工作保驾护航。

以下将分别介绍两种类型的复位电路。

02、电压监控型复位电路

电压监控器是监控系统内一个或多个电源轨的器件。电压监控器可以检测欠压事件(电压低于某个阈值)或过压事件(电压超过某个阈值)。根据器件状态的不同,当受监控的电压轨电压低于或高于预设的阈值电压时,电压监控器会将信号置为使能、禁用或复位其他器件。部分电压监控器可以同时监控欠压和过压情况,称为窗口检测器。电压监控器旨在确保系统正常上电,防止处理器发生欠压,同时实时监控系统,避免因电压轨超出规范而产生性能问题或系统故障。其工作原理如下所示:

1.png

带有电压监控器功能的复位 IC,能够保证复位的释放发生在电源供应正常之后,从而确保可靠复位。同时,若电源出现过压或跌落故障,芯片还能及时保护处理器,并在电源恢复后执行可靠复位重启。

为了适应不同的应用,复位 IC 通常还支持可选的高电平有效或低电平有效,推挽或开漏输出。推挽和开漏指的是输出驱动的类型,推挽输出在输出端使用两个晶体管。当顶部晶体管导通时,输出设置为高电平;底部晶体管导通时,输出设置为低电平。开漏输出仅使用一个晶体管,通过其将输出设置为低电平,同时另外使用一个上拉电阻代替顶部晶体管设置高电平输出。下图展示了开漏和推挽两种输出类型:

2.png

推挽式输出的优点是速度快并且功耗低。然而,开漏输出可以将多个监控器件的输出连接在一起,形成或/与逻辑输出配置,方便多电源轨的监控控制。

以我司AiP810这款高电平复位电路专用芯片为例,搭建如图1所示电路,上电后测量“Reset”电气网络可以得到如图2所示波形:

3.png

图1

4.png

图2

以下是我司复位类IC选型表:

5.png

复位电压选型表:

6.png

03、看门狗型复位电路

出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称"看门狗"(watchdog)。

看门狗电路一般有软件看门狗和硬件看门狗两种。软件看门狗不需外接硬件电路,但系统需要出让一个定时器资源,这在许多系统中很难办到,而且若系统软件运行不正常,可能导致看门狗系统也瘫痪。因此硬件看门狗是真正意义上的“程序运行监视器”。

硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在看门狗定时器定时时间到之前对其进行复位。如果出现死循环,或者说PC指针不能回来,那么定时时间到后就会使单片机复位。

 以下为我司看门狗型复位电路选型:

7.png

复位电压选型表:

8.png

04、高精度复位电路

中微爱芯推出高精度复位电路,此系列复位电路可在全温范围内复位电压保持在2%的精度,更适用于可靠性要求较高的方案。

以下为我司高精度复位电路选型:

9.png

复位电压选型表:

10.png

来源:无锡中微爱芯电子有限公司

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 49

看似乖巧的看门狗,也有比较调皮的一面,在烧录无法喂狗的特殊情况下仍会毫不留情的复位芯片,造成烧录失败,该如何避免这种情况的发生吗?

初识看门狗

嵌入式产品设备在电源瞬变、电磁干扰、 静电放电、极端温湿度等复杂环境的干扰下可能会造成程序异常,从而使系统陷入瘫痪状态,这时候我们就希望设备能够自动复位,而不需要人工干预,看门狗定时器可以帮助捕获和重置已经“失控”的设备,实现无人值守,提高系统可靠性。

看门狗又叫 watchdog timer,是一个定时器电路,一般有一个输入端用来喂狗,一个输出端RST接到芯片的复位引脚,芯片正常工作的时候,每隔一段时间输出一个信号到喂狗端,给看门狗清零,如果超过规定的时间不喂狗,看门狗溢出,就会给出一个复位信号,拉低RST引脚使得芯片复位。

ZL6300 是广州致远微电子有限公司自行设计的一款集欠压监测复位、手动复位和超时复位功能的看门狗芯片,具有以下特性:

  • 上电复位脉冲200mS;

  • 支持手动复位;

  • 看门狗定时器溢出周期1.7S;

  • 低功耗仅9uA;

  • 欠压复位。

1.png

图1 ZL6300内部结构

应用电路

通过之前对看门狗的初步认识,好的看门狗设计可以大大提升产品的稳定可靠性,我司基于该理念,核心板上均板载独立看门狗,为适应各种复杂环境保驾护航。下面以我司性能卓越的M3568核心板为例,看下它如何灵活设计看门狗电路,对应的原理图如下图2所示,看门狗芯片选型ZL6300,支持手动按键复位和看门狗溢出复位,当系统正常运行时从芯片上电启动到加载看门狗喂狗驱动所需时长约为1S左右,ZL6300溢出周期为1.7S,可以在看门狗溢出周期内及时喂狗清除定时器。

2.png

 图2 看门狗电路

当芯片处于烧录状态时因内核停止工作,喂狗程序不能正常运行,不能及时喂狗,看门狗溢出拉低芯片复位引脚,导致程序下载失败。为应对这种特殊情况,预留了跳线冒选项,插上短路帽即可禁用看门狗,当J2插上短路帽时,WDO_EN被拉至低电平,Q1三级管处于关断状态,WDI引脚处于高组态,当WDI引脚检测到它处于高阻抗状态时将产生自己的WDI脉冲,对应的喂狗波形如下图3所示。

3.png

图3 看门狗禁能时喂狗波形

当烧录完成后拔掉跳线帽,Q3处于导通状态,芯片产生的喂狗脉冲WDI_GPIO可通过Q3传递到WDI引脚,实现正常喂狗,对应的喂狗波形如下图4所示。

4.png

图4 看门狗使能时喂狗波形

总结

下面简单汇总看门狗电路设计注意事项

  • 看门狗复位脉冲时长要大于CPU的最少复位时间;

  • 看门狗溢出周期要大于系统启动到加载看门狗驱动时长,并留有一定的余量;

  • 充分利用WDI引脚在高阻态时看门狗定时器功能禁用;

  • 避免通过使能看门狗的电源来控制看门狗工作与否,否则会造成系统一直重启,看门狗芯片上电后会输出一个时长200mS的POR信号。

来源:ZLG致远电子

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 50

中科芯CKS32F4xx系列产品内部提供两个看门狗定时器单元,独立型看门狗IWDG(Independent Watchdog)和窗口型看门狗WWDG(Window Watchdog),本文主要介绍WWDG的应用,关于IWDG的详情,请参看我们的IWDG微课堂内容。

WWDG简介

通过前面的课程,我们知道IWDG独立看门狗的工作原理就是一个递减计数器在LSI时钟的驱动下不断的往下递减计数,当减到0之前如果没有刷新递减计数器的值(俗称喂狗),便会触发系统复位。

WWDG窗口看门狗也是一个递减计数器不断的往下递减计数。但和IWDG独立看门狗有四处不同:(1)IWDG由独立RC振荡器产生的LSI驱动,不受主时钟影响,但精度不高;WWDG由APB1分频时钟驱动,受主时钟影响,精度高;

(2)IWDG直接由VDD电压域供电,即使在MCU停止模式和待机模式下仍然能照常工作;

(3)IWDG计数器减到下限0时触发复位,WWDG计数器减到下限0x40时触发复位,下限值不同;(4)IWDG计数器只有复位下限值0,WWDG计数器不仅有复位下限0x40,还有一个复位上限X(用户设定),上限值与下限值之间形成一个复位窗口。WWDG计数器的值在减到上限X之前(窗口外)喂狗,同样也会产生复位。因此WWDG必须在窗口上限和窗口下限之间才可以喂狗,这是窗口看门狗的特殊之处。

1.jpg

2.jpg

WWDG详细介绍

1.WWDG功能框图解析

下图是窗口看门狗的功能框图,分4个部分进行说明:

3.jpg

① WWDG时钟:窗口看门狗的时钟来自APB1时钟线分频出的PCLK1,最大42MHz,由RCC时钟控制器控制开启;

② 计数器时钟和WWDG_CFR寄存器:CK计时器时钟 = PCLK1 / 4096,计数器时钟由CK计时器时钟经过预分频器分频得到,分频系数由配置寄存器WWDG_CFR的WWDGTB[1:0]控制,可以是0~3,因此计数器的时钟CNT_CK = PCLK1 / 4096 / (2^WWDGTB),进而可算出一个计数周期时间是T = 1 / CNT_CK;

③ 计数器和WWDG_CR寄存器:WWDG的计数器是一个7位递减计数器,其值存放在控制器寄存器WWDG_CR的T[6:0]中,当该计数器的值从0x40变为0x3F时,产生复位,因此计数器的值只能是在0x7F~0x40之间,有效位是T[5:0]。WWDG_CR的WDGA位则是窗口看门狗的激活位,可由软件置1来启动WWDG,要注意WDGA一旦置1,只能在硬件复位后才能清零;

④ 窗口上限值:WWDG的窗口下限值固定是0x40,但窗口上限值可以人为设定,具体可由WWDG_CFR配置寄存器的W[6:0]设置,其值必须大于0x40且小于0x7F,否则就失去了意义。

最后介绍的是状态寄存器(WWDG_SR)和EWI(Early wakeup interrupt)中断,该寄存器用来记录当前是否有提前唤醒EWI的中断标志。该寄存器仅有位0有效,其他都是保留位。当计数器值达到0x40时,此位由硬件置1,它必须通过软件写0来清除。在初始化WWDG时,一般会先通过软件写0清除一次。用户可以在EWI(Early wakeup interrupt)中断服务程序里进行一些必要的操作。

2.计算看门狗超时时间

窗口看门狗的时序图如下:

4.jpg

假设PCLK1时钟为42MHz,按照上述计算方法,可以得到WWDG的超时时间计算公式Twwdg =1 / PCLK1 x 4096 x 2^WDGTB x (T[5:0]+1),范围如下表:

5.jpg

3.WWDG库函数配置步骤

接下来介绍如何驱动CKS32F4xx系列产品的WWDG工作。窗口看门狗相关的库操作函数在文件cks32f4xx_wwdg.c和对应的头文件cks32f4xx_wwdg.h中。具体配置步骤如下:

(1)使能WWDG时钟

不同于IWDG,IWDG有自己独立的32KHz时钟,不需要使能。而WWDG使用的PCLK1时钟需要先进行使能。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能

(2)设置WWDG窗口上限和WDGTB分频系数

void WWDG_SetWindowValue(uint8_t WindowValue);      //设置WWDG 窗口上限
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);    //设置WDGTB分频系数

(3)开启WWDG中断并分组

WWDG_ClearFlag(); //清除提前唤醒中断标志位
NVIC_Init();      //设置中断优先级
WWDG_EnableIT();  //开启窗口看门狗中断

(4)设置计数器初始值并使能看门狗

void WWDG_Enable(uint8_t Counter);  //设置计数器值并使能看门狗

完成以上4个步骤之后,我们就可以使用CKS32F4的窗口看门狗了。之后在程序里面就必须周期性的在窗口上下限范围内进行喂狗(一般调用WWDG_SetCounter函数),否则将导致系统复位。

4.WWDG的应用场景

WWDG一般被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。比如一个十分关键的程序段正常运行的时间是50ms以内,在运行完这个段程序之后紧接着进行喂狗,如果在规定的时间窗口内还没有喂狗,那就说明我们监控的程序并没有在预期的50ms内运行完成,可以认为出故障了或跑飞了,那么此时产生系统复位来解除这个故障,让程序重新运行。

实验例程

为本期微课堂配套了一个例子,整体功能如下:

(1)系统上电后,LED1~LED4依次点亮后(流水动态效果)保持常亮,配置窗口看门狗,进入主程序while循环,主程序中不断去读WWDG计数器的当前值,并与WWDG窗口值进行比较,一旦发现计数器的值落入窗口范围内,就进行喂狗操作。

(2)按下USER按键,进入死循环,从而造成无法执行喂狗程序,WWDG触发系统复位,可重新看到LED1~LED4依次点亮(流水动态效果)现象。

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 18

我们都知道硬件看门狗的目的:是用来监测系统,防止系统死机,并在死机的情况下使其系统复位重启。

在RTOS操作系统中,如果任务(线程)较多,出现高优先级任务长时间占用CPU资源,低优先级任务长时间得不到执行这种想象,那么我们的系统就是具有“Bug”的系统。

如上描述,假如我们的线程没有死机,只是长时间得不到执行。在这种异常情况下,我们又不希望系统复位,只希望执行特定代码,那我们该如何来避免这种问题呢? 

关于看门狗

硬件看门狗:利用一个定时器计数电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时“喂狗”。

因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内喂狗,就使得看门狗定时器溢出产生复位信号并重启系统。

在STM32中,有两个看门狗:独立看门狗和窗口看门狗。原理和功能都类似,只是应用场景不一样。
软件看门狗:软件看门狗和硬件看门狗原理类似,都是定期(在时间溢出之内),对其喂狗。只是软件喂狗的方式是通过自身设计的计数来实现。

硬件+软件看门狗监测多任务的原理

1.利用一个监测线程(自身),来监测其它多个线程;2.利用硬件看门狗来监测自身。

1.jpg

如图:

假如我系统中有多个应用线程(如上图),我就利用一个监测线程(自身),来监测其它多个应用线程。

同时,为了防止自身线程异常,利用一个硬件看门狗来监测自身。这样就可以做到双重监测的作用。

软件案例

上一节上述的原理可能对于有些人来说,是比较抽象的。那么这一节来看看代码:

监测线程(自身):

2.jpg

简单来说:在监测线程(自身)之中,需要对硬件看门狗进行喂狗。软件看门狗的角色:在这里就是对齐计数,浏览是否溢出,我把它封装成一个浏览函数。具体的喂狗就在其他各个被监测的线程中。

3.jpg那么,再看软件看门狗对其中一个应用线程喂狗的代码:这里只是简单的举例,一个主线程里面的喂狗。相当于:我线程启动之后,就需要定时喂狗。如果这里长时间不喂狗,那么监测线程(自身)就会发现你没有喂狗。

实现方法

看到这里,相信大家都知道其原理了。具体实现的方式方法很多种,可根据自己实际项目需要,添加相应的接口。这里举例几点吧。
定义一个数据结构:

4.jpg


这里举例,是实现最基础的东西,比如计数器,最大超时值等。

注册接口函数:

5.jpg

监测浏览函数接口:

6.jpg

以上只是教大家方法,具体的实现,可自己根据自己习惯,项目需求来定制化开发。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 98

看门狗模块(WDOG)在MCU应用里可以说是非常基础的功能模块。对于一个产品级的应用程序,如果它没有使能主控内部的看门狗模块,一般都不能算是一个合格的软件设计。

有的时候,硬件工程师觉得片内看门狗不可靠,还会在板级设计里再加入外部看门狗电路。

总之看门狗对于产品工作稳定性具有很重要的意义。

最近有一个i.MX RT客户注意到了芯片手册System Boot章节里提及了WDOG应用,想使能这个功能,并且要确认该功能真实生效以及评估对后续应用程序的影响。

借助客户的问题,我们来细聊下这个话题。

一、WDOG模块简介

首先我们来了解一下i.MX RT1xxx系列内部的WDOG模块,在i.MX RT1xxx内部一共有三个WDOG模块(WDOG1/2/3),虽然WDOG本质上就是个特殊功能定时器,但因为芯片设计时为其赋予的超时触发行为不同,所以其应用场合并不一样。

1.1 系统看门狗WDOG1/2

WDOG1和WDOG2属于系统看门狗,前者用于系统级复位(产生WDOG_RESET_B_DEB信号给SRC模块)防止系统发生异常,后者用于系统SNVS域安全警报(不会产生复位效果)。

不过从模块寄存器角度,WDOG1和WDOG2是一样的,因此除了超时触发行为外,它们其余方面特性是一样的:

“系统看门狗WDOG1在i.MX

1、模块内部两个计数时钟源是固定的,来自ipg_clk_32k以及anatop_xtal32k_clk 。

2、模块内部8bit定时器(Time-Out Counter)用于产生WDOG_RESET_B_DEB复位信号,计时精度固定为0.5秒,超时可设范围为0.5秒到128秒。

3、块内部定时器(Power Down Counter)用于产生对外输出的复位信号WDOG_B,其超时时间固定为16秒。

4、模块对外输出的信号最多有三个: WDOG_RST_B_DEB、WDOG_B、WDOG_ANY(仅WDOG1)。

5、模块使能信号WDOGx->WCR[WDE]可多次设置(并不是一次复位期间仅可write one once)。

6、模块配置寄存器与定时器计数值可直接修改。

7、模块Time-Out Counter默认是关闭的,Power Down Counter默认是开启的。

1.2 内核看门狗WDOG3(4)

WDOG3有时候又叫RTWDOG(对于i.MX RT1170,还存在用于默认CM4从核的WDOG4),属于内核看门狗,主要用于复位内核,防止程序陷入死循环。其模块寄存器跟WDOG1/2完全不同,更接近于一般的定时器模块设计:

“系统看门狗WDOG1在i.MX

1. 模块内部计数时钟源有四种选择,Bus clock / LPO clock / INTCLK / ERCLK 。

2. 模块内部16bit定时器(Time-Out Counter)用于产生内核复位信号。

3. 模块使能信号WDOGx->CS[EN]可多次设置(但是其属于write-once属性)。

4. 模块配置寄存器write-once bits与定时器计数值需要特殊unlock时序才可以修改。

5. 模块Time-Out Counter默认是开启的。

二、系统ROM里对WDOG的使用

i.MX RT1xxx系列芯片上电默认都是先执行系统BootROM,在BootROM里会有对看门狗的处理。默认情况下BootROM是不启用看门狗做代码执行守护的,只有当用户烧写了指定的eFuse位,看门狗功能才会生效。BootROM并没有使用默认开启的 WDOG3,而是将其关闭并打开了WDOG1作为看门狗。

2.1 看门狗使能

i.MX RT10xx系列芯片BootROM看门狗在eFuse里配置如下,包含eFuse 0x460[21]使能位与eFuse 0x6D0[15:13]超时时间设置。

“系统看门狗WDOG1在i.MX

i.MX RT1160/1170 芯片BootROM看门狗在eFuse里配置如下,包含eFuse 0x9A0[15]使能位与eFuse 0x9B0[2:0]超时时间设置,以及多了eFuse 0x9B0[5:3]关于WDOG_B外部信号脚选择设置。

“系统看门狗WDOG1在i.MX

2.2 看门狗作用

对于i.MX RT10xx系列,BootROM看门狗主要用于Serial Downloader分支程序下(SDP 模式BT_MODE = 2'b01,或者Device Boot模式BT_MODE = 2'bx0下启动失败进入了Serial Downloader)检测与主机通讯情况,只要在设置的超时时间里没有通信交互行为,看门狗就会复位整个系统(并不是单次通信就可以的,任意超时时间内都得保持交互)。如果在Device Boot模式下能够正常启动程序,则看门狗不会被使能。

对于i.MX RT1160/1170系列,BootROM看门狗不仅在Serial Downloader分支程序中有效,其在Device Boot模式下(BT_MODE = 2'bx0)也同样被使能了,这样做主要有两个用意:

如果因板级电路干扰导致首次启动程序失败,BootROM正常是直接跳转到了SDP模式不会再做启动程序行为。但是使能了看门狗,则在SDP模式下等待超时时间后系统复位会重新尝试启动程序,这样不断尝试直到板级干扰消失。

如果启动程序成功,BootROM会直接跳转到目标应用程序,但无法检验目标程序是否能够正常执行。但是使能了看门狗,如果应用程序不对看门狗做有效处理,系统还是会复位回来,这样相当于做了应用程序是否执行的验证。

三、使能WDOG后对i.MX RT开发的影响

现在回到文章开头提到的客户问题,如何判断BootROM中WDOG已经生效了,这个其实特别简单,在SDP模式下插上USB线,在资源管理器里观察是不是有HID设备每隔一段时间就会重新枚举一次,没错就是WDOG捣的鬼。

那么对于应用程序的开发,有什么注意事项呢?对于i.MX RT10xx其实没有任何影响,而对于i.MX RT1160/1170,则必须在应用程序里增加对WDOG1的处理。

在恩智浦提供的头文件system_MIMXRT1xxx.c文件里SystemInit()函数中其实有关于看门狗相关代码,默认是将全部的看门狗都关一遍(DISABLE_WDOG=1),这部分代码对于i.MX RT10xx程序是可以不做的,但是对于i.MX RT1160/1170就必须要做了。

“系统看门狗WDOG1在i.MX

来源:恩智浦MCU加油站
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 34

早期的MCU没有看门狗,就容易引起有些产品死机了不能重启工作。为了避免这个问题,后期的MCU在内部集成了看门狗的功能。

为了满足更多使用场景,现在很多MCU都集成了两个看门狗:独立看门狗与窗口看门狗。

拿现在大家熟悉的STM32来说,都集成了独立看门狗和窗口看门狗,下面就展开来讲讲这个两个看门狗以及它们的区别。

独立看门狗

独立看门狗,顾名思义,就是独立的一个看门狗,由其专用低速时钟 (LSI) 驱动,因此,即便在主时钟发生故障时仍然保持工作状态。

IWDG 最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。

独立看门狗特性:

  • 自由运行递减计数器

  • 时钟由独立 RC 振荡器提供(可在待机和停止模式下运行)

  • 当递减计数器值达到 0x000 时产生复位(如果看门狗已激活)

“MCU独立看门狗与窗口看门狗的区别"

窗口看门狗

窗口看门狗,之所以称为窗口,是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间:喂狗的时间不能过早也不能过晚。

“窗口型看门狗0"
窗口型看门狗

窗口看门狗的上窗口就是配置寄存器WWDG->CFR里设定的W[6:0];下窗口是固定的0x40;当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。

“窗口型看门狗工作原理"
窗口型看门狗工作原理

上窗口的值可以只有设定,7位二进制数最大只可以设定为127(0x7F),最小又必须大于下窗口的0x40,所以其取值范围为64~127(即:0x40~0x7F);配置寄存器WWDG->CFR中为计数器设定时钟分频系数,确定这个计数器可以定时的时间范围,从而确定窗口的时间范围。

窗口看门狗的时钟来自于PCLK1,在时钟配置中,其频率为外部时钟经倍频器后的二分频时钟,即为36MHz,根据手册可以知道其定时时间计算方法:

“MCU独立看门狗与窗口看门狗的区别"

两者对比

1.使用条件对比

“MCU独立看门狗与窗口看门狗的区别"

2.特点对比

“MCU独立看门狗与窗口看门狗的区别"

两者的区别

独立看门狗与窗口看门狗的区别如下:

  • 独立看门狗没有中断,窗口看门狗有中断。

  • 独立看门狗有硬件软件之分,窗口看门狗只能软件控制。

  • 独立看门狗只有下限,窗口看门狗有下限和上限。

  • 独立看门狗是12位递减的,窗口看门狗是7位递减的。

  • 独立看门狗是用的内部大约40KHz的RC振荡器,窗口看门狗是用的系统时钟APB1ENR

独立看门狗没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位。

要注意看门狗和外接复位IC同时存在的情况,外部电路可能会阻止看门狗复位。

窗口看门狗有中断,这个中断的作用是在计数器达到下限0x40的时候,产生中断,让你喂狗;如果你不喂狗,计数器的值变为0x3f的时候,将会产生系统复位;即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减1也会变成0x3f产生复位。

窗口看门狗还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了;这个值小于计数器初始值的时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器。意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。

最后,拓展一下基于STM32、FreeRTOS实现硬件看门狗+软件看门狗监测多任务的思路。

素材来源 | STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 34

不同的使用场景,对工业无线路由器、工业级无线DTU功能与性能的需求点就完全不一样,在工业级应用中,稳定可靠,是无线组网的第一需求。

试想一下,在工业现场,远程监测应用时无线组网出现中断,前端采集数据无法上传,远程管理中心指令无法下达,对整个系统运行的影响也是致命的。

此种情况下,看门狗技术的“形象”瞬间高大起来……

工业无线路由器、工业级无线DTU上“看门狗”技术为何如此受欢迎?

今天我们就来搞懂它!

一.什么是“看门狗”?

看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做“喂狗”,输出一般连接到另外一个部分的复位端,一般是连接到单片机。“看门狗”的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。“看门狗”命令在程序的中断中拥有最高的优先级,防止程序跑飞,也可以防止程序在线运行时候出现死循环。

二、“看门狗”工作原理

在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。

三、“看门狗”也有软硬

硬件“看门狗”技术是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。

软件“看门狗”技术的原理和这差不多,只不过是用软件的方法实现。

情况1

利用闲置的定时器/计数器就可以设计一个软件看门狗。

具体实现步骤如下:

  • 首先,在初始化程序中设置定时器/计数器的方式以控制寄存器(TMOD) 和定时时间的初值,并且打开中断。

  • 然后,根据定时器的时间,在主程序中按一定的时间间隔插人复位定时器的指令(喂狗), 两条喂狗指令之间的时间间隔可以根据系统时钟与指令周期计算出来,而且该时间周期应该小于定时器的定时时间。

  • 最后,在定时器的中断服务程序中,设置一条无条件转移指令,将程序计数器PC转移到初始化程序的入口。

情况2

在非单片机系统,如PowerPC系统中,也可以采用多线程的方式来设置“软件狗”,其主要的步骤如下所述:

首先,新建一个看门狗线程,该线程维护一个全局变量数组,该数组相当于每个工作线程的计数器。看门狗线程为一一个死循环,每隔一段时间就会循环一次,并将全局变量数组的每一个值都加1后判断是否超过预定义的上限值,若发现某个线程对应的变量数值超过最大值,则看门狗线程会重置该线程。

然后,每个工作线程中,每隔一段时间就会将对应的全局变量置0 (喂狗)。

宇泰科技工业级无线路由器、工业级无线DTU具有双重“看门狗”,包括软件“看门狗”与硬件“看门狗”,当发生异常时,会智能进行软件唤醒或硬件断电自动重启,实时保障无线组网与无线数据传输畅通无阻。

““看门狗”也有软硬?"

软硬件双重“看门狗”,忠诚地为客户看家护院,故障自行恢复,确保设备稳定可靠运行。

本文来源:宇泰科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 67

嵌入式应用中经常会遇到需要保存一些数据,比如配置信息等等,为了在设备关机或掉电情况下数据不丢失,我们通常做法是会将数据保存在存储区,可以在FLASH主存储区、备份寄存器和选项字节等存储用户数据。

MM32F013x系列芯片的嵌入式闪存高达 64K 字节 ,整个片内 FLASH由两部分组成:一部分是主存储块,另一部分是信息存储块。主存储块除了被用于存储用户代码,也可被模拟成EEPROM来存储用户数据;在信息存储块中,包括了保护字节、保密空间、系统存储器 ISP 和选项字节四部分,其中除了系统存储器 ISP区域用户不可使用外,用户可以通过对应的操作流程对其它区域进行读写操作,于用户而言,选项字节用户数据区也可以被用来存储2个字节长度的有效数据。

本文将重点介绍如何在MM32F013x上实现用FLASH 选项字节存储用户数据以及使能硬件独立看门狗模式的功能。

选项字节介绍

MM32F013x 系列MCU 的选项字节主要用于存储用户对芯片的配置信息及用户关键数据,主要有写保护使能、看门狗模式切换等等不同配置内容,FLASH 控制器可以通过对这些值的设置来选择不同的系统功能选项。选项字节区块的前16字节,每两个字节组成一个正反对,其中用户只需要设置低位的字节,高位由系统自动填充为其反码。

选项字节的组成如下表所示(位 15 ∼ 8 中的值为位 7 ∼ 0 中选项字节 0 的反码):


注意:在写保护值中,一个比特位对应四页,即 4096 字节,其它详情请参见UM手册。

USER:字节2,用户字节,配置看门狗模式、停机复位模式、待机复位模式以及BOOT1。

DATA0:字节4,数据字节0,由用户存储数据。

DATA1:字节6,数据字节1,由用户存储数据。

WRP0:字节8,写保护字节0,存储对主存储块的写保护设置。

WRP1:字节10,写保护字节1,存储对主存储块的写保护设置。

01、相关寄存器

除了之前熟悉的FLASH_ACR 、FLASH_KEYR、FLASH_CR 以及FLASH_AR 等FLASH 基础寄存器外,主要还需要关注以下相关的寄存器:



02、擦除流程

选项字节区块擦除操作流程的具体步骤如下:


1. 检查FLASH_CR寄存器的LOCK位,如未被解锁则执行解锁操作。

if((FLASH->CR & FLASH_CR_LOCK) == SET )
{
    FLASH->KEYR = FLASH_KEY1 ;
    FLASH->KEYR = FLASH_KEY2 ;
}

2. 检查FLASH_CR寄存器的OPTWRE位,如未置位则执行解锁OPTWRE操作。

if((FLASH->CR & FLASH_CR_OPTER) == RESET)
{
    FLASH->OPTKEYR = FLASH_KEY1 ;
    FLASH->OPTKEYR = FLASH_KEY2 ;
}

3. 将闪存选项字节块基地址写入FLASH_AR寄存器。

FLASH->AR = OB_BASE ;

4. 设置FLASH_CR寄存器的OPTER位为1,选择选项字节擦除操作。

FLASH->CR |= FLASH_CR_OPTER ;

5. 设置FLASH_CR寄存器的STRT位为1。

FLASH->CR |= FLASH_CR_STRT ;

6. 等待FLASH_SR寄存器的BSY位变为0,再读出选项字节寄存器中所有地址来验证擦除操作,直到流程结束。

do{               
       ret = (((FLASH->SR & FLASH_FLAG_BSY)) ? FLASH_BUSY:            \
              ((FLASH->SR & FLASH_FLAG_PGERR) ? FLASH_ERROR_PG:         \
              ((FLASH->SR & FLASH_FLAG_WRPRTERR) ? 
                FLASH_ERROR_WRP : FLASH_COMPLETE))) ;
       EraseTimeout-- ;
       for (i = 0xFF; i != 0; i--) ;
  }while((ret == FLASH_BUSY) && (EraseTimeout!= 0x00)) ;
  FLASH->CR = 0 ;
  FLASH->SR = FLASH_SR_EOP | FLASH_SR_WRPRTERR | FLASH_SR_PGERR ;        
  return (FLASH_Status)((EraseTimeout== 0x00) ? FLASH_TIMEOUT : ret) ;

由于选项字节只有16字节,因此,擦除时是整个选项字节都将被擦除,此时需要注意,将有效的用户数据及配置信息提前保存到内存中再进行擦除。

03、编程流程

选项字节区块编程操作流程的具体步骤如下:


1. 检查FLASH_CR寄存器的LOCK位,如未被解锁则执行解锁操作。

if((FLASH->CR & FLASH_CR_LOCK) == SET )
    {
        FLASH->KEYR = FLASH_KEY1 ;
        FLASH->KEYR = FLASH_KEY2 ;
    }

2. 检查FLASH_CR寄存器的OPTWRE位,如未置位则执行解锁OPTWRE操作。

if((FLASH->CR & FLASH_CR_OPTER) == RESET)
{
    FLASH->OPTKEYR = FLASH_KEY1 ;
    FLASH->OPTKEYR = FLASH_KEY2 ;
}

3. 设置FLASH_CR寄存器的OPTPG位为1,选择编程操作。

FLASH->CR |= FLASH_CR_OPTPG ;

4. 写入要编程的半字到指定的地址,启动编程操作。

__IO u16 temp ;
temp = (u16)(~data) ;
temp = (temp << 8) & 0xFF00 ;
temp = temp | (u16)data ;
*(__IO u16*)address = temp ;

5. 等待FLASH_SR寄存器的BSY位变为0,可选读目标地址数据,以确保半字编程成功,直到所有编程流程结束。

do{               
       ret = (((FLASH->SR & FLASH_FLAG_BSY)) ? FLASH_BUSY:            \
              ((FLASH->SR & FLASH_FLAG_PGERR) ? FLASH_ERROR_PG:         \
              ((FLASH->SR & FLASH_FLAG_WRPRTERR) ? 
                FLASH_ERROR_WRP : FLASH_COMPLETE))) ;
       ProgramTimeout -- ;
       for (i = 0xFF; i != 0; i--) ;
  }while((ret == FLASH_BUSY) && (ProgramTimeout != 0x00)) ;
   FLASH->CR = 0 ;
   FLASH->SR = FLASH_SR_EOP | FLASH_SR_WRPRTERR | FLASH_SR_PGERR ;        
   return (FLASH_Status)((ProgramTimeout == 0x00) ? FLASH_TIMEOUT : ret) ;

软件实现步骤

下面列出配置代码,实现开启硬件IWDG独立看门狗以及将用户数据存储在DATA0和DATA1。

01、主程序初始化

s32 main(void)
{
    /* Systick delay init */
    DELAY_Init();
    /* Uart1 init */
    CONSOLE_Init(115200) ;
    printf("\r\nMM32F013x OptionByte Demo %s %s\r\n", __DATE__, __TIME__);

    /* OptionByte test entry */
    FLASH_OptionByte_Entry() ;

    /* Set the HWIWDG parameters,no need to turn on LSI or IWDG_Enable */
    Set_IWDG(IWDG_Prescaler_64, 999);
    printf("\r\n IWDG reload value is set to 1.6s !\r\n ");

    while (1)
    {
        /* Feed the HW_IWDG if needed*/
        Feed_IWDG() ;
        DELAY_Ms(1000) ;
        printf("\r\n System is going on. Feed the IWDG...\r\n "); 
    }
}

以上为整个软件工程的入口主函数,平台相关的堆栈设置、时钟设置以及FLASH延迟设置等等都在STARTUP_MM32F013X_KEIL.S和SYSTEM_MM32f013x.C文件中已经完成,默认主频为内部时钟HSI倍频到72M,上电后程序会跳转到主函数。初始化好延时和串口后,进入到测试选项字节的功能函数中,并且接下来的初始化中还配置了IWDG的重装载值以及分频系数,在while(1)循环里选择是否喂狗看不同现象。

02、OptionByte 实验函数

void FLASH_OptionByte_Entry(void)
{
    volatile uint32_t TempOptionByteValue = 0;
    uint8_t WriteUserData[2] ={0x01,0x02} ;

    /* Unlock The FLASH Controller */
    FLASH_Unlock();

    if( FLASH_GetFlagStatus(FLASH_FLAG_OPTERR) == RESET )
    {      
        TempOptionByteValue = FLASH_GetUserOptionByte();
        printf("\r\nTempOptionByteValue=0x%2x\r\n ", TempOptionByteValue);

        if(((uint8_t)(TempOptionByteValue >> 10) != WriteUserData[0]) &&           \
            ((uint8_t)(TempOptionByteValue >> 18) != WriteUserData[1]) )
        {/* User Data0 != 0x01 , User Data1 != 0x02*/           
            /* Erase Option Bytes */
            FLASH_Status status = FLASH_EraseOptionBytes();

            /* Write User Data0 */
            status = FLASH_ProgramOptionByteData(0x1FFFF804, WriteUserData[0]) ;
            /* Write User Data1 */
            status = FLASH_ProgramOptionByteData(0x1FFFF806, WriteUserData[1]) ;
            /* Write User Byte to enable HW mode of IWDG */
            status = FLASH_ProgramOptionByteData(0x1FFFF802,0xFE) ;
            printf("\r\n UserDatas and UserByte are written!\r\n ");       

            printf("\r\n INPORTANT! Need to reset the system ……\r\n ");
            /* Lock The Flash Program Erase Controller */
            FLASH_Lock();
            /* System Reset */
            NVIC_SystemReset();
        }
        else
        {                    
            if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
            {
                printf("\r\n RCC_FLAG_IWDGRST is set!\r\n ");
                /* Clear reset flags */
                RCC_ClearFlag();
                printf("HW IWDG was set successfully,need to RL_IWDG!\r\n ") ;
            }
            else
            {
                printf("\r\n Reboot ok.\r\n "); 
                printf("\r\n UserDatas were updated successfully!\r\n ");  
            }
        }
    }
    /* Lock The Flash Controller */
    FLASH_Lock();
}

由于每次系统复位后,选项字节才会被重新加载,并保存在选项字节寄存器 (FLASH_OBR)中,每个选择位都在信息块中有它的反码位,在加载选择位时,反码位用于验证选择位是否正确,如果有任何的差别,将产生一个选项字节错误标志 (OPTERR),所以建议操作选项字节空间时先判断FLASH标志位。

按照流程对FLASH的选项字节空间进行数据读取和写入操作,且设置独立看门狗为硬件模式,做完所有的操作后,一定要将系统进行软复位或者上电复位,这样才能使之前的写入操作正式生效。

最后,通过RCC的复位标志判断此次复位是否由看门狗引发,搭配串口信息输出来进行所有功能验证。

测试验证

本次实验同样是基于eMiniboard MB-025硬件资源完成的,前述完整代码中,开启了在主循环的喂狗操作,每隔1s钟进行喂狗动作且通过串口打印运行状态,串口助手完整显示如下:


可以发现已经正常将用户数据0x01和0x02分别写入到了Data0和Data1中,且独立看门狗的硬件模式也有设置,为了验证看门狗已经生效,屏蔽喂狗语句后重新编译工程,擦除全片后重新烧录程序,此刻,串口助手完整显示如下:


通过以上打印信息,可以确认硬件看门狗的硬件模式已经生效,无需通过用户代码开启LSI时钟和开启独立看门狗,只要芯片正常上电即可完成对用户程序异常情况发生的防护,从而提高系统整体安全性能。

转自:灵动微电子

围观 74

页面

订阅 RSS - 看门狗