> 文章列表 > 【IAR工程】STM8S208RB基于ST标准库窗口看门狗(WWDG)

【IAR工程】STM8S208RB基于ST标准库窗口看门狗(WWDG)

【IAR工程】STM8S208RB基于ST标准库窗口看门狗(WWDG)

【IAR工程】STM8S208RB基于ST标准库窗口看门狗(WWDG)


📍相关篇《【IAR工程】STM8S208RB基于ST标准库独立看门狗(IWDG)》

  • 🌿《【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例》
  • 🌿《【IAR工程】STM8S208RB基于ST标准库下EXTI外部中断》
  • 🌿《【IAR工程】STM8S208RB基于ST标准库蜂鸣器(BEEP)驱动》
  • 🌿《【IAR工程】STM8S208RB基于ST标准库下自动唤醒(AWU)》
  • 🔖基于ST STM8S/A标准外设库:STSW-STM8069,版本号:2.3.1
  • 📌STSW-STM8069官方资源下载地址:https://www.st.com/zh/embedded-software/stsw-stm8069.html
  • 🔧IAR编译器版本:IAR Assembler for STMicroelectronics STM8 3.11.1
  • 📌STM8S207/208RBT6最小系统板:https://oshwhub.com/perseverance51/stm8s207rbt6-kai-fa-ban

📓窗口看门狗(WWDG)

窗口看门狗用于监测由于外部干扰或不可预知的逻辑条件所产生的软件错误,这样的软件错误通常会导致应用程序不按照预期的方式运行。除非程序在递减计数器的T6位变为0之前刷新递减计数器,看门狗电路将在一个预置的时间间隔后产生系统复位;如果在7位的递减计数器数值达到窗口寄存器数值之前刷新递减计数器,同样会产生系统复位。这就意味着只能在一个有限的时间窗口内刷新递减计数器。

✅WWDG主要功能

● 可编程的自由运行递减计数器
● 有条件的复位
─ 如果开启了看门狗,当递减计数器的数值小于0x40时产生复位
─ 如果开启了看门狗,当在指定的时间窗口之外重加载递减计数器的数值(见图27) 时产生
复位
● 硬件或软件启动看门狗(由选择字节指定)
● 可在HALT指令时产生复位(由选择字节配置)
【IAR工程】STM8S208RB基于ST标准库窗口看门狗(WWDG)

在正常的操作期间,应用程序必须定期地写入WDGCR寄存器,以避免产生复位;这个写的动
作必须在计数器的数值小于窗口寄存器的数值时进行。写入WDGCR寄存器的数值必须是介于
0xFF和0xC0之间.

● 开启看门狗:
如果(通过选择字节)选择了软件看门狗,在系统复位后看门狗处于关闭状态。设置WDGCR寄存
器中的WDGA位将开启看门狗,随后在下次复位之前将不能关闭看门狗。
如果(通过选择字节)选择了硬件看门狗,看门狗将始终开启,而WDGA位将不起作用。
● 控制递减计数器:
递减计数器是自由运行计数器:即使未开启看门狗,它依然不断地递减计数。当开启看门狗
时,必须设置T6位以避免立刻产生复位。
T[5:0]位中包含了看门狗产生复位前允许的时间延迟;因为写入WDGCR寄存器时,预
分频器的状态是不可知的(见图27),所以这个时间延迟介于一个最小和最大数值之间。
窗口寄存器(WDGWR)的数值是指定窗口的高限:为防止复位,必须在递减计数器的数值小于窗
口寄存器的数值并大于0x3F时刷新递减计数器。
==注意:T6位可以用于产生一个软件复位(即设置WDGA位同时清除T6位) ==
● 在停止时产生看门狗复位
如果开启了看门狗,并且选择了停止时产生看门狗复位的选项,则执行HALT指令将产生复位。

如何设置看门狗的超时

  • ⚡警告:每次写入WDGCR寄存器时,首先要置T6位为’1’,以避免立刻产生看门狗复位。
    【IAR工程】STM8S208RB基于ST标准库窗口看门狗(WWDG)

  • 🎞窗口看门狗操作过程:
    【IAR工程】STM8S208RB基于ST标准库窗口看门狗(WWDG)

🔨初始化窗口看门狗配置函数

/*******************************************************************************
**函数名称:void MyWWDG_Init()
**功能描述:初始化窗口看门狗
**入口参数:无
**输出:无
COUNTER_INIT : WWDG counter value:0x00 - 0xff
WindowValue : specifies the WWDG Window Register, range is 0x00 to 0x7F.*******************************************************************************/
void MyWWDG_Init( void )
{/* WWDG configuration: WWDG is clocked by SYSCLK = 2MHz *//* WWDG timeout is equal to 251,9 ms *//* Watchdog Window = (COUNTER_INIT - 63) * 1 step= 41 * (12288 / 2Mhz)= 251,9 ms*//* Non Allowed Window = (COUNTER_INIT - WINDOW_VALUE) * 1 step= (104 - 97) * 1 step=  7 * 1 step =  7 * (12288 / 2Mhz) =  43.008 ms*/WWDG_Init(COUNTER_INIT, WINDOW_VALUE);//104,97
}

🔧向窗口看门狗喂狗函数

/*******************************************************************************
**函数名称:void Feed_WWDog(unsigned char count)
**功能描述:向窗口看门狗喂狗,防止系统复位
**入口参数:无
**输出:无
*******************************************************************************/
void Feed_WWDog(  )//unsigned char count
{
//    WWDG_SetCounter( count );/* Check if WWDG counter refresh is allowed in Allowed window */if (AllowedRefresh != DISABLE){/* get WWDG counter value *//* wait until WWDG counter becomes lower than window value */while ((WWDG_GetCounter() & 0x7F) > WINDOW_VALUE);/* Refresh WWDG counter during allowed window so no MCU reset will occur */WWDG_SetCounter(COUNTER_INIT);}/* Check if WWDG counter refresh is allowed in non Allowed window */if (NonAlowedRefresh != DISABLE){/* wait until WWDG counter becomes higher than window value */while ((WWDG_GetCounter() & 0x7F) < WINDOW_VALUE);/* Refresh WWDG counter during non allowed window so MCU reset will occur */WWDG_SetCounter(COUNTER_INIT);}
}

📝主程序代码

/**************************************************************************************
实验现象:	开始LED1指示灯亮一秒后熄灭,在循环内不断喂狗,如果未在规定时间喂狗将产生复位,复位后程序从头开始执行,即LED1指示灯亮一秒后熄灭。程序没有复位,LED2正常闪烁,串口1无输出.接线说明:	1,STM8S单片机-->LED1PC7-->LED1PC6-->LED2注意事项:1、点击“Download active application”按钮,程序下载完成后,即可运行程序。***************************************************************************************/#include "stm8s.h"      /*  添加库函数头文件 */
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "time.h"
#include "wwdg.h"
#include <stdio.h>
/* 主函数 */
int main( void )
{disableInterrupts();    //关闭系统中断CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV8 );    //采用内部高速晶振8分频作为系统时钟 即2MUSART1_Init( 9600 ); //初始化USART1 , 并设置波特率为9600printf("Hello World \\r\\n");LED_Init();TIM2_Init( TIM2_PRESCALER_1, 1999 );//1KHzLED1_ON();TIM2_DelayMs( 1000 );LED1_OFF();/* Clear WWDGF Flag */RST_ClearFlag(RST_FLAG_WWDGF);MyWWDG_Init();//43.008 ms后则会产生复位enableInterrupts();     //使能系统中断while( 1 ){TIM2_DelayMs(42); //设置时间超过43ms系统重启,给窗口看门狗喂狗一次,防止系统复位  Feed_WWDog( );//喂狗防止系统复位LED2_TOGGLE;}
}
//是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数
void assert_failed( u8* file, u32 line )
{while ( 1 ){}
}

📚程序源码

  • 🔖IAR对中文路径不友好,不要将工程解压在带有中文字符路径的文件夹内直接打开工程编译,这样会导致IAR内部检索文件路径将消耗大量CPU资源。
链接: https://pan.baidu.com/s/1gO6UuTMhPohrvJQqnpOlRQ
提取码: nysm