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

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


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

📓窗口看门狗(WWDG)

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

✅WWDG主要功能

● 可编程的自由运行递减计数器
● 有条件的复位
─ 如果开启了看门狗,当递减计数器的数值小于0x40时产生复位
─ 如果开启了看门狗,当在指定的时间窗口之外重加载递减计数器的数值(见图27) 时产生
复位
● 硬件或软件启动看门狗(由选择字节指定)
● 可在HALT指令时产生复位(由选择字节配置)
在这里插入图片描述

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

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

如何设置看门狗的超时

  • ⚡警告:每次写入WDGCR寄存器时,首先要置T6位为’1’,以避免立刻产生看门狗复位。
    在这里插入图片描述

  • 🎞窗口看门狗操作过程:
    在这里插入图片描述

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

/*******************************************************************************
**函数名称: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单片机-->LED1
		   		PC7-->LED1
                                PC6-->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分频作为系统时钟 即2M
    USART1_Init( 9600 ); //初始化USART1 , 并设置波特率为9600
    printf("Hello World \r\n");
    LED_Init();
    TIM2_Init( TIM2_PRESCALER_1, 1999 );//1KHz
    LED1_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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IAR是一种常见的继电器开发工具,用于开发STM8S单片机。STM8S是意法半导体公司推出的一款低功耗、高性能的8位单片机系列。 在使用IAR开发STM8S,首先需要安装IAR Embedded Workbench软件。这个软件提供了一个集成的开发环境,包括编译器、调试器和IDE等工具,使得开发者能够方便地进行代码编写、编译、下载和调试等步骤。 在编写代码,可以使用C语言或汇编语言来进行编程。IAR提供了丰富的库函数和例程,方便开发者使用各种功能和外设。开发人员可以根据自己的需求,调用相应的库函数来控制STM8S的引脚、定器、串口通信、ADC等外设。 编译完成后,可以使用IAR提供的调试器进行下载和调试。开发者可以通过调试器实监视程序运行的状态,查看变量的值、寄存器的状态,以及程序执行的流程等。同,也可以进行单步调试、断点调试等功能,帮助开发者更好地进行程序调试和错误定位。 使用IAR开发STM8S具有良好的兼容性和可移植性。开发者可以使用IAR软件在不同的平台上开发STM8S,例如Windows和Linux等操作系统。同IAR提供了针对不同型号的STM8S芯片的编译器和库文件,使得开发者能够方便地移植和调试代码。 总之,使用IAR开发STM8S是一种高效、方便和可靠的方式。通过该开发工具,开发者可以快速开发出满足各种需求的嵌入式应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值