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

发布时间:2024-04-18  

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

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
KEY[15:0]














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

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

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

14.2.2 预分频寄存器IWDG_PR

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- 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

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- RLR[11:0]













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

14.3 窗口看门狗相关寄存器

14.3.1 控制寄存器WWDG_CR

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- WDGA T6 T5 T4 T3 T2 T1 T0






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

0:禁止看门狗

1:启用看门狗

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

14.3.2 配置寄存器WWDG_CFR

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- EWI TB1 TB0 W6 W5 W4 W3 W2 W1 W0




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

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- 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 ) ;

  }

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>