【STM32】看门狗

1.看门狗简介

看门狗起始就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新恢复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的简单一点,看门狗就是能让程序出问题时能重新启动系统。STM32有两个看门狗,独立看门狗和窗口看门狗。

1.1独立看门狗(Independent Watchdog,IWDG)

独立看门狗号称宠物狗,它有一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数器没有减到0之前,刷新了计数器的值,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。

1.2独立看门狗时钟

独立看门狗的时候由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHz之间,所以独立看门狗的定时时间并不一定非常准确,只适用于对时间精度要求比较低的场合。

在这里插入图片描述

上图中,配置的IWDG时钟CK_IWDG=32KHz。

1.3独立看门狗计数器时钟

递减计数器的时钟由LSI经过一个8位的预分频器得到,我们可以操作预分频器寄存器IWDG_PR来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256],计数器时钟CK_CNT=CK_IWDG/IWDG_PR。

1.4重装载寄存器

重装载寄存器是一个12位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。超时时间Tout=1/CK_CNT*rlv,rlv是重装载寄存器的值。

若IWDG_PR=32,rlv=2000,所以CK_CNT=32KHz/32=1KHz,Tout=1/1000*2000=2s。意味着2s之内我们就得喂狗,不然系统就会重启。

1.5标准库演示
#ifndef __BSP_IWDG_H
#define __BSP_IWDG_H#ifdef __cplusplus
extern "C"{#endif#include "stm32f4xx.h"void Init_IWDG(uint8_t prv,uint16_t rlv);
void IWDG_Feed(void);#ifdef __cplusplus
}
#endif#endifc
#include "bsp_iwdg.h"/*
* 设置 IWDG 的超时时间
* Tout = prv/LSICLK * rlv (s)
*      prv可以是[4,8,16,32,64,128,256]
* prv:预分频器值,取值如下:
*     @arg IWDG_Prescaler_4: IWDG prescaler set to 4
*     @arg IWDG_Prescaler_8: IWDG prescaler set to 8
*     @arg IWDG_Prescaler_16: IWDG prescaler set to 16
*     @arg IWDG_Prescaler_32: IWDG prescaler set to 32
*     @arg IWDG_Prescaler_64: IWDG prescaler set to 64
*     @arg IWDG_Prescaler_128: IWDG prescaler set to 128
*     @arg IWDG_Prescaler_256: IWDG prescaler set to 256
*
*    独立看门狗使用LSI作为时钟。
*    LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我
*    们的STM32F407中为32KHz,所以独立看门狗的定时时间并不一定非常精确,只适用于对时间精度
*    要求比较低的场合。
*
* rlv:预分频器值,取值范围为:0-0XFFF
* 函数调用举例:
* Init_IWDG(IWDG_Prescaler_32 ,1000);  // IWDG 1s 超时溢出
*            (32/LSICLK)*1000 = 1s
*/
void Init_IWDG(uint8_t prv,uint16_t rlv)
{// 使能 预分频寄存器PR和重装载寄存器RLR可写IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);// 设置预分频器值IWDG_SetPrescaler(prv);// 设置重装载寄存器值IWDG_SetReload(rlv);// 把重装载寄存器的值放到计数器中IWDG_ReloadCounter();// 使能 IWDGIWDG_Enable();
}void IWDG_Feed(void)
{// 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位// 当计数器的值减到0的时候会产生系统复位IWDG_ReloadCounter();
}
int main(void)
{Init_LED();//	//设置中断分组
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
//	
//	Init_USART();Init_IWDG(IWDG_Prescaler_32,1000);/* Infinite loop */while (1){}
}

上述代码思路为:Init_LED()中会将LED点亮,然后开启独立看门狗,设置的溢出时间为1s,那么1s后由于没有喂狗,mcu会复位,LED也会灭,但是由于时间太快了,肉眼应该无法看到。所以,我们使用了示波器进行测试LED的输入电平。

在这里插入图片描述

int main(void)
{Init_LED();//	//设置中断分组
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
//	
//	Init_USART();Init_IWDG(IWDG_Prescaler_32,1000);/* Infinite loop */while (1){IWDG_Feed();}
}

如果我们在巡航中一直喂狗,那么mcu就不会复位。

2.窗口看门狗(Window Watchdog,WWDG)

窗口看门狗号称警犬,它也有一个递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,就会产生复位,这个值叫窗口的下限,是固定值,不能改变。不同的是,窗口看门狗的计数器在减到某一个数之前喂狗也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义。

IWDG与WWDG区别

RLR是重装载寄存器,用来设置独立看门狗的计数器的值。TR是窗口看门狗的计数器的值,由用户独立设置,WR是窗口看门狗的上窗口值,由用户独立设置。

在出现下述两种情况之一时产生看门狗复位:

  1. 当喂狗的时候如果计数器的值大于窗口上限值。
  2. 当计数器的数值从0x40减到0x3F。

如果启动了看门狗并且使能中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),这个中断我们称它为死前中断或者叫遗嘱中断, 在中断函数里面我们应该出来最重要的事情,而且必须得快,因为递减计数器再减一次,就会产生系统复位。

注意事项:

  1. 上限值必须大于0x40,否则就无窗口了。
  2. 窗口看门狗时钟来源PCLK1(APB1总线时钟)分频后。
2.1标准库演示
#ifndef __BSP_WWDG_H
#define __BSP_WWDG_H#ifdef __cplusplus
extern "C"{#endif#include "stm32f4xx.h"#define WWDG_CNT    0x7Fvoid Init_WWDG(uint8_t tr, uint8_t wr, uint32_t prv);
void WWDG_Feed(void);#ifdef __cplusplus
}
#endif#endif
#include "bsp_wwdg.h"
#include "stdio.h"/* WWDG 配置函数
* tr :递减计时器的值, 取值范围为:0x7f~0x40
* wr :窗口值,取值范围为:0x7f~0x40
* prv:预分频器值,取值可以是
*      @arg WWDG_Prescaler_1: WWDG counter clock = (PCLK1/4096)/1
*      @arg WWDG_Prescaler_2: WWDG counter clock = (PCLK1/4096)/2
*      @arg WWDG_Prescaler_4: WWDG counter clock = (PCLK1/4096)/4
*      @arg WWDG_Prescaler_8: WWDG counter clock = (PCLK1/4096)/8
*/
void Init_WWDG(uint8_t tr, uint8_t wr, uint32_t prv)
{//使能窗口看门狗时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);// 设置预分频器值WWDG_SetPrescaler(prv);// 设置重装载寄存器值WWDG_SetWindowValue(wr);// 使能 WWDGWWDG_Enable(WWDG_CNT&tr);//配置中断控制器并使能中断NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=WWDG_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=3;NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;NVIC_Init(&NVIC_InitStruct);WWDG_ClearFlag();//清楚标志位WWDG_EnableIT();//使能中断
}void WWDG_IRQHandler(void)
{WWDG_SetCounter(WWDG_CNT);WWDG_ClearFlag();
}void WWDG_Feed(void)
{printf("WWDG_Feed\r\n");// 把重装载寄存器的值放到计数器中,WWDG_SetCounter(WWDG_CNT);
}
int main(void)
{Init_USART();Init_LED();//设置中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);Init_WWDG(0x7f,0x5f,WWDG_Prescaler_8);printf("hello,this is stm32f407\r\n");/* Infinite loop */while (1){//-----------------------------------------------------// 这部分应该写需要被WWDG监控的程序,这段程序运行的时间// 决定了窗口值应该设置成多大。//-----------------------------------------------------// 计时器值,初始化成最大0X7F,当开启WWDG时候,这个值会不断减小// 当计数器的值大于窗口值时喂狗的话,会复位,当计数器减少到0X40// 还没有喂狗的话就非常非常危险了,计数器再减一次到了0X3F时就复位// 所以要当计数器的值在窗口值和0X40之间的时候喂狗,其中0X40是固定的。if ( (WWDG->CR & 0X7F) < 0x5f ){// 喂狗,重新设置计数器的值为最大0X7FWWDG_Feed();}}
}

注意,我们试过了在死前中断中喂狗,但是好像来不及,mcu还是重启了。所以,我们在main函数中进行了计数判断喂狗。

主函数中我们把WWDG的计数器的值设置 为0X7F,上窗口值设置为0X5F,分频系数为8分频。在while死循环中,我们不断读取计数器的值, 当计数器的值减小到小于上窗口值的时候,我们喂狗,让计数器重新计数。

在while死循环中,一般是我们需要监控的程序,这部分代码的运行时间,决定了上窗口值应该设置为多少,当监控的程序运行完毕之后, 我们需要执行喂狗程序,比起独立看门狗,这个喂狗的窗口时间是非常短的,对时间要求很精确。如果没有在这个窗口时间内喂狗的话, 那就说明程序出故障了,会产生提前唤醒中断,最后系统复位。

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

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

相关文章

用英文介绍孟买:Mumbai India‘s Transforming MEGACITY

Mumbai: India’s Transforming MEGACITY Link: https://www.youtube.com/watch?vtWD_-Rzrn8o Summary First Paragraph: Mumbai, India’s financial and entertainment capital, is undergoing a major transformation. With its contiguous urban population nearing 25…

web图片怎么导入ps?这个方法给你轻松解决!

随着WebP格式图片因其体积小、加载快的优势在网站中日益普及&#xff0c;对于图片编辑者来说&#xff0c;能够直接在Photoshop中打开和编辑WebP文件变得尤为重要。 WebPShop插件应运而生&#xff0c;它是一个专为Photoshop设计的模块&#xff0c;支持打开和保存WebP图像&#…

ATFX汇市:澳大利亚5月CPI大增0.4百分点,降息预期显著降温

ATFX汇市&#xff1a;据澳大利亚统计局数据&#xff0c;澳大利亚5月加权CPI年率为4%&#xff0c;高于前值3.6%&#xff0c;高于预期3.8%&#xff0c;显示出澳大利亚通胀率颇具韧性。5月份数据公布之前&#xff0c;月度CPI年率平均波幅不足0.1个百分点&#xff0c;呈现出横盘震荡…

《数字图像处理》实验报告六

一、实验任务与要求 比较采用不同的色彩空间对彩色图像处理的效果&#xff0c;处理包括&#xff1a; a&#xff09;直方图均衡化 b&#xff09;图像增强 二、实验报告 &#xff08;一&#xff09;RGB色彩空间的直方图均衡化 / 锐化处理 1、matlab 实现代码&#xff1a; %…

推荐系统(LLM去偏?) | (WSDM24)预训练推荐系统:因果去偏视角

::: 大家好&#xff01;今天我分享的文章是来自威斯康星大学麦迪逊分校和亚马逊AWS AI实验室的最新工作&#xff0c;文章所属领域是推荐系统和因果推理&#xff0c;作者针对跨域推荐中的偏差问题提出了一种基于因果去偏的预训练推荐系统框架PreRec。 ::: 原文&#xff1a;Pre-t…

mobaXterm上传文件进度一直为0%

在这里修改了senssion、重启都没有用 最后发现是文件存放的路径中不能有中文&#xff0c;改了之后就成功上传了

开展FMEA培训时需要做好哪些准备?

FMEA&#xff08;失效模式与影响分析&#xff09;作为一种预防性的质量工具&#xff0c;正逐渐成为当代企业提升产品竞争力的关键。然而&#xff0c;很多企业在开展FMEA时&#xff0c;却常常因为准备工作不足而事倍功半。那么&#xff0c;开展FMEA培训时需要做好哪些准备呢&…

Jenkins流水线发布,一篇就解决你的所有疑惑

这次搭建的项目比较常规,前端是react写的,后端是springboot,并且由于是全栈开发,所以是在同一个项目中。接下来我演示下怎么用jenkins进行自动化发布。 1.jenkins必装插件 这里用到的是jenkinsFile主要是基于Groovy这个沙盒,有些前置插件。这里使用maven进行打包,所以需…

测试基础16:测试用例设计方法-测试大纲法

课程大纲 1、应用场景 验证页面跳转&#xff1a;有多个窗口/页面&#xff0c;每个窗口/页面有多个动作&#xff0c;每个动作之间有相互的联系的场景。看点击后&#xff0c;页面跳转正确与否。 2、设计步骤 step1.列出大纲&#xff1a;列出涉及的页面和页面可执行的动作。 s…

生命在于学习——Python人工智能原理(4.7)

四、Python的程序结构与函数 4.4 函数 函数能将代码划分为若干模块&#xff0c;每一个模块可以相对独立的实现某一个功能&#xff0c;函数有两个主要功能&#xff0c;分别是降低编程难度和实现代码复用&#xff0c;函数是一种功能抽象&#xff0c;复用它可以将一个复杂的大问…

【C#】找不到属性集方法。get只读属性用了反射设置setValue肯定报错

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 背景 找不到属性集方法。get只读属性用了反射设置setValue肯定报错 报错…

IPFoxy Tips:匿名海外代理IP的使用方法及注意事项

在互联网上&#xff0c;隐私和安全问题一直备受关注。为了保护个人隐私和数据安全&#xff0c;使用匿名代理IP是一种常用的方法。匿名代理IP可以隐藏用户的真实IP地址&#xff0c;使用户在访问网站时更加隐秘和安全。 本文将介绍匿名代理IP的基本原理和核心功能。 基本原则 匿…

2024期权交易佣金手续费最低是多少?期权交易有哪些成本?

显性成本 期权交易的显性成本包含期权交易的佣金和交易所费用&#xff0c;分别支付给券商和交易所&#xff0c;统一由券商代收。 佣金 期权佣金是期权交易时支付给券商的费用&#xff0c;佣金通常以交易金额的一定比例计算&#xff0c;可以是固定费用&#xff0c;也可以是滑…

用两个钟,我又在VMWARE上搞了一套内部网配置

最近要学es&#xff0c;所以打算自己用虚拟机搞个NAT&#xff0c;又搞了两个钟。为了不再费劲尝试&#xff0c;也为了造福大众&#xff0c;所以选择搞一份NAT笔记&#xff01;&#xff01;&#xff01;&#xff01; 1.初始化网关和DNS 我们给网关配置一个地址192.168.96.1&…

【多模态】BEiT v2

链接&#xff1a;https://arxiv.org/pdf/2208.06366 论文&#xff1a;BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers Introduction Motivation&#xff1a;Masked image modeling (MIM) 任务在自监督表征学习上取得了不错的成绩&#xff0c;但是现…

教师资格证考试面试报名流程

文章目录 前言面试报名流程一、登录官网二、选择报考省份三、注册报名账号四、确认考试承诺五、填报个人信息六、上传个人照片七、查看个人信息八、面试报名九、等待审核十、考试缴费最后&#xff08;必看&#xff09;附录1. 中小学教师资格考试网2. 广东省教资考试报名通知&am…

【Mysql】多表、外键约束

多表 1.1 多表简述 实际开发中&#xff0c;一个项目通常需要很多张表才能完成。 例如一个商城项目的数据库,需要有很多张表&#xff1a;用户表、分类表、商品表、订单表… 1.2 单表的缺点 1.2.1 数据准备 创建一个数据库 db3 CREATE DATABASE db3 CHARACTER SET utf8;数据库…

Segment any Text:优质文本分割是高质量RAG的必由之路

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

网络文化经营许可证(文网文)办理全面讲解

随着互联网时代的飞速发展&#xff0c;互联网早已渗透到人们的生活中&#xff0c;各类直播、短视频成为大家生活娱乐必不可少的一部分。注册一家从事互联网行业的企业是一个不错的选择。那互联网企业需要办理什么证件资质呢&#xff1f;在互联网行业从事盈利文化活动必须持有网…

【精品方案】智能制造之路(93页PPT)

引言&#xff1a;智能制造之路&#xff1a;革新制造业的引领之旅 随着科技的迅猛发展&#xff0c;特别是人工智能、物联网、大数据等技术的不断进步&#xff0c;制造业正迎来一场深刻的变革。智能制造&#xff0c;作为这场变革的核心&#xff0c;正逐步成为推动产业升级和转型发…