STM32F767--->看门狗

WATCHDOG在系统起到非常重要的作用,相当于系统警察,当系统发生严重错误(如程序进入死循环等)不能 恢复的时候,WATCHDOG能够让系统重启。WATCHDOG的应用主要是在嵌入式操作系统中,避免了系统在无人干预时长时间挂起的情况。

独立看门狗(IWDG)

STM32F767 的独立看门狗由内部专门的 32Khz 低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。看门狗对于时间精度要求不高,所以时钟也没有那么精准。

相关寄存器

键值寄存器 IWDG_KR

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

IWDG_PR 和 IWDG_RLR

 IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。

分频寄存器 IWDG_PR

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

重装载寄存器

该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的
在这里插入图片描述

使用过程

1.取消寄存器写保护,设置看门狗预分频系数和重装载值

首先必须取消IWDG_PRIWDG_RLR寄存器的写保护,这样才可以设置寄存器
IWDG_PRIWDG_RLR的值。取消写保护和设置预分频系数以及重装载值在 HAL 库中是通过函数 HAL_IWDG_Init 实现的。该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg);

该参数是 IWDG_HandleTypeDef 结构体指针类型。结构体 IWDG_HandleTypeDef 定义:

typedef struct
{
	IWDG_TypeDef *Instance;
	IWDG_InitTypeDef Init; 
}IWDG_HandleTypeDef

成员变量 Instance 用来设置看门狗寄存器基地址,实际上在 HAL 库中已经通过标识符定义了,这里对于独立看门狗直接设置为标识符 IWDG 即可。
成员变量 Init 是一个 IWDG_InitTypeDef 结构体类型,该结构体只有 3 个成员变量,分别用来设置独立看门狗的预分频系数,重装载值以及窗口值,定义如下

typedef struct
{
	uint32_t Prescaler; //预分频系数
	uint32_t Reload; //重装载值
	uint32_t Window; //窗口值
}IWDG_InitTypeDef;

HAL_IWDG_Init 函数使用的一般方法为:

IWDG_HandleTypeDef IWDG_Handler; //独立看门狗句柄
IWDG_Handler.Instance=IWDG; //独立看门狗
IWDG_Handler.Init.Prescaler=IWDG_PRESCALER_64; //设置 IWDG 分频系数
IWDG_Handler.Init.Reload=500; //重装载值
IWDG_Handler.Init.Window=IWDG_WINDOW_DISABLE;//关闭窗口功能
HAL_IWDG_Init(&IWDG_Handler); 

上面程序的作用是初始化 IWDG,设置分频系数为 64,重装载值为500,同时关闭窗口功能。
        Tout=((4×2^prer) ×rlr) /32
  Tout 为看门狗溢出时间(单位为 ms);
  prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7;
  rlr 为看门狗的重装载值(IWDG_RLR 的值);
如上设定
prer 值为 4(4 代表的是 64 分频,HAL 库中可以使用宏定义标识符IWDG_PRESCALER_64),
rlr 值为 500,那么就可以得到 Tout=64×500/32=1000ms,
 这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。看门狗的时钟不是准确的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

2.重载计数值喂狗(向 IWDG_KR 写入 0XAAAA)

在 HAL 中重载计数值的函数是 HAL_IWDG_Refresh,该函数声明为:

HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg);

该函数有一个入口参数为前面讲解的 IWDG_HandleTypeDef 结构体类型指针,它的作用是把值0xAAAA写入到IWDG_KR寄存器,从而触发计数器重载,即实

3.启动看门狗(向 IWDG_KR 写入 0XCCCC)

HAL 库函数里面启动独立看门狗是通过宏定义标识符来实现的:

#define __HAL_IWDG_START(__HANDLE__) 
 WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE);

所以我们只需要调用宏定义标识符__HAL_IWDG_START 即可实现看门狗使能。实际上,当我们调用了看门狗初始化函数 HAL_IWDG_Init 之后,在内部会调用该标识符来实现看门狗启动。

窗口看门狗(WWDG)

窗口看门狗的超时公式如下:
      Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG 超时时间(单位为 ms)
Fpclk1:APB1 的时钟频率(单位为 Khz)
WDGTB:WWDG 的预分频系数
T[5:0]:窗口看门狗的计数器低 6 位

相关寄存器

附录

独立看门狗和窗口看门狗的比较

在这里插入图片描述

独立看门狗程序

#include "iwdg.h"
#include "sys.h"

IWDG_HandleTypeDef IWDG_Handler; //独立看门狗句柄

//初始化独立看门狗
//prer:分频系数0~7(只有低3位有效)分频倍数=(4×2^prer)最大值256
//rlr:自动重装载值,0~0XFFF,低11位有效
//时间的计算:Tout=((4*2^prer)*rlr)/32 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_Handler.Instance=IWDG;
    IWDG_Handler.Init.Prescaler=prer;    //设置分频系数
    IWDG_Handler.Init.Reload=rlr;        //重装载值
    IWDG_Handler.Init.Window=IWDG_WINDOW_DISABLE;//关闭窗口功能
    HAL_IWDG_Init(&IWDG_Handler);    
}
    
//喂狗
void IWDG_Feed(void)
{   
    HAL_IWDG_Refresh(&IWDG_Handler); //重装载值
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值