32看门狗

目录

一.看门狗简介

二.代码实现


一.看门狗简介

IWDG的专用时钟是LSI,内部低速时钟

WWDG使用的是APB1的时钟,并没有专门的时钟,所以并不独立

如果独立看门狗已经由硬件选项或软件启动, LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG

喂狗或使能的时候会在键寄存器写入0x5555之外的值

进行寄存器的写保护

尽量让预分频系数小,因为有时根据结果算出的RL可能是小数,那么取整以后会造成每次喂狗都会有一点的误差,但预分频系数大的话,会减少RL的重置频率

这些时间是按照40kHz时钟给出。实际上,MCU内部的RC频率会在30kHz60kHz之间变化 

所以在计算超时时间时,可以对频率进行范围取值

PCLK1时钟信号进入时先执行一个固定的4096分频 

窗口看门狗需要自行启动时钟

但没有写入保护

 

EWI:死前中断,可以用来执行一些紧急操作,保存数据,关闭危险设备

 

看门狗一旦启用就无法关闭了,系统复位后可以关闭 ,且计时时的计数器的值无法读取出来

递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门
狗被启用时, T6 位必须被设置,以防止立即产生一个复位。

二.代码实现

(1)独立看门狗 
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//对写操作进行配置
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//写预分频器
void IWDG_SetReload(uint16_t Reload);//写重装值
void IWDG_ReloadCounter(void);//重新装载寄存器,喂狗
void IWDG_Enable(void);//启动独立看门狗
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
void RCC_ClearFlag(void);
  *     @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready
  *     @arg RCC_FLAG_HSERDY: HSE oscillator clock ready
  *     @arg RCC_FLAG_PLLRDY: PLL clock ready
  *     @arg RCC_FLAG_LSERDY: LSE oscillator clock ready
  *     @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready//前面都是等待时钟准备
  *     @arg RCC_FLAG_PINRST: Pin reset按键复位
  *     @arg RCC_FLAG_PORRST: POR/PDR reset上电复位和掉电复位
  *     @arg RCC_FLAG_SFTRST: Software reset软件复位
  *     @arg RCC_FLAG_IWDGRST: Independent Watchdog reset独立看门狗
  *     @arg RCC_FLAG_WWDGRST: Window Watchdog reset窗口
  *     @arg RCC_FLAG_LPWRRST: Low Power reset低功耗复位
#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Key.h" 
int main(void)
{
	OLED_Init();
	Key_Init();
	
	if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)
	{
		OLED_ShowString(2, 1, "IWDGRST");
		Delay_ms(500);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		
		RCC_ClearFlag();
	}
	else
	{
		OLED_ShowString(3,1,"RST");
		Delay_ms(200);
		OLED_ShowString(3,1,"   ");
		Delay_ms(200);
	}
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	IWDG_SetPrescaler(IWDG_Prescaler_16);
	IWDG_SetReload(2499);
	IWDG_ReloadCounter();
	IWDG_Enable();//喂狗或使能的时候会在键寄存器写入0x5555之外的值,实现写保护
	while(1)
	{
		Keynum();
		IWDG_ReloadCounter();
		OLED_ShowString(4,1,"FEED");
		Delay_ms(170);
		OLED_ShowString(4,1,"    ");
		Delay_ms(800);
		//加“Feed”延时970就超时喂狗了
		//无35,36,37,延时979就超时了
	}	
}
	

(2)窗口看门狗 

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);

但由于看门狗开启后是不能再被关闭的,所以最高位写入0的操作是无效的

“读-改-写”操作

1.先将寄存器读到临时变量里

2.用|= ,&=的操作,改变临时变量的指定几位

3.将临时变量写回寄存器

这样可以单独改变寄存器的某几位,而不改变其他位的值,且如果连续改变不同的位,效率较高,而且所以更改的位在最后写回寄存器时同时生效

但窗口看门狗启动后,由于对最高位的写入没有任何作用,所以不用使用到“读-改-写”操作,可以直接进行写入计数值

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Key.h" 
int main(void)
{
	OLED_Init();
	Key_Init();
	
	if (RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)
	{
		OLED_ShowString(2, 1, "WWDGRST");
		Delay_ms(500);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		RCC_ClearFlag();
	}
	else
	{
		OLED_ShowString(3,1,"RST");
		Delay_ms(200);
		OLED_ShowString(3,1,"   ");
		Delay_ms(200);
	}
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
	WWDG_SetPrescaler(WWDG_Prescaler_8);
	WWDG_SetWindowValue(21 | 0x40);//将次高位置1,将T[6:0]和W[6:0]都加上0x40
	WWDG_Enable(54 | 0x40);//将次高位置1,防止其产生溢出触发
	while(1)
	{
		Keynum();
		OLED_ShowString(4,1,"FEED");
		Delay_ms(20);
		OLED_ShowString(4,1,"    ");
		Delay_ms(20);
		WWDG_SetCounter(54 | 0x40);//喂狗放在延时之后目的是防止程序运行,与使能函数间隔太小,过早喂狗,程序卡死

	}	
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Aster实现一台电脑当两台使——副屏搭配键鼠

前言:笔者每年回家,都面临着想要和小伙伴一起玩游戏,但小伙伴没有电脑/只有低配电脑的问题。与此同时,笔者自身的电脑是高配置的电脑,因此笔者想到,能否在自己的电脑上运行游戏,在小伙伴的电脑上…

C++从入门到精通 第十二章(C++流)

一、C流的概念 1、C流的体系结构 (1)C为实现数据的输入输出定义了一系列的流类,这些类之间的派生、继承关系如下图所示,它们之中一部分是用模板实现的,图中用细线框表示,另外图中的虚线表示模板类与模板实…

计算机二级C语言的注意事项及相应真题-5-程序修改

目录 41.累加链表结点数据域中的数据作为函数值返回42.根据整型形参m,计算如下公式的值43.删除数列中值为x的元素44.从N个字符串中找出最长的那个串,并将其地址作为函数值返回45.将两个长度相等的纯数字字符串当作两个加数,求其代表的数值之和…

【Docker】Linux主机部署Docker

Docker部署 1.二进制文件部署 到如下地址,下载二进制包。 Docker官网:https://docs.docker.com/engine/install/binaries/ 网易镜像源:https://mirrors.163.com/docker-ce/linux/static/stable/x86_64/ 下载好的二进制包上传到主机&#xf…

C++项目 -- 高并发内存池(七)性能瓶颈与优化

C项目 – 高并发内存池(七)性能瓶颈与优化 文章目录 C项目 -- 高并发内存池(七)性能瓶颈与优化一、检测性能瓶颈二、使用基数树来优化项目1.基数树2.不加锁的原理3.性能对比 三、最终代码实现 一、检测性能瓶颈 DeBug下运行代码&…

015—pandas 标记按月连续变化趋势

前言 在业务数据分析中,特别是和时间相关的数据,会经常要判断数据的变化情况,比如是否是增长还是降低,或是持平。 需求 以数据中最后的月份为基础,来看它最近的数据变化,并将变化情况标记在本行的最后一…

网络基础与通信原理:构建数字世界的框架

目录 初识计算机网络 网络介绍 按照拓扑分类 按地域分类 网络设备 交换机(switch) 路由器(router) 传输介质 双绞线 光纤 光纤速度 ISO ISO和OSI有什么关系呢? OSI七层模型 TCP/IP四层 TCP/IP协议族 …

Atmel ATSHA204应用总结

1 ACES软件安装 Atmel Crypto Evaluation Studio (ACES) https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/Atmel%20Crypto%20%20Studio%20(ACES) 2 基本概念 ACES CE:Atmel Crypto Evalution Studio Configuration Environment(基于加…

美国纽约时代广场纳斯达克大屏投放-大舍传媒

美国纽约时代广场纳斯达克大屏投放-大舍传媒 引言 对于大舍传媒来说,能够在美国纽约时代广场纳斯达克大屏投放广告是一个里程碑式的时刻。这不仅仅代表着大舍传媒在全球范围内的知名度与实力,也标志着该公司在国际市场上取得了巨大的进展。纽约时代广场…

Prometheus+TDengine集群实现监控体系高可用

背景 为避免再次出现因Prometheus宕机导致业务无法查看历史数据受到影响,准备将Prometheus架构从单节点方式升级为高可用集群方式并将后端存储由本地存储改为远端分布式时序数据库存储。分布式时序数据库采用国产数据库TDengine。 架构 解释:虚线代表P…

【安卓基础3】Activity(一)

🏆作者简介:|康有为| ,大四在读,目前在小米安卓实习,毕业入职 🏆安卓学习资料推荐: 视频:b站搜动脑学院 视频链接 (他们的视频后面一部分没再更新,看看前面也…

C#之WPF学习之路(1)

目录 WPF的起源 C的qt和C#的wpf对比 winform 和 wpf有什么区别 安装 Visual Studio2022 创建 HelloWorld 程序 App.xaml与Application类 Application的生命周期 Window窗体的生命周期 WPF的起源 WPF(Windows Presentation Foundation)是一种用于…

《图解设计模式》笔记(二)交给子类

三、Template Method模式:将具体处理交给子类 示例程序类图 public static void main(String[] args) {// 生成一个持有H的CharDisplay类的实例AbstractDisplay d1 new CharDisplay(H);// 生成一个持有"Hello, world."的StringDisplay类的实例AbstractD…

【HarmonyOS应用开发】三方库(二十)

三方库的基本使用 一、如何获取三方库 目前提供了两种途径获取开源三方库: 通过访问Gitee网站开源社区获取 在Gitee中,搜索OpenHarmony-TPC仓库,在tpc_resource中对三方库进行了资源汇总,可以供开发者参考。 通过OpenHarmony三…

数字世界的探索者:计算机相关专业电影精选推荐

目录 推荐计算机专业必看的几部电影 《黑客帝国》 《社交网络》 《乔布斯传》 《心灵捕手》 《源代码》 《盗梦空间》 《头号玩家》 《我是谁:没有绝对安全的系统》 《战争游戏》(WarGames) 《模仿游戏》(The Imitation Game) 《硅谷》(Silicon Valley) …

SpringBoot+WebSocket实现即时通讯(四)

前言 紧接着上文《SpringBootWebSocket实现即时通讯(三)》 本博客姊妹篇 SpringBootWebSocket实现即时通讯(一)SpringBootWebSocket实现即时通讯(二)SpringBootWebSocket实现即时通讯(三&…

如何在Shopee 上选择热销商品?shopee应该在哪选品

在如今激烈竞争的电商市场中,如何通过精准的选品策略提升在Shopee平台上的销售业绩成为卖家们关注的焦点。Shopee作为一个蓬勃发展的电商平台,提供了多种资源和工具来帮助卖家做出明智的选品决策。通过深入了解这些渠道和策略,卖家们可以更好…

第2.4章 StarRocks表设计——分区分桶与副本数

目录 一、数据分布 1.1 概述 1.2 数据分布方式 1.2.1 Round-Robin 1.2.2 Range 1.2.3 List 1.2.4 Hash 1.3 StarRocks的数据分布方式 1.3.1 不分区 Hash分桶 1.3.2 Range分区Hash分桶 三、分区 3.1 分区概述 3.2 创建分区 3.2.1 手动创建分区 3.2.2 批量创建分区…

微服务篇之负载均衡

一、Ribbon负载均衡流程 二、Ribbon负载均衡策略 1. RoundRobinRule:简单轮询服务列表来选择服务器。 2. WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小。 3. RandomRule:随机选择一个可用的服…

Java 那些诗一般的 数据类型 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…