【单片机】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 ...
随机推荐
- 如何0代码实现多人音视频通话?【内附源码/Demo】
3月15日新增"1860+1194",全国进入了抗疫关键时期.响应政策多地采取了社会面清零策略. 3月14日零点,深圳按下了暂停键. 应疫情防控要求,深圳全市暂停生产经营活动,严格 ...
- js中一个函数调用另一个函数变量;判断鼠标按住/手指左右滑动
<script> function myFunction() { var x1=event.clientX;//只需要将被调用的变量前的var删除即可在下个函数调用: document.g ...
- Vue-router实现单页面应用在没有登录情况下,自动跳转到登录页面
这是我做前端一来的第一篇文章,都不知道该怎么开始了.那就直接奔主题吧.先讲讲这个功能的实现场景吧,我们小组使用vue全家桶实现了一个单页面应用,最初就考虑对登录状态做限制.比如登录后不能后退到登录页面 ...
- vue+koa2即时聊天,实时推送比特币价格,爬取电影网站
技术栈 vue+vuex+vue-router+socket.io+koa2+mongodb+pm2自动化部署+图灵机器人+[npm script打包,cdn同步,服务器上传一个命令全搞定] 功能清单 ...
- oracle三个连接配置文件 listener.ora、sqlnet.ora、tnsnames.ora
关于PLSQL连接ORACLE配置字符串 首先要讲一下下面的一些知识 1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER) Oracle实例是由SGA和一组后台进程组成的,实 ...
- String类 的基本用法
1.String 对象的创建 String对象的创建有两种方式. 第1 种方式就是我们最常见的创建字符串的方式: String str1 = "Hello, 慕课网"; 第 2 种 ...
- JS/JQ动态创建(添加)optgroup和option属性
JavaScript和Jquery动态操作select下拉框 相信在前端设计中必然不会少的了表单,因为经常会使用到下拉框选项,又或是把数据动态回显到下拉框中.因为之前牵扯到optgroup标签时遇到了 ...
- ArrayList扩容问题
今天上午上课在看JavaSE的面经,其中有问关于ArrayList和LinkedList的区别,就突然思考到,既然ArrayList是采用数组形式存储数据,对比我们自己使用到的数组,为什么ArrayL ...
- JavaScript学习总结5-作用域
由于所有的全局变量都会绑定到window上,如果不同的JS文件,使用了相同的全局变量,会造成冲突,可以把自己的代码全部放入及定义的唯一空间中,减少全局命名冲突问题
- Fastjsonfan反序列链学习前置知识
Fastjson前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 ...