STM32窗口看门狗的操作

STM32的窗口看门狗的主要功能是,程序过早的喂狗还有太晚喂狗,都会触发单片机重启,就是有一个时间段,在这个时间段内喂狗才不会触发单片机重启。

下面我就总结一下窗口看门狗的设置过程:

第一步:开启窗口看门狗APB1的时钟


第二步:配置各个寄存器(预分频器和窗口值)
            WWDG_SetPrescaler()写入预分频器
            WWDG_SetWindowValue()写入窗口值
    

 第三步:写入控制寄存器CR(看门狗是能位,计数器溢出标志位和计数器有效位)
    
第四步:喂狗  WWDG_SetCounter()

主要的步骤就是这么多了,其他的程序自己搞定,在程序中加入上面的四步就能实现窗口看门狗

WWDG_SetPrescaler()写入预分频器的函数,下面截图是这个函数的具体操作:

WWDG_SetWindowValue()写入窗口值的函数,下面截图是这个函数的具体操作:

WWDG_Enable() 使能窗口看门狗,下面截图是这个函数的具体操作:

WWDG_SetCounter() 喂狗函数,下面截图是这个函数的具体操作:

下面就是我写的一个小例子了:

其实我看来整体过程还是比较简单的,最复杂的一点就是第二步中的预分频器和窗口值的计算,下面我们来分析一下过程:

超时时间:50ms = 1/36000(PCLK1是36M) X 4096 X 第三个预分频系数 X T(0到5位)+1

APB1的时钟频率:

50ms  = 1/36000 X 4096 X 8 X (T[5:0] + 1)

50ms = 0.9102222222 X(T[5:0] + 1)

(T[5:0] + 1) =  50 / 0.910222222

(T[5:0] + 1) = 54.9316406263411

取整:(T[5:0] + 1) = 55

T[5:0] = 54

上面这是最大值的计算,下面是最小值的计算,也就是最小的喂狗时间计算:

比如说我定的最小的喂狗时间为30ms

30ms = 1 / 36000 X 4096 X 8 X (T[5:0] - W[5:0])

30ms = 0.910222222 X(T[5:0] - W[5:0])

(T[5:0] - W[5:0]) = 30ms / 0.9102222222

T[5:0] - W[5:0] =  32.95898 (取整33)

T[5:0] - W[5:0] = 33   前面算的T[5:0] = 54 

54 - W[5:0] = 33

W[5:0] = 21

至此所需要最长和最短的喂狗时间都计算完了,可以编程了,下面就是主要的main函数:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "Key.h"int main(void)
{OLED_Init();       //oled  屏幕初始化Key_Init();/*第一步:开启窗口看门狗APB1的时钟第二步:配置各个寄存器(预分频器和窗口值)WWDG_SetPrescaler()写入预分频器WWDG_SetWindowValue()写入窗口值第三步:写入控制寄存器CR(看门狗是能位,计数器溢出标志位和计数器有效位)第四步:喂狗  WWDG_SetCounter()*/OLED_ShowString(1,1,"WWDG Reset");if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)   //如果(RCC读看门狗复位标志位为1){OLED_ShowString(2,1,"WWDG RST");                    // 显示:IWDG RSTDelay_ms(500);                                      // 等待500毫秒 OLED_ShowString(2,1,"        ");                    // 显示:空格Delay_ms(500);                                      // 等待500毫秒RCC_ClearFlag();                                    //清除看门狗复位标志位}else                                             //否则:{OLED_ShowString(3,1,"RST");                         // 显示:RSTDelay_ms(500);                                      // 等待500毫秒 OLED_ShowString(3,1,"   ");                         // 显示:空格Delay_ms(500);                                      // 等待500毫秒}//第一步:开启窗口看门狗APB1的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);//第二步:配置各个寄存器(预分频器和窗口值)//		WWDG_SetPrescaler()写入预分频器//		WWDG_SetWindowValue()写入窗口值WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x40 | 21);       // 30msWWDG_Enable(0x40 | 54);         //50mswhile(1){Key_GetValue();//第四步:喂狗  WWDG_SetCounter()Delay_ms(31);         //这个延时过长就会触发看门狗复位WWDG_SetCounter(0x40 | 54);}}

上面的程序喂狗时间如果低于30ms和高于50毫秒,都会触发窗口看门狗复位,单片机都会自动重启,为了不叫单片机自动重启,请在合理的时间内进行喂狗操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/325488.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs code中如何使用git

由于本地代码有了一些储备,所以想通过网址托管形式,之前一直使用了github,但是鉴于一直被墙,无法登录账号,所以选择了国内的gitee来作为托管网站。 gitee的网址:Gitee - 基于 Git 的代码托管和研发协作平台…

LVS DR模式部署

一、LVS 简介 LVS的三种工作模式 NAT 地址转换 调度器会作为所有节点服务器的默认网关,也是客户端的访问入口和节点服务器返回响应消息的出口,所以调度器会承载双向流量的负载压力,可能会为整个群集的性能瓶颈。由于节点服务器都会处于内网…

Linux下安装JDK并配置环境变量

一、Oracle官网下载jdk 1、官网地址 https://www.oracle.com/java/technologies/downloads/#java17 2、命令下载 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 3、解压 tar -zxvf jdk-17_linux-x64_bin.tar.gz 4、配置环境变量 ec…

Qt---窗口系统

一、QMainWindow QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget) 1. 菜单栏(最多有一个) QMenuBar *bar…

自动秒收录网址导航分类目录模板

自动秒收录网址导航是一个以html5css3进行开发的免费版网址自动收录模板源码。 模板特点:全站响应式H5网站制作技术,一个网站适应不同终端,模板支持网址导航一键采集入库,免规则文章资讯智能批量采集内置伪原创,本地化…

windows11获取笔记本电脑电池健康报告

笔记本电脑的电池关系到我们外出时使用的安全,如果电池健康有问题需要及时更换,windows系统提供了检查电池健康度的方法。 1、打开命令行 1)键入 winR 2)键入 cmd 打开命令行。 2、在命令行运行如下指令,生成电池健…

springboot项目 字典/枚举翻译 终极解决方案 AOP+自定义注解+递归实体字段+实体动态三级缓存+责任链+多种转换方式

目录 前言实现思路技术确定 食用方式效果使用样例项目中使用第一步 复制包第二步 实现LoadDictDatabase并将其注入容器第三步 标识需要翻译的字段第四步 标识需要翻译的方法第五步 调用需要翻译的方法 实现细节TODO 前言 字典,即在存储介质中进行存储时,为了避免业务上对其名称…

【网站项目】SpringBoot803房屋租赁管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地,而且建议有多份副本 备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方 冗余: 数据有多份冗余,但不等备份&…

【JUC】并发编程 Synchronized 锁升级原理

Synchronized如何实现同步/互斥的效果? monitorenter: 将锁对象对象头中Mark Word的前30bit替换成指向操作系统中与其关联的monitor对象,将锁记录位状态改为10 monitorexit: 将锁对象对象头中Mark Word进行重置,重新恢…

代码随想录——二叉树的层序遍历(Leetcode102)二叉树层序遍历的模板

题目链接 层序遍历(队列) 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用…

数据分享—全国分省河流水系

河流水系数据是日常研究中必备的数据之一,本期推文主要分享全国分省份的水系和河流数据,梧桐君会不定期的更新数据,欢迎长期订阅。 数据预览 山东省河流水系 吉林省河流水系 四川省河流水系 数据获取方式 链接:https://pan.baidu.…

# 电脑突然连接不上网络了,怎么办?

电脑突然连接不上网络了,怎么办? 一、原因分析: 1、IP 地址冲突 2、DNS 解析出现问题。 3、电脑网络设置是否打开了【移动热点】或【飞行模式】。 4、【WLAN AutoConfig】服务是否打开。 5、无线网卡驱动损坏。 6、检查 WIFI 开关是否…

【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”

看到这句话的时候证明:此刻你我都在努力~ 加油陌生人~ 个人主页: Gu Gu Study ​​ 专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努…

远程调用feign的使用

在orderservice子工程中 <!--feign的远程--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>启动类加上这个注解 EnableFeignClients //自动装配…

STM32系统架构

以下是STM32系统架构中的各个重要组件和功能&#xff1a; 组件描述Cortex-M内核ARM Cortex-M系列内核&#xff0c;如M0、M0、M3、M4、M7等Flash存储器存储程序代码和数据SRAM存储程序运行时数据和堆栈外设接口GPIO、SPI、I2C、UART、TIM、ADC、DAC、USB、CAN、Ethernet等时钟和…

微信小程序按钮去除边框线

通常我们去掉按钮边框直接设置 border:0 但是在小程序中无效&#xff0c;设置outline:none也没用&#xff0c;当然可能你会说加权重&#xff1b;试过了无效 实际上该样式是在伪元素::after内&#xff0c;主要你检查css 还看不到有这个关系&#xff0c;鹅厂就是坑多 类样式::…

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP&#xff08;动态主机配置协议&#xff09;2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、以太网协议MAC地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT&#x…

【基于 PyTorch 的 Python 深度学习】6 视觉处理基础:卷积神经网络(2)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了卷积神经网络的池化层部分和现代经典网络。…

【c++】set、map用法详解

set、map用法详解 1. 关联式容器2. 键值对2.1 &#xff1a;pair2.2&#xff1a;make_pair 3. 树形结构的关联式容器3.1&#xff1a;set构造函数find()erase()insert()count()lower_bound()upper_bound() 3.2&#xff1a;multiset3.3&#xff1a;map构造函数insert()operator[] …