【单片机】CH32V103C8T6 ——窗口看门狗
本章教程通过串口调试助手打印显示程序运行状态,具体现象如下:
- 若计数器值在上窗口值和下窗口值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 ——窗口看门狗的更多相关文章
- STM32之独立看门狗与窗口看门狗总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
- STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
- STM32(10)——窗口看门狗
简介: 窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障.除非递减计数器的值在 T6 位 (WWDG->CR 的第六位)变成 0 ...
- 第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列
第35章 WWDG—窗口看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- STM32窗口看门狗和独立看门狗的区别,看门狗介绍及代码演示
一.介绍: STM32看门狗分为独立看门狗和窗口看门狗两种,其两者使用调条件如下所示, IWDG和WWDG两者特点如下图所示: 独立看门狗的手册资料: 窗口看门狗的手册资料: ...
- 嵌入式02 STM32 实验09 独立/窗口看门狗
一.独立看门狗和窗口看门狗 看门狗:单片机系统在外界的干扰下会出现程序跑飞的现象导致死循环,或者崩溃,看门狗电路就是为了避免这种情况的发生,看门狗的作用就是在一定的事件内(通过计数器实现)若没有收到喂 ...
- STM8s窗口看门狗
看看窗口看门狗的框图 从图里看出产生复位信号有2个方式: 1 WDGCR寄存器的T6 由1变0,也就是从此寄存器的值从0x40变成0x3F会产生复位信号: 2 当寄存器WDGCR的值大于WDGWR的时 ...
- stm8的独立看门狗与窗口看门狗
STM8拥有两个硬件看门狗,分别叫做独立看门狗和窗口看门狗 独立看门狗的框图如下 我们可以看到,独立看门狗的时钟来自于LSI内部低速振荡器,经过二分频到达看门狗外设单元,在经过一个七位的预分频到达计数 ...
- stm32 窗口看门狗学习(二)
窗口看门狗有一个提前唤醒中断,如果开启这个中断,那么当计数器的值达到0x40的时候就会产生这个中断. 上次的代码加一点就可以做这个实验了. void WWDG_Init(u8 tr,u8 wr,u32 ...
随机推荐
- css写作建议和性能优化小结
1.前言 还有几天就到国庆中秋了,快要放假了,先祝大家节日快乐!之前写过js的写作建议和技巧,那么今天就来聊聊css吧!说到css,每一个网页都离不开css,但是对于css,很多开发者的想法就是,cs ...
- 居中的css:完全指南(翻译)
这里主要参考的是CHRIS COYIER写的一篇的文章(点击查看),主要讲了关于css水平.垂直居中的一些方法,每个方法后面都有一个demo,可以在线查看效果. 1 水平 水平居中有行内元素和块元素, ...
- python-班级人员信息统计
输入a,b班的名单,并进行如下统计. 输入格式: 第1行::a班名单,一串字符串,每个字符代表一个学生,无空格,可能有重复字符.第2行::b班名单,一串字符串,每个学生名称以1个或多个空格分隔,可能有 ...
- 安卓性能测试之Lint测试
pre { direction: ltr; color: rgba(0, 0, 10, 1); text-align: left } pre.western { font-family: " ...
- 安卓性能测试之 adb shell 常用命令
pm list packages 列出包名adb shell pm list packages:列出所有的包名.adb shell dumpsys package:列出所有的安装应用的信息adb sh ...
- 体温数据上传程序开发+获取时间的三种方法+DB Browser下载及安装
今天开始了体温上传程序的开发 今日所学: 获取时间 (21条消息) (转)安卓获取时间的三种方法_sharpeha的博客-CSDN博客_安卓获取时间 DB Browser安装教程 (20条消息) sq ...
- 升级DLL plugin 到AutoDllPlugin
为了使打包构建速度加快使用的DLLPlugin,但是我们还是需要手动把dll文件引入文件, HTMLwebpackplugin 结合autoDLLplugin可以自动引入打包文件, 十份地方便
- FastAPI(七十三)实战开发《在线课程学习系统》接口开发-- 回复留言
之前文章分享FastAPI(七十二)实战开发<在线课程学习系统>接口开发-- 留言列表开发,这次我们分享如何回复留言 按照惯例,我们还是去分析这里面的逻辑. 1.判断用户是否登录 2.用户 ...
- Cf #709 Div. 2 B. Restore Modulo 一个只有三千多人过的b题, 妙啊!
传送门: https://codeforces.com/contest/1484/problem/B 原题 Example input 6 6 1 9 17 6 14 3 3 4 2 2 3 7 3 ...
- Spring 源码 (1)Spring IOC Bean 创建的整体流程
Spring IOC 中涉及的重要接口 BeanDefinition Bean的描述信息,实现类包括 RootBeanDefinition 和 GenericBeanDefinition,Bean的描 ...