【单片机】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 ...
随机推荐
- electron制作聊天界面(仿制qq)
效果图: 样式使用scss和flex布局 这也是制作IM系统的最后一个界面了!在制作之前参考了qq和千牛 需要注意的点 qq将滚动条美化了 而且在无操作的情况下是不会显示的 滚动条美化 ::-webk ...
- ES6-11学习笔记--对象的扩展
属性简洁表示法 属性名表达式 Objec.is() 扩展运算符 与 Object.assign() in 对象的遍历方式 属性简洁表示法: 如果属性key跟变量名一样,可简写 let name = ...
- 前端面试题整理——手写简易jquery
class jQuery { constructor(selector) { const result = document.querySelectorAll(selector) console.lo ...
- 前端面试题整理——普通函数和new函数
下列代码的输出值: function A() { console.log(1) } function fn() { A = function () { console.log(2) } return ...
- getHibernateTemplate出现的所有find方法的总结
文章转自:http://www.cnblogs.com/DarrenChan/p/5528194.html 一.find(String queryString); 示例:this.getHiberna ...
- 居中select中的option选项
select经常有长短不一的选项:选择不同的选项居中不会生效: 使用text-align:center;text-align-last: center; 可以让所有选项都居中: 关于text-dec ...
- Struts2-day1总结
1.Struts2的基本执行流程(详见我的博客) 2.Struts2的分模块开发 如果有多个项目的Struts.xml写在一起,容易造成数据混乱,所以可以使用分模块的方法,在项目下新建*.xml配置文 ...
- JVM诊断及工具笔记(4) 使用visualvm分析JVM堆内存泄漏
在这里感谢最近一直阅读我文章的小伙伴,如果觉得文章对你有用,可以帮忙关注转载,需要的时候可以及时找到文章. 背景 今年Q3季度我们在推广业务方使用Iceberg,当时为了让不同业务线的用户可以使用自己 ...
- 面试官:ZAB协议是什么?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 这天是越来越热了,但是还是有很多 ...
- os、sys、json、subprocess模块
今日内容概要 1.os模块 2.sys模块 3.json模块 4.subprocess模块 今日内容详细 os模块 """该模块主要是跟操作系统打交道"&quo ...