独立看门狗实验

为什么要看门狗

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

看门狗解决的问题是什么

  • 在启动正常运行的时候,系统不能复位。

  • 在系统跑飞(程序异常执行)的情况,系统复位,程序重新执行。

STM32内置两个看门狗,提供了更高的安全性,时间的精确性和使用 的灵活性。两个看门狗设备(独立看门狗/窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个 中断(仅适用窗口看门狗)或者产生系统复位。

  • 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生 故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
  • 窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口 来检测应用程序非正常的过迟或过早操作。窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

stm32独立看门狗和窗口看门狗的区别为:时钟源不同、中断不同、使用条件不同。
一、时钟源不同

stm32独立看门狗:stm32独立看门狗使用的是内部专门的 40Khz低速时钟,不需要使能时钟操作。
窗口看门狗:窗口看门狗使用的是 PCLK1的时钟,使用前需要先使能时钟。

二、中断不同

stm32独立看门狗:stm32独立看门狗没有中断,超时直接位。
窗口看门狗:窗口看门狗可以在中断中做位前的函数操作。

三、使用条件不同

stm32独立看门狗:stm32独立看门狗一般用于避免程序跑飞或者死循环。
窗口看门狗:窗口看门狗避免程序不安预定逻辑执行,比如先于理想环境完成,或者后于极限时间超时。

独立看门狗功能描述

  • 在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
  • 无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
  • 如果程序异常,就无法正常喂狗,从而系统复位。
    在这里插入图片描述
  • 键值寄存器IWDG_KR: 0~15位有效
  • 预分频寄存器IWDG_PR:0~2位有效。具有写保护功能,要操作先取消写保护
  • 重装载寄存器IWDG_RLR:0~11位有效。具有写保护功能,要操作先取消写保护。
  • 状态寄存器IWDG_SR:0~1位有效

看门狗相关寄存器:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

独立看门狗超时时间
在这里插入图片描述溢出时间计算:
Tout=((4×2^prer) ×rlr) /40 (M3)
时钟频率LSI=40K, 一个看门狗时钟周期就是最短超时时间。(Tout的单位是ms)
最长超时时间= (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);//状态:重装载/预分频 更新

独立看门狗操作步骤

  • 取消寄存器写保护:
 IWDG_WriteAccessCmd();
  • 设置独立看门狗的预分频系数,确定时钟:
IWDG_SetPrescaler();
  • 设置看门狗重装载值,确定溢出时间:
 IWDG_SetReload();
  • 使能看门狗
IWDG_Enable();
  • 应用程序喂狗:
IWDG_ReloadCounter();
  • 溢出时间计算:
   Tout=((4×2^prer) ×rlr) /40 (M3)

main.c中的代码:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "IWDG.h"int main(void){vu8 key=0;	delay_init();	    	 //延时函数初始化	  LED_Init();			     //LED端口初始化KEY_Init();          //初始化与按键连接的硬件接口delay_ms(200); LED0=0;					//先点亮红灯IWDG_Init(4,625);//最大溢出时间是一秒,就是在没有喂狗的情况下系统间隔1秒复位while(1){if(KEY_Scan(0)==WKUP_PRES){IWDG_ReloadCounter();}}
}

IWDG.h中的代码:

#include "IWDG.h"void IWDG_Init(u8 prer,u16 rlr)
{IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//取消寄存器写保护IWDG_SetPrescaler(prer);//设置预分频系数,确定时钟IWDG_SetReload(rlr);//设置看门狗重装载值,确定溢出时间IWDG_ReloadCounter();//从重装载值开始计数,应用程序喂狗(就是加载计数器,将rlr的值加载到计数器),向 IWDG_KR 写入 0XAAAA,通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。即实现独立看门狗的喂狗操作。IWDG_Enable();//使能看门狗,向 IWDG_KR 写入 0XCCCC,通过这句,来启动 STM32 的看门狗。注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。
}

以上代码运行结果是:在没有按KER_UP的情况下(没有喂狗)LED亮2秒灭一秒闪烁,如果在一秒内按KEY_UP按键的次数大于等于一(在系统复位之前喂狗,也就是计数器倒计时到0之前)则LED常亮

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

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

相关文章

Manthan, Codefest 16

暴力 A - Ebony and Ivory import java.util.*; import java.io.*;public class Main {public static void main(String[] args) {Scanner cin new Scanner (new BufferedInputStream (System.in));int a cin.nextInt ();int b cin.nextInt ();int c cin.nextInt ();for…

docker资源

Docker资源 Docker官方英文资源: docker官网:http://www.docker.com Docker windows入门:https://docs.docker.com/windows/ Docker Linux 入门:https://docs.docker.com/linux/ Docker mac 入门:https://docs.do…

STM32 通用定时器基本原理

STM32F10x系列总共最多有8个定时器: 三种STM32定时器区别: 通用定时器功能特点描述: ①、 STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括: 位于低速的APB1总线上(时钟来源可以是APB1的时钟) 16 位向上、向…

初识-Android之智能短信项目相关技术整理

标签页切换采用传统的TabHost: 采用TabActivty实现TabHost。 效果图-后补: 相关技术详解推荐: http://blog.csdn.net/zhouli_05/article/details/7696054 这里我解决了一个TabActivity和子Activity共享TabActivity的OptionMenu的问题&#xf…

STM32 定时器中断

通用定时器工作过程: 时钟选择: 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT)外部时钟模式1:外部输入脚(TIx)外部时钟模式2:外部触发输入(ETR)内部触发输入(ITRx):使用一个定时器作为另一个定时器…

Debian8.3.0下安装Odoo8.0步骤

Debian8.3.0下安装Odoo8.0的方法 假设你已经安装好了Debian 系统,使用root帐号执行如下命令 # apt-get update && apt-get upgrade # Install system updates # apt-get install sudo # Make sure sudo is installed 使用如下命令来创建一个Odoo用户&am…

STM32 PWM输出实验

定时器用来产生PWM输出: STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样,STM32 最多可以同时产生…

docker镜像和容器区别

docker镜像 docker容器,容器是用镜像创建的运行实例

域名相关的一些基础知识

DNS DNS,Domain Name System或者Domain Name Service(域名系统或者域名服务)。域名系统为Internet上的主机分配域名地址和IP地址。由于网络中的计算机都必须有个IP地址,这样相互之间才能通信,但让我们记住一大串的IP地址来访问网站显然是不可…

定时器输入捕获实验

输入捕获简介: 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变&a…

Linux查看内置命令和非内置命令帮助的几种方法(man、help、info)

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

电容触摸按键 实验

RC充放电电路原理: RC电路充放电公式: Vt V0(V1-V0)* [1-exp(-t/RC)]V0 为电容上的初始电压值; V1 为电容最终可充到或放到的电压值; Vt 为t时刻电容上的电压值。如果V0为0,也就是从0V开始充…

tomcat调优方案Maximum number of threads (200) created for connector with address null and port 8091...

1.tomcat6大并发出现:INFO: Maximum number of threads (200) created for connector with address null and port 8091 说明:最大线程数错误 解决方案:使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请…

SFTP是什么?与FTP之间有什么区别

什么是SFTP? SFTP是一种安全的文件传输协议,一种通过网络传输文件的安全方法;它确保使用私有和安全的数据流来安全地传输数据。 SFTP要求客户端用户必须由服务器进行身份验证,并且数据传输必须通过安全通道(SSH&#x…

C++基础( C++初识、数据类型、运算符、程序流程结构、)

前言&#xff1a; C专栏笔记来源于观看视频笔记 配套视频&#xff1a; https://www.bilibili.com/video/BV1et411b73Z?p16 基本代码框架&#xff1a; #include <iostream> using namespace std; int main() {system("pause");//等待程序return 0; }输出Hell…