STM32入门学习笔记之看门狗实验(上)

发布者:nu23最新更新时间:2024-04-18 来源: elecfans关键字:STM32  看门狗实验  电磁干扰 手机看文章 扫描二维码
随时随地手机看文章

14.1 STM32看门狗简介

单片机构成的微型计算机系统中,单片机的工作可能会受到外界的电磁干扰或者程序运行的BUG导致程序指针错误,或者其他错误导致的死循环,引发整个系统陷入停滞状态,所以需要一个与系统独立的定时器来监控单片机的运行状态,这个定时器在系统正常运转的时候,不停的刷新定时器的计数器,例如隔一段时间给这个定时器的计数器写100,然后在定时器减运算到0之前再一次写入100,这样,就保证了定时器不计数到0,也就意味着通过判断这个定时器是否计数到0来判断系统是否陷入死机状态,实现这种功能的定时器就称为看门狗,不停的刷新计数器值的行为就称为“喂狗”,一般计数器计数到0后会直接对单片机进行复位,用于避免系统陷入死循环。

STM32内部有两种看门狗模块,一种是窗口看门狗WWDG,另一种是独立看门狗IWDG,STM32的独立看门狗由内部专门的40Khz低速时钟驱动,即使主时钟发生故障,它也仍然有效。


独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40Khz,而是在30~60Khz之间的一个可变化的时钟,只是我们在估算的时候,以40Khz的频率来计算。

窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。

在递减计数器达到窗口配置寄存器数值之前,如果7位的递减计数器数值在控制寄存器中被刷新,那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

14.2 独立看门狗相关寄存器

14.2.1 键值寄存器IWDG_KR

1514131211109876543210
KEY[15:0]














该寄存器属于只写寄存器,读取的值为0x0000,软件必须以一定间隔写入0xAAAA,否则,当计数器为0时,看门狗会产生复位;

写入0x5555表示允许访问IWDG_PR和IWDG_RLR寄存器;

写入0xCCCC表示启动看门狗工作,如果选择了硬件看门狗则不受此命令字限制。

14.2.2 预分频寄存器IWDG_PR

1514131211109876543210
-PR[2:0]













Bit 2~Bit 0:预分频因子

000:预分频因子=4

001:预分频因子=8

010:预分频因子=16

011:预分频因子=32

100:预分频因子=64

101:预分频因子=128

110:预分频因子=256

111:预分频因子=256

14.2.3 重装载寄存器IWDG_RLR

1514131211109876543210
-RLR[11:0]













Bit 11~Bit 0:看门狗计数器重装载值:每当向IWDG_KR寄存器写入0xAAAA时,重装载值会被传送到计数器中,随后计数器从这个值开始递减计数。

14.3 窗口看门狗相关寄存器

14.3.1 控制寄存器WWDG_CR

1514131211109876543210
-WDGAT6T5T4T3T2T1T0






Bit 7:激活位:,此位由软件置1,但仅能由硬件在复位后清0。当WDGA=1时,看门狗可以产生复位

0:禁止看门狗

1:启用看门狗

Bit 6~Bit 0:7位计数器,存储看门狗的计数器值。每(4096x2 ^WDGTB^ )个PCLK1周期减1。当T6变成0产生看门狗复位

14.3.2 配置寄存器WWDG_CFR

1514131211109876543210
-EWITB1TB0W6W5W4W3W2W1W0




Bit 9:提前唤醒中断,此位若置1,则当计数器值达到40h,即产生中断,此中断只能由硬件在复位后清除

Bit 8:预分频器时基

00:CK计时器时钟不分频

01:CK计时器时钟2分频

10:CK计时器时钟4分频

11:CK计时器时钟8分频

Bit6~Bit 5:7位窗口值,用来与递减计数器进行比较用的窗口值

14.3.3 状态寄存器WWDG_SR

1514131211109876543210
-EWIF













Bit 0:提前唤醒中断标志,当计数器值达到40h时,此位由硬件置1。它必须通过软件写0来清除。若中断未被使能,此位也会被置1

14.4 实验例程

14.4.1 独立看门狗实验

功能:如果看门狗没有复位,接在PB5上的LED常亮,如果PA0的按键按下,就喂狗,只要按键不停的按,看门狗就一直不会产生复位,保持DS0的常亮,一旦超过看门狗定溢出时间,那么将导致程序重启,这将导致DS0熄灭一次。


(1)创建wdg.h文件输入以下代码。


#ifndef _WDG_H_

#define _WDG_H_



#include 'sys.h'

/*********************************************************************************************************

                  函    数    列    表

*********************************************************************************************************/

void IWDG_Init( u8 prer, u16 rlr ) ;                                  //独立看门狗初始化



#endif

(2)创建wdg.c文件输入以下代码。


#include 'wdg.h'

/***************************************************

Name    :IWDG_Init

Function  :独立看门狗初始化

Paramater  :

      prer:分频数:0~7

      rlr:重装载寄存器值

Return    :None

***************************************************/

void IWDG_Init( u8 prer, u16 rlr )

{

  IWDG->KR = 0x5555 ;                                          //使能对IWDG->PR和IWDG->RLR的写

    IWDG->PR = prer ;                                          //设置分频系数

    IWDG->RLR = rlr ;                                          //从加载寄存器 IWDG->RLR

  IWDG->KR = 0xAAAA ;                                          //更新计数器

    IWDG->KR = 0xCCCC ;                                          //使能看门狗

}

(3)在1.c文件中输入以下代码。


#include 'sys.h'

#include 'delay.h'

#include 'usart1.h'

#include 'wdg.h'

/***************************************************

Name    :LED_Init

Function  :LED初始化

Parameter  :None

Return    :None

***************************************************/

#define LED PBout( 5 )                                          //定义LED端口

void LED_Init()

{

  RCC->APB2ENR |= 1<<3 ;

  GPIOB->CRL &= 0xFF0FFFFF ;

  GPIOB->CRL |= 0x00300000 ;

  LED = 1 ;

}

/***************************************************

Name    :KEY_Init

Function  :KEY初始化

Parameter  :None

Return    :None

***************************************************/

#define KEY  PAin( 0 )                                          //定义按键端口

void KEY_Init()

{

  RCC->APB2ENR |= 1<<2 ;

  GPIOA->CRL &= 0xFFFFFFF0 ;

  GPIOA->CRL |= 0x00000008;

}

/***************************************************

Name    :main

Function  :主函数

Parameter  :None

Return    :None

***************************************************/

int main()

{

  STM32_Clock_Init( 9 ) ;                                        //STM32时钟初始化

  SysTick_Init( 72 ) ;                                        //SysTick初始化

  USART1_Init( 72, 115200 ) ;                                      //初始化串口1波特率115200

  LED_Init() ;                                            //LED初始化

  KEY_Init() ;                                            //按键初始化

   delay_ms( 500 ) ;                                          //延时500ms,让人可以看到DS0灭的状态

   IWDG_Init( 4, 625 ) ;                                        //与分频数为64,重载值为625,溢出时间为1s

  LED = 0 ;                                              //点亮DS0

  while( 1 )

  {

    if( KEY==1 )

    {

      delay_ms( 10 ) ;

      if( KEY==1 )

      {

        IWDG->KR = 0xAAAA ;                                    //喂狗

      }

    }

    delay_ms( 20 ) ;

  }

}


关键字:STM32  看门狗实验  电磁干扰 引用地址:STM32入门学习笔记之看门狗实验(上)

上一篇:STM32入门学习笔记之EEPROM存储实验2
下一篇:STM32入门学习笔记之RTC实验(下)

推荐阅读最新更新时间:2026-02-21 12:54

STM32入门学习笔记之看门狗实验(下)
14.4.2 窗口看门狗实验 功能:程序一运行使得接在PB5上的LED1亮300ms后关闭,进入死循环。等待WWDG中断的到来,在中断里面,喂狗,并对PE5上的LED2进行翻转操作。可以看到LED2不停的闪烁,LED1只在刚启动的时候闪一下。 (1)在上一个实验的wdg.h文件的函数列表区域添加以下代码。 void WWDG_Init( u8 tr, u8 wr, u8 fprer ) ; //窗口看门狗初始化 (2)在上一个实验的wdg.c文件末尾添加以下代码。 /*************************************************** Name :WWDG_IRQHandler
[单片机]
stm32正点原子学习笔记(29)独立看门狗实验
iwdg.c 1 #include iwdg.h 2 3 void iwdg_init(uint8_t IWDG_Prescaler,uint16_t Reload) 4 { 5 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 6 IWDG_SetPrescaler(IWDG_Prescaler); 7 IWDG_SetReload(Reload); 8 IWDG_ReloadCounter(); 9 IWDG_Enable(); 10 11 } iwdg.h 1 #ifndef __IWDG_H 2
[单片机]
<font color='red'>stm32</font>正点原子学习笔记(29)独立<font color='red'>看门狗</font><font color='red'>实验</font>
STM32学习笔记---IWDG独立看门狗实验
继做了WWDG窗口看门狗实验后,继续进行第9个实验-IWDG独立看门狗实验,本实验通过设置窗口看门狗IWDG间断时间来定期的检查是否出错,在SysTick_Handler中断函数中加入了流水灯用来测试是否运行了IDWG看门狗程序,用PD6-LED2通过闪烁验证程序可行性,编程工程大致和USART实验过程差不多,先是开启系统时钟,然后GPIO端口时钟,然后复用功能时钟AFIO,然后各个模块用的的时钟,,呵呵,之后进入各个模块初始化,设置,编写子程序,中断的话,要在中断函数中填写某模块的中断触发处理函数,重要的是在CONFG.H函数中开启模块的声明,差不多是这样的了。 以下为IWDG函数主要部分: //IWDG窗口看门狗设置初始化 v
[单片机]
<font color='red'>STM32</font>学习笔记---IWDG独立<font color='red'>看门狗</font><font color='red'>实验</font>
【GD32F303红枫派开发板使用手册】第十讲 FWDGT-独立看门狗实验
10.1实验内容 通过本实验主要学习以下内容: 独立看门狗的原理 独立看门狗功能介绍 实现独立看门狗功能 10.2实验原理 10.2.1看门狗的原理 一般来说,搭配MCU的产品都需要有长期运行的需求,特别像一些工业设备,可能要求运行个几年都不关机,但谁也不能保证在这几年里,MCU里面的代码不出任何问题,更何况自然环境中还存在很多电磁干扰、静电等,都可能会导致MCU出现运行异常的情况,比如程序卡死啦,进入错误状态啦等等,这个时候,我们就可以通过一个非常可爱的外设——看门狗,来帮助MCU从异常状态复位,让程序重新开始从头运行。 看门狗实际上是一个定时器,它的工作原理是:将看门狗定时器的计数器设定一个初始值,看门狗开始运行后,定
[单片机]
【GD32F303红枫派开发板使用手册】第十讲 FWDGT-独立<font color='red'>看门狗</font><font color='red'>实验</font>
STM32F103标准库开发:独立看门狗(IWDG)实验
一、独立看门狗(IWDG)基本知识 1. IWDG简介 独立看门狗是由专门的低速总线进行驱动,即LSI总线(时钟频率40KHz),它可以在主时钟故障的情况下仍然可以工作。 独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。 2. IWDG功能描述 在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。 无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR中的值就会重新加载到计数器,从而避免产生
[单片机]
STM32F103标准库开发:独立<font color='red'>看门狗</font>(IWDG)<font color='red'>实验</font>
14. 独立看门狗实验
一。 看门狗概述 1. 为什么要用看门狗 2. 看门狗要解决的问题 STM32有两个看门狗 独立看门狗 窗口看门狗 3. 独立看门狗的功能描述 键值寄存器 KR (1)往KR中写入0xCCCC的时候,开始启动看门狗。 (2)计数器开始从其复位值0xFFF递减,当计数到0的时候会产生一个复位信号RESET。 (3)如果在某个时候往KR寄存器中写入0xAAAA(喂狗),自动重装载寄存器RLR的值就会重新加载到计数器中,从而避免看门狗复位。 如果能够及时喂狗,计数器的值就无法到0,从而程序可以正常运行。 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰, 造成程序跑
[单片机]
14. 独立<font color='red'>看门狗</font><font color='red'>实验</font>
PIC16F877A 看门狗定时器实验
//*******************PIC16F877A 看门狗定时器实验******************* // //PORTA,PORTB,PORTC,PORTD,PORTE复位时为输入状态 //PORTA.4(RA4)为开漏输出 // //WDT运行于独立的内部RC振荡器,即使器件时钟停振,WDT仍正常工作 //PIC16F877A单片机的WDT只能在烧写芯片时通过配置位启动或停止 //WDT基本溢出时间为18ms,由于温度影响,该值在7-33ms之间变化 //WDT和TMR0共用一个预分频器 //PSA=1; //预分频器分配给WDT使用 //PS2 PS1 PS0 WDT //
[单片机]
AVR内部看门狗实验
AVR内部看门口实验。 1、看门口实验。在主程序中周期喂狗,通过按下按键让程序无限循环,从而启动看门狗。 2、内部1 M晶振,程序采用单任务方式,软件延时。 3、进行此实验请插上JP1、JP3的所有8个短路块,JP7(LED_EN)短路块。 4、通过此实验可了解看门狗的设置及看门狗的喂狗等。 */ #include "iom16v.h" #include macros.h /*延时函数*/ void delay_ms(unsigned char i) { unsigned char a, b; for (a = 1; a i; a++) { for (b = 1; b; b++) { ; } } } void
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved