本章教程通过串口调试助手打印显示程序运行状态,具体现象如下:

  • 若计数器值在上窗口值和下窗口值0X40之间的时候,进行喂狗操作,计数器重新计数,程序正常运行,串口打印显示:The program runs normally;
  • 若程序在快要减到0X3F时候通过中断函数进行喂狗操作,则串口打印显示:Execute interrupt function The program runs normally;
  • 若程序没有在窗口时间内进行喂狗操作,则程序会不停进行复位。

1、WWDG简介及相关函数介绍
窗口看门狗(WWDG)通常用来监测系统运行的软件故障,例如外部干扰、不可预见的逻辑错误等情况。其需要在一个特定的窗口时间(有上下限)内进行计数器刷新(喂狗),否则早于或者晚于这个窗口时间看门狗电路都会产生系统复位。

CH32V103的窗口看门狗具有可编程的7位自减型计数器;具有双条件复位,当计数器值小于0X40,或者计数器值在窗口时间外被重装载;具有唤醒提前通知功能(EWI),用于及时喂狗动作防止系统复位。

CH32V103的窗口看门狗运行基于一个可编程的7 位的自减型计数器,其挂载在 APB1 总线下,计数时基 WWDG_CLK 来源(PCLK1/4096)时钟的分频,分频系数在配置寄存器 WWDG_CFGR 中的 WDGTB[1:0]域设置。递减计数器处于自由运行状态,无论看门狗功能是否开启,计数器一直循环递减计数。 关于CH32V103窗口看门狗具体信息,可参考CH32V103应用手册。

本章教程通过调用窗口看门狗库函数中相关函数进行程序编写,关于库函数相关介绍如下:

void WWDG_DeInit(void);

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

void WWDG_SetWindowValue(uint8_t WindowValue);

void WWDG_EnableIT(void);

void WWDG_SetCounter(uint8_t Counter);

void WWDG_Enable(uint8_t Counter);

FlagStatus WWDG_GetFlagStatus(void);

void WWDG_ClearFlag(void);

1.1、void WWDG_DeInit(void)
功  能:将WWDG外围寄存器初始化为其默认重置值
输  入:无

1.2、void WWDG_SetPrescaler(uint32_t WWDG_Prescaler)
功  能:设置WWDG预分频器
输  入:WWDG_预分频器:指定WWDG预分频器。

1.3、void WWDG_SetWindowValue(uint8_t WindowValue)
功  能:设置WWDG窗口值。
输  入:WindowValue:指定要与downcounter比较的窗口值,该值必须小于0x80

1.4、void WWDG_EnableIT(void)
功  能:启用WWDG早期唤醒中断(EWI)
输  入:无

1.5、void WWDG_SetCounter(uint8_t Counter)
功  能:设置WWDG计数器值
输  入:Counter:指定看门狗计数器值,该值必须是介于0x40和0x7F之间的数字。

1.6、void WWDG_Enable(uint8_t Counter)
功  能:启用WWDG并加载计数器值
输  入:Counter:指定看门狗计数器值,该值必须是介于0x40和0x7F之间的数字。

1.7、FlagStatus WWDG_GetFlagStatus(void)
功  能:检查是否设置了早期唤醒中断标志
输  入:无

1.8、void WWDG_ClearFlag(void)
功  能:清除提前唤醒中断标志
输  入:无

2、硬件设计
窗口看门狗属于CH32V103内部资源,无需进行任何硬件设计,只需通过串口调试助手打印显示观察其运行状态即可。

3、软件设计
本教程中窗口看门狗主要通过在窗口时间内喂狗或在中断服务函数内喂狗保证系统程序正常运行,其具体程序如下:
wwdg.h文件

#ifndef __WWDG_H

#define __WWDG_H

#include "ch32v10x_conf.h"

#define  WWDG_CNT  0x7f

void WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv);

void WWDG_NVIC_Config(void);

void WWDG_IRQHandler(void);

void WWDG_Feed(void);

#endif

wwdg.h文件主要是相关定义及函数声明。
wwdg.c文件

#include "wwdg.h"

void WWDG_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

//初始化窗口看门狗,tr:递减计数器值;wr:上窗口值;prv:分频系数

void WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)

{

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

    WWDG_SetCounter( tr );      //设置WWDG递减计数器值

    WWDG_SetWindowValue( wr );  //设置WWDG上窗口值

    WWDG_SetPrescaler( prv );   //设置WWDG预分频器值

    WWDG_Enable(WWDG_CNT);      //设置计数器初始值并使能看门狗

    WWDG_ClearFlag();           //清除提前唤醒中断标志

    WWDG_NVIC_Config();         //初始化窗口看门狗NVIC

    WWDG_EnableIT();            //开启窗口看门狗中断

}

//初始化看门狗NVIC,配置优先级

void WWDG_NVIC_Config(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;           //WWDG中断

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应优先级 0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能通道1中断

  NVIC_Init(&NVIC_InitStructure);                           //NVIC初始化

}

//WWDG中断服务函数

void WWDG_IRQHandler(void)

{

    WWDG_Feed();

    WWDG_ClearFlag();           //清除提前唤醒中断标志位

    printf("Execute interrupt function\r\n");

}

//喂狗

void WWDG_Feed(void)

{

    WWDG_SetCounter( WWDG_CNT );//喂狗,刷新递减计数器的值,设置成最大WWDG_CNT=0X7F

}

wwdg.c文件主要是WWDG相关配置,其具体配置流程如下:
1、进行WWDG配置,包括开启WWDG时钟、设置计数器值、窗口值和预分频器值等;

//初始化窗口看门狗,tr:递减计数器值;wr:上窗口值;prv:分频系数

void WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)

{

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

    WWDG_SetCounter( tr );      //设置WWDG递减计数器值

    WWDG_SetWindowValue( wr );  //设置WWDG上窗口值

    WWDG_SetPrescaler( prv );   //设置WWDG预分频器值

    WWDG_Enable(WWDG_CNT);      //设置计数器初始值并使能看门狗

    WWDG_ClearFlag();           //清除提前唤醒中断标志

    WWDG_NVIC_Config();         //初始化窗口看门狗NVIC

    WWDG_EnableIT();            //开启窗口看门狗中断

}
//初始化看门狗NVIC,配置优先级

void WWDG_NVIC_Config(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;           //WWDG中断

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //响应优先级 0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能通道1中断

  NVIC_Init(&NVIC_InitStructure);                           //NVIC初始化

}
//喂狗

void WWDG_Feed(void)

{

    WWDG_SetCounter( WWDG_CNT );//喂狗,刷新递减计数器的值,设置成最大WWDG_CNT=0X7F

}

//WWDG中断服务函数

void WWDG_IRQHandler(void)

{

    WWDG_Feed();

    WWDG_ClearFlag();           //清除提前唤醒中断标志位

    printf("Execute interrupt function\r\n");

}

wwdg.c文件主要进行窗口看门狗相关函数配置
main.c文件

int main(void)

{

    u8 wwdg_tr,wwdg_wr;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    Delay_Init();

    USART_Printf_Init(115200);

    printf("SystemClk:%d\r\n",SystemCoreClock);

    printf("WWDG Test\r\n");

    WWDG_Config(0x7f,0x5f,WWDG_Prescaler_8);      /* 36M/8/4096 */

    wwdg_wr=WWDG->CFGR & 0x7F;

    while(1)

     {

        Delay_Ms(70);

        printf("The program runs normally\r\n");

        wwdg_tr=WWDG->CTLR & 0x7F;

        if(wwdg_tr<wwdg_wr)

         {

           WWDG_Feed();

         }

     }

}

【单片机】CH32V103C8T6 ——窗口看门狗的更多相关文章

  1. STM32之独立看门狗与窗口看门狗总结

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  2. STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结

    一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...

  3. STM32(10)——窗口看门狗

    简介: 窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障.除非递减计数器的值在 T6 位 (WWDG->CR 的第六位)变成 0 ...

  4. 第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列

    第35章     WWDG—窗口看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  5. STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示

    一.介绍: STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示, IWDG和WWDG两者特点如下图所示: 独立看门狗的手册资料: 窗口看门狗的手册资料:             ...

  6. 嵌入式02 STM32 实验09 独立/窗口看门狗

    一.独立看门狗和窗口看门狗 看门狗:单片机系统在外界的干扰下会出现程序跑飞的现象导致死循环,或者崩溃,看门狗电路就是为了避免这种情况的发生,看门狗的作用就是在一定的事件内(通过计数器实现)若没有收到喂 ...

  7. STM8s窗口看门狗

    看看窗口看门狗的框图 从图里看出产生复位信号有2个方式: 1 WDGCR寄存器的T6 由1变0,也就是从此寄存器的值从0x40变成0x3F会产生复位信号: 2 当寄存器WDGCR的值大于WDGWR的时 ...

  8. stm8的独立看门狗与窗口看门狗

    STM8拥有两个硬件看门狗,分别叫做独立看门狗和窗口看门狗 独立看门狗的框图如下 我们可以看到,独立看门狗的时钟来自于LSI内部低速振荡器,经过二分频到达看门狗外设单元,在经过一个七位的预分频到达计数 ...

  9. stm32 窗口看门狗学习(二)

    窗口看门狗有一个提前唤醒中断,如果开启这个中断,那么当计数器的值达到0x40的时候就会产生这个中断. 上次的代码加一点就可以做这个实验了. void WWDG_Init(u8 tr,u8 wr,u32 ...

随机推荐

  1. 微信小程序实时通讯(websocket)问题

    这几天值班忙的不要不要,人工智能这块看的都是零零散散,今天就来写写小程序的实时通讯吧.小程序端://这个是连接 lianjie:function(){ var socketOpen = false / ...

  2. ES6-11学习笔记--const

    新声明方式:const 1.不属于顶层对象 window 2.不允许重复声明 3.不存在变量提升 4.暂时性死区 5.块级作用域   以上特性跟let声明一样,特性可看 let 的学习笔记:链接跳转 ...

  3. 将java的对象或集合转成json形式字符串

    将java的对象或集合转成json形式字符串: json的转换插件是通过java的一些工具,直接将java对象或集合转换成json字符串. 常用的json转换工具有如下几种: 1)jsonlib 需要 ...

  4. Redis快速入门到精通

    Redis Redis是一个开源的使用ANSI C语言编写.支持网络. 可基于内存亦可持久化的日志型.Key-Value型 NoSQL数据库,并提供多种语言的API.从2010年3 月15日起,Red ...

  5. 用asmlib方式创建oracle集群ASM磁盘(oracleasm)

    创建asm磁盘的几种方式 创建asm方式很多主要有以下几种 1.Faking方式 2.裸设备方式 3.udev方式(它下面有两种方式) 3.1 uuid方式 3.2 raw方式(裸设备方式) 4.as ...

  6. Spring Framework 学习笔记——核心技术之Spring IOC

    Spring Framework 官网文档学习笔记--核心技术之Spring IOC 官方文档 spring-framework-5.3.9 1. Spring Framework 核心技术 1.1 ...

  7. java实现二叉树的Node节点定义手撕8种遍历(一遍过)

    java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...

  8. 从电路到UI系列之一——常见显示控制接口的认识

    引入 我之前有两方面的使用屏幕的案例.在做的模块上需要用到屏幕来显示的时候,全是SPI屏幕,并口屏幕和IIC屏幕.在研究了驱动(或者是绘图函数更加合适)之后,我发现其实他们就是直接写显存,这个显存在面 ...

  9. ZABBIX Proxy容器启动的配置过程

    ZABBIX Proxy容器启动的配置过程 环境介绍 版本 zabbix6 zabbix server 与 zabbix proxy 非同一台主机,zabbix proxy为主动方式提交给server ...

  10. Pytest系列(一)初次了解

    在之前,我分享过unittest系列,后来有很多人问我,能不能出pytest的教程,正好最近在整理pytest相关的资料,那么,就趁着这个机会,去和大家分享一下pytest系列. pytest是一个非 ...