STM32独立看门狗

参考正点原子视频

看门狗

在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称:看门狗

看门狗的意义

  • 在启动正常运行的时候,系统不能复位
  • 在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行

独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效

独立看门狗适合应用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合

独立看门狗功能描述

  • 在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)
  • 无论何时,只要在键值寄存器IWDG_KR中写入0xAAA(通常说的喂狗),自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位
  • 如果程序异常,就无法正常喂狗,从而系统复位

独立看门狗框图

在这里插入图片描述

  • 键值寄存器IWDG_KR:0~15位有效
  • 预分频寄存器IWDG_PR:0~2位有效。具有写保护能力,要操作先取消写保护
  • 重装载寄存器IWDG_RLR:0~11位有效。具有写保护能力,要操作先取消写保护
  • 状态寄存器IWDG_SR:0~1位有效

预分频器(IWDG_PR)

  • 在STM32的定时器中,预分频器(Prescaler-PSC)用来将定时器时钟源进行分频输出。
  • 预分频器的值由寄存器TIMx_PSC设定,是一个16位正整数值。
  • 在STM32系统中,定时器的时钟源为内部时钟时,其频率一般都比较高,以STM32F103的TIM1为例,其总线时钟最大为72MHz,体现在16位的定时器上的效果就是从0计数到65535上溢只需要0.9毫秒。如果我们需要更长时间的定时间隔,那么就需要预分频器对时钟进行分频处理,以降低定时器时钟(CK_CNT)的频率。
  • 预分频器的工作的工作原理是,定时器时钟源每tick一次,预分频器计数器值+1,直到达到预分频器的设定值,然后再tick一次后计数器归零,同时,CNT计数器值+1。
  • 由此可以看出,因为达到最大值后还要再tick一次才归零,所以定时器时钟频率应该为Fosc/(PSC+ 1)。其中Fosc是定时器的时钟源。比如想对时钟源进行72分频,那么预分频器的值就应该设置为71。
  • 预分频器值寄存器TIMx_PSC存在影子寄存器(官方翻译为缓冲功能),所以在定时器启动后更改TIMx_PSC的值并不会立即影响当前定时器的时钟频率。要等到下一个更新事件(UEV)发生时才会生效。比如下边这张图就体现了将分频系数由1修改为2(即TIMx_PSC由0更改为1)时整个定时器的时序图。
    在这里插入图片描述

键寄存器(IWDG_KR)

在这里插入图片描述

重装载寄存器(IWDG_RLR)

在这里插入图片描述
重载寄存器:当计数器计数到终值 (0x000) 时会产生一个复位信号,计数器寄存器将装载重新计数。

独立看门狗超出时间

在这里插入图片描述
溢出时间计算
Tout = ( ( 4 * 2^prer )rlr)/40(M3)

Tout公式是最终的式子,要弄清楚式子中的各成员的含义,就要从根源开始推倒和理解。

  • 首先是溢出时间Tout(超时时间)=(IWDG_RLR寄存器对应的装载数值) * (看门狗时钟周期)
  • 看门狗时钟周期=1/freq。 (freq为8位预分频器的值,递减计数器所用到的时钟频率)
  • 独立看门狗由专用的低速时钟(LSI)驱动,LSI频率是40K。所以freq=40*预分频系数
  • 预分频系数与预分频因子互为倒数,所以freq=40/预分频因子。
    Tout公式中的prer是IWDG_PR寄存器中位2:0的十进制值。根据手册中该寄存器的配置关系是:000对应4分频,001对应8分频,010对应16分频…由此得出预分频因子与prer的值关系是:预分频因子=4*2prer=2(prer+2)。
  • Tout公式中rlr是重装载寄存器IWDG_RLR所对应的重装载数值。
  • 所以Tout=rlr看门狗时钟周期=rlr(1/freq)=rlr*(1/(40预分频系数))=rlr(1/(40/预分频因子))=rlr*(1/(40/(42prer)))=rlr*((2(prer+2))/40)=((42^prer)*rlr)/40
  • 总时间(溢出时间)=每次递减计数的周期*递减计数的次数。然后根据重装载寄存器IWDG_RLR和预分频寄存器IWDG_PR计算出周期和次数,然后相乘就得出结果了

时钟频率LSI = 40K,一个看门狗时钟周期就是最短超时时间。

最长超时时间 = (IWDG_RLR寄存器最大值)X看门狗时钟周期

IWDG独立看门狗操作库函数

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR
void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
void IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
void IWDG_Enable(void);//使能看门狗:写0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新

独立看门狗操作步骤

1.取消寄存器写保护

IWDG_WriteAccessCmd();

2.设置独立看门狗的预分频系数,确定时钟

IWDG_SetPrescaler();

3.设置看门狗重装载值,确定溢出时间

IWDG_SetReload();

3.设置看门狗重装载值,确定溢出时间

IWDG_SetReload();

4.使能看门狗

IWDG_Enable();

5.应用程序喂狗

IWDG_ReloadCounter();

iwdg.h

#ifndef __WGD_H
#define __WDG_H
#include"sys.h"void IWDG_Init(u8 prer, u16 rlr);#endif

iwdg.c

#include"iwdg.h"void IWDG_Init(u8 prer, u16 rlr)
{IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(prer);IWDG_SetReload(rlr);IWDG_ReloadCounter();IWDG_Enable();//FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);
}

main

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
#include "iwdg.h"int main(void){vu8 key=0;	delay_init();	      LED_Init();		  	BEEP_Init();      KEY_Init();        delay_ms(200);LED0=0;		IWDG_Init(4,625); //1swhile(1){if(KEY_Scan(0)==WKUP_PRES){IWDG_ReloadCounter();}/*key=KEY_Scan(0);	if(key){						   switch(key){				 case WKUP_PRES:	BEEP=!BEEP;break; case KEY1_PRES:	LED1=!LED1;break;case KEY0_PRES:	LED0=!LED0;LED1=!LED1;break;}}else delay_ms(10);*/ }	 
}

#ifndef

#ifndef是"if not defined"的简写,是宏定义的一种,它是可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等。

  1. 防止头文件的重复包含和编译
  2. 便于程序的调试和移植

#endif

C语言中#endif是条件编译的结束

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog | 看门狗

一、 看门狗简介 看门狗:也称看门狗定时器,是常见于系统的一种外设;看门狗似乎就是一条看门的狗,如果系统一切正常则看门狗不叫,如果程序不正常,则看门狗则会将程序咬死(即程序强制复位&#x…

软件看门狗实现

一文看懂看门狗(附STM和英飞凌芯片应用) 文章目录 一文看懂看门狗(附STM和英飞凌芯片应用)(一)看门狗概述(二)硬件看门狗(三)软件看门狗 (一)看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单…

为HttpClient开启HTTP/2

正文 .Net Core在调用其他服务时,调用通常使用HttpClient,而HttpClient默认使用HTTP/1.1 。 配置 HttpClient 以使用 HTTP/2 h2 连接 自 .NET Core 3.0 发布以来, .NET 开发人员可以使用 HttpClient 启用 HTTP/2 。 设置 HTTP/2 的方法 De…

Linux系统软件看门狗

1.看门狗定义 Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。 内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开 /dev/watchdog 设备&a…

软件看门狗怎么设计

有几个看门狗 主控内部有条看门狗,叫做内部狗,有的产品外部有充电ic,也能起到看门狗的作用,一般和主控采用IIC通讯,叫做外部狗。 环境 以RTOS为例子,介绍看门狗设计 设计目的 1.能监控到每个线程是否有…

STM32看门狗详解

看门狗的作用:防止单片机因未知原因死机或比我们预期的时间过长长时间不能响应,如果出现这种问题,看门狗就会把单片机复位 独立看门狗(IWDG): 时钟来源:内部低速时钟(LSI&#xff0…

linux看门狗定时器,看门狗定时器的作用

看门狗定时器(WDT,Watch Dog TImer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始…

独立看门狗

一、独立看门狗概述 1、为什么需要看门狗? 单片机的工作易受到外界电磁场干扰,造成程序跑飞,而陷入死循环,造成整个系统陷入停滞状态。出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运…

Prometheus+Grafana+AlertManager监控Linux主机状态

文章目录 PrometheusGrafanaAlertManager监控平台搭建开始监控Grafana连接Prometheus数据源导入Grafana模板监控Linux主机状态 同系列文章 PrometheusGrafanaAlertManager监控平台搭建 Docker搭建并配置Prometheus Docker拉取并配置Grafana Docker安装并配置Node-Exporter …

STM32看门狗简述

概述 看门狗一般分为硬件看门狗和软件看门狗,主要用来解决程序CPU异常,程序跑飞挂死等问题,提高系统的可靠性。 硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗…

国内大公司的开源项目一览表(包含mysql读写分离等)

原文地址:http://gad.qq.com/article/detail/34413?sessionUserTypeBFT.PARAMS.239074.TASKID&ADUIN731373934&ADSESSION1508293481&ADTAGCLIENT.QQ.5533_.0&ADPUBNO26719 奇虎360 https://github.com/Qihoo360 1.MySQL中间层 Atlas Atlas是由 Qih…

BAT、360、新浪 小米 网易等大公司开源项目

阿里巴巴开源的好软件太多,请自行选择所需,我列几个我们用的 阿里巴巴 Alibaba https://github.com/alibaba/ https://github.com/thx 1.分布式key/value存储系统 Tair Tair是由淘宝网自主开发的Key/Value结构数据存储系统,在淘宝网有着大规…

【GeoDa实用技巧100例】022:geoda生成空间权重矩阵(邻接矩阵、距离矩阵)

geoda生成空间权重矩阵(邻接矩阵、距离矩阵),车式矩阵、后式矩阵、K邻接矩阵。 文章目录 一、概述二、“车式”邻接的gal文档生成三、“后式”邻接gal文档生成四、k最近邻居gat文档生成五、查看gal和gat文档一、概述 空间权重矩阵(或相应的表格形式)一般需要用计算机软件生…

一些官方的github地址

阿里巴巴开源github地址:https://github.com/alibaba 腾讯开源github地址:https://github.com/Tencent 奇虎360github地址:https://github.com/Qihoo360 小米开源github地址:https://github.com/XiaoMi 豆瓣开源github地址:https://github.com/douban 网易开源github地址…

32、启用 HTTP 响应压缩和编程式配置Web应用

★ 启用HTTP压缩 就是前端页面如果改动的比较多,那么响应就会比较慢,可以通过设置HTTP响应压缩来提高响应,如果前端改动少,那么就不需要启动这个响应压缩。 目的:为了提高HTTP响应数据在网络上的传输效率。▲ 设置如…

Android Jetpack Compose中使用字段验证的方法

Android Jetpack Compose中使用字段验证的方法 数据验证是创建健壮且用户友好的Android应用程序的关键部分。随着现代UI工具包Jetpack Compose的引入,处理字段验证变得更加高效和直观。在这篇文章中,我们将探讨如何在Android应用中使用Jetpack Compose进…

快速搭建 Linux 学习平台

最近换了一个新的笔记本电脑,原来的学习环境没了,所以就重新搭建一下,顺便把这个过程给记录下来,希望可以帮助有需要的人。一个学习环境最主要的目的是简化学习需要准备的时间,不需要花费太多的时间在哪些不必要的细枝…

ZD Soft Screen Recorder 注册汉化版 【好用的屏幕录制软件】

ZD Soft Screen Recorder 汉化版捕获计算机屏幕上的内容与声音,并保存为各种格式压缩的视频文件。你在屏幕上看到的一切都可以在高帧速率连续进行记录。其结果视频在记录时间内清晰再现画面内容,所以是声音。 ZD Soft Screen Recorder 也能够拍摄图像的截…

树莓派控制ZD-8731两相步进电机驱动器

之前写过一篇驱动步进电机的文章,可以跟这篇参考着看。请戳这里! 一、硬件: 树莓派3B ZD-8731驱动器 与驱动器配套的步进电机 电源 驱动器需要24V电源供电(用电很危险,请注意安全!) 二、…

linux内核编译无线网卡,ZD1211B芯片USB无线网卡Linux驱动的编译

我用的无线网卡芯片是zd1211b的,在网上找到很多驱动都不好用,最后在这里上找到好用的驱动 我们用的Linux内核是2.6.14的。驱动的交叉编译非常简单,在其Makefile中修改交叉编译器,然后把相应的KERNEL_SOURCE,MODPATH&am…