独立看门狗实验

一. 独立看门狗概述

二. 常用寄存器和库函数配置

三. 编写独立看门狗实验

一. 概述

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

1.2 看门狗解决的问题是什么?

在启动正确运行的时候,系统不能复位。
在系统跑飞的情况,系统复位,程序重新执行。

1.3 独立看门狗概述

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

独立看门狗适合应用于需要看门狗作为一个在主程序之外能够完全独立工
作,并且对时间精度要求低的场合。
◆窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口
来检测应用程序非正常的过迟或过早操作。

窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

1.4 独立看门狗功能描述

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

2.1 独立看门狗框图


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


在键寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。 无论何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位 。


该寄存器用来设置看门狗时钟的分频系数,最低为 4,最高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。


该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的

2.2 独立看门狗超时时间

2.3 IWDG独立看门狗操作库函数:

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//取消写保护;0x5555使能void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值:写PRvoid IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值:写PLRIWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器,向 IWDG_KR 写入 0XAAAAIWDG_Enable(); //使能 IWDG,向 IWDG_KR 写入 0XCCCCFlagStatus IWDG_GetFlagStatus(unit16_t IWDG_FLAG);//状态:重装载/预分频 更新

三. 编写:

iwdg.c

#include "iwdg.h"
#include "led.h"//Copyright(C) 正点原子 2009-2019
//All rights reserved
void IWDG_Init(u8 prer,u16 rlr)
{   IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64IWDG_SetReload(rlr);  //设置IWDG重装载值IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器IWDG_Enable();  //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{   IWDG_ReloadCounter();
}

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "iwdg.h"int main(void){  delay_init();            //延时函数初始化  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 uart_init(9600);    //串口初始化为9600LED_Init();             //初始化与LED连接的硬件接口 KEY_Init();          //按键初始化   delay_ms(300);      //让人看得到灭IWDG_Init(4,625);    //与分频数为64,重载值为625,溢出时间为1s    LED0=0;              //点亮LED0while(1){if(KEY_Scan(0)==WKUP_PRES)IWDG_Feed();//如果WK_UP按下,则喂狗delay_ms(10);};
}

led.c

#include "led.h"//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LED IO初始化
void LED_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);     //使能PA,PD端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                 //LED0-->PA.8 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA.8GPIO_SetBits(GPIOA,GPIO_Pin_8);                       //PA.8 输出高GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                //LED1-->PD.2 端口配置, 推挽输出GPIO_Init(GPIOD, &GPIO_InitStructure);                   //推挽输出 ,IO口速度为50MHzGPIO_SetBits(GPIOD,GPIO_Pin_2);                       //PD.2 输出高
}

key.c

#include "key.h"
#include "delay.h"//按键初始化函数
//PA0.15和PC5 设置成输入
void KEY_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY0_PRES,KEY0按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下
//注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
u8 KEY_Scan(u8 mode)
{    static u8 key_up=1;//按键按松开标志if(mode)key_up=1;  //支持连按          if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)){delay_ms(10);//去抖动 key_up=0;if(KEY0==0)return KEY0_PRES;else if(KEY1==0)return KEY1_PRES;else if(WK_UP==1)return WKUP_PRES; }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;         return 0;// 无按键按下
}

2021-04-20 独立看门狗实验相关推荐

  1. stm32看门狗_「正点原子NANO STM32开发板资料连载」第十一章 独立看门狗实验

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十一章 独 ...

  2. 嵌入式 独立看门狗实验

    独立看门狗实验: 1. 介绍: (1) 为什么需要看门狗? 在MCU微型计算机系统中,MCU运行程序很容易受到外界电磁场的干扰,从而造成程序运行错误甚至发生跑飞现象,从而陷入死循环,程序的正常运行被打 ...

  3. STM32单片机(4) 独立看门狗实验

    [转载请注明出处:http://blog.csdn.net/leytton/article/details/38393651] /*********************************** ...

  4. proteus里面没有stm32怎么办_学习STM32日志——独立看门狗实验(20.06.23)

    继续更新学习STM32的历程,今天学习看门狗. 在单片机构成的微型计算机系统中,单片机的工作时常收到外界电磁场的干扰,导致程序跑飞,陷入死循环.为了解决这个问题,产生了一种用于监测单片机程序运行状态的 ...

  5. STM32 独立看门狗实验

    一.STM32 独立看门狗简介 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效.这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 ...

  6. 十一、独立看门狗实验

    目录 一.对独立看门狗的认识 1.看门狗的作用 2.独立看门狗的适用情况 3.独立看门狗的功能描述 4.工作框图 ​ 二.寄存器的介绍 1.键值寄存器 IWDG_KR 2.预分频寄存器IWDG_PR ...

  7. STM32独立看门狗实验

    一 为什么需要看门狗? 在MCU微型计算机系统中,MCU运行程序很容易受到外界电磁场的干扰,从而造成程序运行错误甚至发生跑飞现象,从而陷入死循环,程序的正常运行被打乱,从而造成不可预料的严重后果,于是 ...

  8. STM32F4 | 独立看门狗(IWDG)实验

    文章目录 一.STM32F4 独立看门狗简介 二.硬件设计 三.软件设计 四.实验现象 五.STM32CubeMX 配置 IWDG   这一章介绍如何使用 STM32F429 的独立看门狗(以下简称 ...

  9. 7、【STM32】独立看门狗和窗口看门狗(IWDG、WWDG)实验

    前言 使用的是正点原子的探索者开发板进行学习,芯片:STM32F407ZGTx 学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接. 注:本文档添加了对代码的在线调试功能,有助 ...

最新文章

  1. mysql顺序结构_MySQL学习之流程结构
  2. Intent、Bundle
  3. 一些C和C++的常见问题集锦 ----不停更新
  4. mui 头部tab代码2
  5. CMake和Make——make makefile cmake qmake都是什么,有什么区别?
  6. PHP的分页原理和简单实例
  7. mysql linux通用版_Linux下安装通用版本的MySQL
  8. mysql 查询语法基础_入门MySQL——查询语法练习
  9. 基煜基金王翔:助力金融机构提升效率 强化内控合规
  10. 【小技巧】PhotoShop + lllustrator制作电子签名矢量图
  11. 开源无国界!CSDN 董事长蒋涛、GitHub 副总裁 Thomas Dohmke 对话实录
  12. aspose-word的简单使用以及转pdf线上乱码
  13. 优先队列push pop操作
  14. 蚩尤战团--管理分布
  15. 【前端知识点】promise简书-30分钟带你搞懂promise面试必备
  16. 4pics1word android,4 Pics 1 word Answers
  17. python实现某网站的音乐下载
  18. 搜索引擎site关键字的站内搜索
  19. 二叉树的前序中序后序遍历图示
  20. 学习java过程之内部类

热门文章

  1. 龙珠觉醒找不到服务器,龙珠觉醒:新服开7天,百万战已烂大街,这样培养方可养老!...
  2. thinkphp5 框架内分页带参数的解决办法
  3. vue项目中如何使用有向无环图(dag-diagram)
  4. Springboot计算机等级考试在线答题小程序 计算机毕设源码68573
  5. ARP原理概述——基于WinPcap发送ARP请求数据包获取远程MAC地址
  6. 立体绿化成城市新宠,究竟有何优势?
  7. 电脑计算机考证中级四级
  8. bzoj3638【GDOI2016模拟3.20】diyiti
  9. 2021-06-29 工作记录--CSS-p标签自动换行 + p标签里不能放p标签
  10. nodejs环境及解决node服务器外网端口无法访问