STM32学习笔记:独立看门狗IWDG

STM32 内部自带了 2 个看门狗:独立看门狗( IWDG )和窗口看门狗( WWDG)。本文将详细讲解关于独立看门狗( IWDG)的定义、要点及使用方法。
 

0x01、什么是看门狗

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

0x02、什么是独立看门狗IWDG

通俗点讲IWDG就是STM32中的一个12位的递减计数器,当计数器减到0时,系统会产生一个复位信号,重启单片机。所以,我们在使用看门狗时,需要在计数器减到0之前刷新计数器的值,使看门狗不产生复位信号,表示单片机工作正常。这个动作就是我们经常说的喂狗。超过一定时间没有喂狗,我们就认为单片机挂了。

0x03、IWDG的特点

1、独立看门狗的时钟是由个内部独立的 40kHz 的 RC 振荡器提供时钟,即使主时钟发生故障,它也仍然有效。(RC振荡器 LSI频率一般在 30~60KHZ之间,根据温度和工作场合会有一定的漂移,我们一般取40KHZ

2、看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。

3、可以通过预分频寄存器来设置看门狗时钟的分频系数。

0x04、IWDG的使用

独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。

0x0001、IWDG相关寄存器

IWDG共有4个寄存器,键值寄存器IWDG_KR、预分配寄存器IWDG_PR、重载寄存器IWDG_RLR、状态寄存器IWDG_SR。

0x00011、IWDG_KR 键值寄存器

Bits 31:16 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bits 15:0 KEY[15:0]: Key value (write only, read 0000h)

These bits must be written by software at regular intervals with the key value AAAAh,otherwise the watchdog generates a reset when the counter reaches 0.

Writing the key value 5555h to enable access to the IWDG_PR and IWDG_RLR registers (see Section 19.3.2) Writing the key value CCCCh starts the watchdog (except if the hardware watchdog option is selected)

该寄存器必须定时写入0xAAAA,否则当计数器递减到0时,看门狗将产生复位信号。

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

写入0xcccc,表示启动看门狗(如果选择了硬件看门狗,则不受此命令字限制)

0x00012、IWDG_PR 预分频寄存器

Bits 31:3 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bits 2:0 PR[2:0]: Prescaler divider  预分频器

These bits are write access protected seeSection 19.3.2. They are written by software to select the prescaler divider feeding the counter clock. PVU bit of IWDG_SR must be reset in order to be able to change the prescaler divider.

这些位具有写访问保护,请参阅第19.3.2节。它们是由软件改写,用来选择供给计数器时钟的预分频器。IWDG_SR寄存器的PVU位必须复位,以便能够改变预分频器。

000: divider /4

001:divider /8

010:divider /16

011: divider /32

100:divider /64

101:divider /128

110:divider /256

111:divider /256

Note: Reading this register returns the prescaler value from the VDD voltage domain. This value may not be up to date/valid if a write operation to this register is ongoing.

注:读取该寄存器将从VDD电压域返回预分频器值。如果对此寄存器的写入操作正在进行,则此值可能不是最新的、无效的。

For this reason the value read from this register is valid only when the PVU bit in the IWDG_SR register is reset.

因此,仅当IWDG_SR寄存器中的PVU位复位时,从该寄存器读取的值才有效。

0x00013、IWDG_RLR 重载寄存器

Bits 31:12 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bits11:0 RL[11:0]:Watchdog counter reload value 看门狗计数器重新加载值

These bits are write access protected see Section 19.3.2. They are written by software to define the value to be loaded in the watchdog counter each time the value AAAAh is written in the IWDG_KR register.

The watchdog counter counts down from this value. The timeoutperiod is a function of this value and the clock prescaler. Refer to Table 96.The RVU bit in the IWDG_SR register must be reset in order to be able to change the reload value.

这些位具有写访问保护,见第19.3.2节。它们由软件改写,以定义每次将AAAAh值写入IWDG_KR寄存器时要加载到看门狗计数器中的值。看门狗计数器从该值开始倒计时。

timeoutperiod是这个值和时钟预分频器的函数。参考表96。IWDG_SR寄存器中的RVU位必须复位,以便能够更改重新加载值。

Note: Reading this register returns the reload value from the VDD voltage domain. This value may not be up to date/valid if a write operation to this register is ongoing on this register.

For this reason the value read from this register is valid only when the RVU bit in the IWDG_SR register is reset.

注意:读取此寄存器将返回VDD电压域的重新加载值。如果对该寄存器的写入操作正在该寄存器上进行,则该值可能不是最新的、无效的。因此,仅当IWDG_SR寄存器中的PVU位复位时,从该寄存器读取的值才有效。

0x00014、IWDG_SR 重载寄存器

Bits 31:2 Reserved, must be kept at reset value. 保留,必须保持在复位值

Bit 1 RVU:Watchdog counter reload value update 看门狗计数器重新加载值更新

This bit is set by hardware to indicate that an update of the reload value is ongoing. It is reset by hardware when the reload value update operation is completed in the VDD voltage domain(takes up to 5 RC 40 kHz cycles).

该位由硬件设置,以指示正在进行重新加载值的更新。当在VDD电压域中完成重新加载值更新操作时(最多需要5个RC 40 kHz周期),由硬件重置。

Reload value can be updated only when RVU bit is reset.

重新加载值只能在RVU位复位时更新。

Bit 0 PVU: Watchdog prescaler value update 看门狗预分频器值更新

This bit is set by hardware to indicate that an update of the prescaler value is ongoing. It is reset by hardware when the prescaler update operation is completed in the VDD voltage domain (takes up to 5 RC 40 kHz cycles).

该位由硬件设置,以指示正在进行预分频器值的更新。当预分频器更新操作在VDD电压域中完成时(最多需要5个RC 40 kHz周期),由硬件重置。

Prescaler value can be updated only when PVU bit is reset.

预分频器值只能在PVU位复位时更新。

0x0002、IWDG相关库函数

我们通过官方库文件(STM32F10x_StdPeriph_Lib_V3.5.0)来操作IWDG分为以下几步:

0x00021、IWDG_WriteAccessCmd

    函数名:void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess)

函数功能:取消或开启IWDG_PR 和 IWDG_RLR 寄存器的写保护

     参数1:uint16_t IWDG_WriteAccess —>  IWDG_WriteAccess_Enable(取消寄存器写保护)、IWDG_WriteAccess_Disable(开启寄存器写保护)。                

    返回值:无

0x00022、IWDG_SetPrescaler

    函数名:void IWDG_SetPrescaler(uint8_t IWDG_Prescaler)

函数功能:设置看门狗IWDG时钟的预分频系数

     参数1:uint8_t IWDG_Prescaler  —>  IWDG_Prescaler_4

                                                                  IWDG_Prescaler_8

                                                                  IWDG_Prescaler_16

                                                                  IWDG_Prescaler_32

                                                                  IWDG_Prescaler_64

                                                                  IWDG_Prescaler_128

                                                                  IWDG_Prescaler_256

    返回值:无

总结分频系数公式为:4 × 2^Prescaler。看门狗运行频率公式为:40 000 / (4 × 2^Prescaler),每秒计数次数为:4 × 2^Prescaler  / 40 000

这里比较烧脑的就是4 × 2^Prescaler这个计算,如果你需要选取分频系数,建议不要运算,直接用宏定义来选取

例如:

IWDG_Prescaler取值为IWDG_Prescaler_4,IWDG运行频率为:40 000 / 4 = 10 000Hz,即每秒计数10 000次。

IWDG_Prescaler取值为IWDG_Prescaler_8,IWDG运行频率为:40 000 / 8 

IWDG_Prescaler取值为IWDG_Prescaler_16,IWDG运行频率为:40 000 / 16 

IWDG_Prescaler取值为IWDG_Prescaler_32,IWDG运行频率为:40 000 / 32 

以此类推。

0x00023、IWDG_SetReload

    函数名:void IWDG_SetReload(uint16_t Reload)

函数功能:设置 IWDG 重装载值

     参数1:uint16_t Reload —>  0到0x0FFF,表示IWDG计数器要计数的次数

    返回值:无

以上两个函数决定了IWDG的溢出时间,计算公式如下:TimeOut = Reload × 4 × 2^Prescaler  / 40 000

因为在使用看门狗的时候,我们需要根据我们要定时的时间来反推上述函数中的两个不定的参数,这种计算比较麻烦,所以下面我给出一个1S时间基准的例子,根据这个基准调节参数最终得到你想要的时间值

我们选择Reload = 625 ,  Prescaler = IWDG_Prescaler_64 ,定时时间 TimeOut  = 625 ×  64  / 40 000 = 1s

0x00024、IWDG_ReloadCounter

    函数名:void IWDG_ReloadCounter(void)

函数功能:重载IWDG

     参数1:无

    返回值:无

0x00025、IWDG_Enable

    函数名:void IWDG_Enable(void) 

函数功能:使能IWDG,并开启 IWDG_PR 和 IWDG_RLR 寄存器的写保护 

     参数1:无

    返回值:无

0x0003、自行编写的IWDG相关函数

至此,我们启动 IWDG 的整个过程就完成了,下面我们编写一个属于自己的 IWDG 初始化及启动函数

/**
*@brief   初始化独立看门狗
*@param   参数1:prer    分频数:0~7(只有低 3 位有效!)分频因子=4*2^prer.但最大值只能是 256!    
*         IWDG_Prescaler_4:   对40KHz进行4分频
*         IWDG_Prescaler_8:   对40KHz进行8分频
*         IWDG_Prescaler_16:  对40KHz进行16分频
*         IWDG_Prescaler_32:  对40KHz进行32分频
*         IWDG_Prescaler_64:  对40KHz进行64分频
*         IWDG_Prescaler_128: 对40KHz进行128分频
*         IWDG_Prescaler_256: 对40KHz进行256分频
*         参数2:rlr     重装载寄存器值:低 11 位有效.取值范围为0到0x0FFF。
*@return  无
*/
void IWDG_Init(uint8_t prer,uint16_t rlr)
{
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);   //使能对寄存器IWDG_PR和IWDG_RLR的写操作
    IWDG_SetPrescaler(prer);                        //设置IWDG预分频值:设置IWDG预分频值
    IWDG_SetReload(rlr);                            //设置IWDG重装载值
    IWDG_ReloadCounter();                           //按照IWDG重装载寄存器的值重装载IWDG计数器
    IWDG_Enable();                                  //使能IWDG
}

在 IWDG时间内,我们需要周期性调用以下函数进行喂狗

/**
*@brief   喂独立看门狗
*@param   无   
*@return  无
*/
void IWDG_Feed(void)
{
    IWDG_ReloadCounter();                             //重载
}

0x05、源程序下载地址

https://download.csdn.net/download/thebestleo/13192126

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值