STM8S_008_WDG独立看门狗和窗口看门狗

发布者:平和宽容最新更新时间:2017-09-16 来源: eefocus关键字:STM8S  WDG  独立看门狗  窗口看门狗 手机看文章 扫描二维码
随时随地手机看文章

Ⅰ、写在前面


STM8S看门狗WDG分为两类:

IWDG:Independent WatchDog独立看门狗

WWDG:Window WatchDog窗口看门狗

 

独立看门狗模块可以用于解决处理器因为硬件或软件的故障所发生的错误。它由一个内部的128kHz的LSI阻容振荡器作为时钟源驱动,因此即使是主时钟失效时它仍然照常工作。

 

窗口看门狗用于监测由于外部干扰或不可预知的逻辑条件所产生的软件错误,这样的软件错误通常会导致应用程序不按照预期的方式运行。

 

大概意思主要是:IWDG主要防止硬件问题引起的复位,WWDG主要防止软件问题引起的复位.

 

作者:strongerHuang

版权所有,未经允许,禁止用于其它商业用途!!!

 

Ⅱ、看门狗基础知识

1.看门狗结构图

STM8S的独立看门狗IWDG比窗口看门狗WWDG结构看起来要简单一点,其实寄存器都只有那么两三个,软件配置起来也比较简单。不管是独立还是窗口看门狗,自己看结构图基本就能理解到它们。具体请看下面结构图进行对比。

独立看门狗IWDG结构图:


当向下计数器“8-bit down-counter”等于0时,就会产生看门狗复位“WDG reset”。因此,就需要在计数器等于0之前通过重载寄存器“IWDG_RLR”更新计数器的值。

 


窗口看门狗WWDG结构图:


窗口看门狗有两地方会引起复位:

1.当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时。这种和上面IWDG类似,递减到“0”就会复位。

2.当更新的计数值大于窗口值(T6:0 > W6:0)时。

 

这两种复位的情况如下图:


 

2.IWDG独立看门狗功能

当在键寄存器(IWDG_KR)中写入数值0xCC后,独立看门狗就被启动了,计数器开始从它的复位值0xFF开始递减计数,当计数减到0x00时就会产生一个复位信号(WDG RESET)。

 

如果在IWDG_HW选择字节中使能了硬件看门狗的功能,在芯片上电时看门狗的功能被自动开启,如果软件不能及时操作键寄存器,则在计数器达到0x00时产生复位。

 

看门狗复位的超时值是由你的配置(分频值和计数值)决定的,大概如下(默认LSI = 128 kHz 会随温度变化有所偏差):


3.WWDG独立看门狗功能

● 可编程的自由运行递减计数器

● 有条件的复位

─ 如果开启了看门狗,当递减计数器的数值小于 0x40 时产生复位

─ 如果开启了看门狗,当在指定的时间窗口之外重加载递减计数器的数值时产生复位

● 硬件或软件启动看门狗(由选择字节指定)

● 可在HALT指令时产生复位(由选择字节配置)

 

● 开启看门狗:

如果(通过选择字节)选择了软件看门狗,在系统复位后看门狗处于关闭状态。设置WDGCR寄存器中的WDGA位将开启看门狗,随后在下次复位之前将不能关闭看门狗。

如果(通过选择字节)选择了硬件看门狗,看门狗将始终开启,而WDGA位将不起作用。

 

● 控制递减计数器:

递减计数器是自由运行计数器:即使未开启看门狗,它依然不断地递减计数。当开启看门狗时,必须设置T6位以避免立刻产生复位。

T[5:0]位中包含了看门狗产生复位前允许的时间延迟;因为写入WDGCR寄存器时,预分频器的状态是不可知的,所以这个时间延迟介于一个最小和最大数值之间。

 

窗口寄存器(WDGWR)的数值是指定窗口的高限:为防止复位,必须在递减计数器的数值小于窗口寄存器的数值并大于0x3F时刷新递减计数器。

提示: T6位可以用于产生一个软件复位(即设置WDGA位同时清除T6位

 

● 在停止时产生看门狗复位

如果开启了看门狗,并且选择了停止时产生看门狗复位的选项,则执行HALT指令将产生复位。

 

Ⅲ、 软件工程源代码

1、关于工程

本文提供两个版本的工程代码:

STM8S-A08_IWDG独立看门狗

STM8S-A08_WWDG窗口看门狗

 

本文提供的工程代码是基于前面软件工程“STM8S-A04_UART基本收发数据”增加WDG看门狗修改而来。初学的朋友可以参看我前面对应的基础文章,那些文章讲的比较详细。

 

2.IWDG独立看门狗代码分析

A.IWDG_Initializes初始化

void IWDG_Initializes(void)

{

  IWDG_Enable();

  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

  IWDG_SetPrescaler(IWDG_Prescaler_256);

  IWDG_SetReload(250);

  IWDG_ReloadCounter();

}

预分频值为IWDG_Prescaler_256,参数为枚举类型:

typedef enum

{

  IWDG_Prescaler_4   = (uint8_t)0x00,

  IWDG_Prescaler_8   = (uint8_t)0x01,

  IWDG_Prescaler_16  = (uint8_t)0x02,

  IWDG_Prescaler_32  = (uint8_t)0x03,

  IWDG_Prescaler_64  = (uint8_t)0x04,

  IWDG_Prescaler_128 = (uint8_t)0x05,

  IWDG_Prescaler_256 = (uint8_t)0x06

} IWDG_Prescaler_TypeDef;

 

重装计数值为8位寄存器,最大255,我们设置为250.

 

我在初始化看门狗时,将复位超时值设置为1000ms,具体计算为如下:

128K/2 = 64K (输入时钟)

64K / 256 = 250 (分频后时钟)

250 / 250 = 1 (重载值为250)


B.功能测试代码

void main(void)

{

  System_Initializes();

  UART1_Printf((uint8_t*)"Start...");

 

  while(1)

  {

    LED_REVERSE;

    TIMDelay_Nms(990);

 

    IWDG_ReloadCounter();

  }

}

 

第一:如果复位,会打印“Start...";

第二:我们配置复位超时值为1000ms,理论小于1000ms内喂狗都不会复位,由于LSI有偏差,我们设定在990ms喂狗一次。

第三:修改延时值为1010,则会发现系统复位(打印“Start...")。

 

3.WWDG窗口看门狗代码分析

A.WWDG_Initializes初始化

#define WWDG_WINDOW_VALUE  0x7F  //窗口值

#define WWDG_COUNTER_INIT  0x7F  //计数值

void WWDG_Initializes(void)

{

  WWDG_Init(WWDG_COUNTER_INIT, WWDG_WINDOW_VALUE);

}

 

为了方便测试,我们这里将窗口值和计数值定义为宏,范围:0x40 - 0x7F.

 

B.功能测试代码

void main(void)

{

  System_Initializes();

  UART1_Printf((uint8_t*)"Start...");

 

  WWDG_Initializes();

 

  while(1)

  {

    LED_REVERSE;

    TIMDelay_Nms(49);

 

    WWDG_SetCounter(WWDG_COUNTER_INIT);

  }

}


第一:同理,如果复位,会打印“Start...";

第二:我们配置复位超时值为49.152ms,如果这个延时大于49(设定为50及以上),就会复位(打印“Start...")。

第三:如果我们修改延时值(假如为TIMDelay_Nms(10);),修改窗口值为#define WWDG_WINDOW_VALUE    0x4F。则不在喂狗窗口范围内,会发现系统复位(打印“Start...")。

 

提醒大家:多测试验证才能更容易理解和记住功能的要点。

 

Ⅳ、下载

STM8S资料:

http://pan.baidu.com/s/1o7Tb9Yq

 

软件源代码工程两版本(STM8S-A08_xWDGxx看门狗):

http://pan.baidu.com/s/1c2EcRo0


关键字:STM8S  WDG  独立看门狗  窗口看门狗 引用地址:STM8S_008_WDG独立看门狗和窗口看门狗

上一篇:STM8S_009_EXTI外部中断
下一篇:STM8S_007_片内FLASH和EEPROM编程

推荐阅读最新更新时间:2024-03-16 15:37

stm8s swim 脚的复用
由于 临时改跳线的原因,需要用到swim脚来做为按钮输入。 因为,swim是编程脚,还担心会有影响。 于是,看了手册,发现swim是附加功能。主要功能 还是PD1 作为GPIO脚用的。 于是 就直接 当 GPIO脚用。然后 烧写程序一切正常。 重复烧程序也都正常。 因此,说明 swim 做为GPIO脚用是 完全 没有问题的。也不影响 烧写程序。 用的芯片型号是:STM8S003F3P6
[单片机]
STM32独立看门狗IWDG与窗口看门狗WWDG研究
1.看门狗介绍 看门狗这东西虽然简单,但我相信绝大多程序员没有足够重视它。使用看门狗保证系统正常地运行是非常有必要的。我们在设计产品时,代码以及硬件设计缺陷或是外界电磁干扰都有可能使系统死机,如果不能正常对其进行复位,系统的可靠性将大打折扣。看门狗分为软件看门狗和硬件看门狗两类,其原理都是使用一个独立定时器来计时,超出时间就会产生复位信号,主要区别看是否具有独立的硬件结构,如果有,就是硬件看门狗,如果是一个普通定时器实现的那么就是软件看门狗。STM32F407片内有两个看门狗:独立看门狗IWDG以及窗口看门狗WWDG,下面来讨论各自的特点和用法。 2.IWDG的特点以及使用 IWDG是一个独立看门狗,具有独立于系统的时钟,与片
[单片机]
STM8S 长按键识别
最近学习开发STM8S003 MCU,,刚入手这颗MCU,对很多功能不太了解,只能一边开发学习,记录一下学习过程。 目前,需要实现KEY1按键长按3s进行关机,Linux下直接获取按键的开始时间戳和结束时间戳,可以直接确定按键的触发时间,目前MCU采用的是按键中断的方式,在中断触发后直接进入进入中断函数进行处理,根据定时器的特性,现在是采用方法如下: 将Tim1进行16分频,即频率为1Mhz,然后设置ARR(预装载计数器)为60000,即每次产生溢出时间为60ms, RCR(重复计数寄存器)为50,即 50 * 60 = 3000ms = 3s 后产生一个更新事件,而在按键中断函数中,在按键释放后,判断是否由此更新事件表示,
[单片机]
stm32f10x独立看门狗
一、IWDG介绍 1.1、独立看门狗简介 STM21F1芯片内部含有两个看门狗外设,独立看门狗(IWDG)与窗口看门狗(WWDG)。 两个看门狗都可以用于检测并解决由软件错误导致的故障。 独立看门狗可以简单的理解为一个12位的递减计数器,当计数器从某个值递减到0时(如果看门狗已激活),那么系统会产生一次复位。 如果在计数器递减到0之前刷新了计数器值,那么系统就不会产生复位。 这个刷新计数器值得过程称为“喂狗”。 独立看门狗功能由VDD电压域供电,在停止模式和待机模式下仍能工作。 1.2、IWDG结构框图 LSI:内部低速时钟,频率约在30~60KHz之间 仅适用于时间精度较低的场合,即便在主时钟发生 故障时仍然保持工作
[单片机]
stm32f10x<font color='red'>独立</font><font color='red'>看门狗</font>
stm32 窗口看门狗[操作寄存器+库函数]
stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。 独立看门狗是限制喂狗时间在0-x内,x由你的相关寄存器决定。喂狗的时间不能过晚。 窗口看门狗,所以称之为窗口就是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间。喂狗的时间不能过早也不能过晚。 窗口看门狗的上窗口就是配置寄存器WWDG- CFR里设定的W ,下窗口是固定的0x40;当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。 上窗口的值可以只有设定,7位二进制数最大只可以设定为127,最小又必须大于下窗口的0x40,所以其取值范围为40~127; 窗口看门狗的
[单片机]
IAR中如何修改STM8S库(二)
如果需要在IAR中使用电容触摸按键库,需要将Stm8s_it_c中的TIM4中断屏蔽,因为触摸按键库中已经使用了这个中断 具体修改如下: #ifdef _IAR_SYSTEMS_ //此处修改,因为采用了触摸库 /* #pragma vector=0x19 __interrupt void TIM4_UPD_OVF_IRQHandler(void) */ #endif 即将中断屏蔽
[单片机]
stm8s 定时器2测量脉冲宽度(单位 us)
void Init_Timer2(void) { GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);//输入 无中断 TIM2_TimeBaseInit(TIM2_PRESCALER_16,65536-1); //16分频, 65ms 溢出 TIM2_Cmd(ENABLE); } uint16_t TIM2_GetCapture(void) { /* Get the Capture Register value */ uint16_t tmpccr = 0; uint8_t tmpccrl=0, tmpccrh=0; tmpccrh = TIM2- C
[单片机]
STM8S 独立看门狗配置及使用
//独立看门口的时钟来源 内部低速时钟 128khz 除以2 即64khz //选择 IWDG_Prescaler_128 //64/128 =0.5 khz 2ms周期 #define IWDG_500MS_REST (uint8)250 #define IWDG_400MS_REST (uint8)200 #define IWDG_300MS_REST (uint8)150 #define IWDG_250MS_REST (uint8)125 #define IWDG_200MS_REST (uint8)100 #define IWDG_100MS_REST (uint8)50 #define IWDG_50MS_REST
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved