【STM32】详解独立看门狗的本质和使用步骤&代码

简介: 【STM32】详解独立看门狗的本质和使用步骤&代码

一、看门狗

1、介绍

作为一个检测装置,发生意外情况能够报告并处理突发意外——复位。

复位中断属于不可屏蔽中断,属于优先级最高的中断

2、作用

两个看门狗(独立看门狗和窗口看门狗)均可用于检测并解决由软件错误导致的故障(程序跑飞);当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。

3、窗口看门狗

指定程序段执行一定的时间范围内时,窗口看门狗能够再设置好后进行监督。


二、独立看门狗

1、独立看门狗(IWDG)的本质

独立看门狗的工作独立于主程序,但是它能监督主程序。本质是一个递减计数器,由LSI提供时钟驱动。设置一个看门的计时时间(计数脉冲个数),看门狗会开始倒计时,看门狗计数器倒计数到0,系统复位。

以上前提如何实现监督呢?

让正常运行的主程序定时喂狗——重置看门计数器的值。

如果主程序跑飞/崩溃,没有人喂狗,看门狗就会倒计时到0,直接复位。

2、流程

启动看门狗:对密钥寄存器(IWDG_KR)写入0xCCCC

重载计数器,避免看门狗复位(喂狗):对密钥寄存器(IWDG_KR)写入0xAAAA

IWDG_PR和IWDG_RLR寄存器具有写保护,若要修改寄存器,则对密钥寄存器(IWDG_KR)写入0x5555

3、独立看门狗框图

IWDG_PR分频系数选择:

4、独立看门狗的使用

需要控制的寄存器有:


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

IWDG独立看门狗操作库函数

void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR
void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
void IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
void IWDG_Enable(void);//使能看门狗:写0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新

独立看门狗的操作步骤

①取消寄存器写保护(向 IWDG_KR 写入 0X5555 ):

IWDG_WriteAccessCmd();


通过这步,取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器,设置 IWDG_PR 和 IWDG_RLR 的值。

这在库函数中的实现函数是: IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

开启/取消写保护,也就是使能/失能写权限

② 设置独立看门狗的预分频系数,确定时钟:

IWDG_SetPrescaler();

设置看门狗的分频系数的函数是:

//设置 IWDG 预分频值

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

设置看门狗的重装载值的函数是:

//设置 IWDG 重装载值

void IWDG_SetReload(uint16_t Reload);

设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂时间(也就是看门狗溢出时间) ,该时间的计算方式为(以时钟40KHZ计算):

Tout=((4×2^prer) ×rlr) /40

Tout 为看门狗溢出时间(单位为 ms);prer为看门狗时钟预分频(IWDG_PR 值),范围为 0~7;rlr 为看门狗的重装载值(IWDG_RLR 的值) ;我们设定 prer 值为 4, rlr 值为 625, 那么就可以得到 Tout=64×625/40=1000ms, 这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位。

注意:看门狗的时钟频率并不是确定不变的40KHZ(而是在 15~47Khz 之间的一个可变化的时钟),必须控制好大概复位时间。

③ 设置看门狗重装载值,确定溢出时间:

IWDG_SetReload();


库函数里面重载计数值的函数是:

//按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

IWDG_ReloadCounter();

通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。即实现独立看门狗的喂狗操作。


④ 使能看门狗

IWDG_Enable();


库函数里面启动独立看门狗的函数是:

IWDG_Enable(); //使能 IWDG

这函数用来启动 STM32F4 的看门狗。

注意 IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的话,就不要去打开它,免得麻烦。


⑤ 应用程序喂狗:

IWDG_ReloadCounter();


溢出时间计算:

Tout=((4×2^prer) ×rlr) /32 (M4)

5、初始化示例代码

void IWDG_Init()
{
  //开启IWDG_PR 寄存器和IWDG_RLR寄存器写权限
  //IWDG->KR = 0x5555;
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  
  //设置预分频系数  LSI---32Khz
//  IWDG->PR &= ~0x07;
//  IWDG->PR |= 0x03;
  IWDG_SetPrescaler(IWDG_Prescaler_32);
  
  //设置RLR-ARR  CNT
  //IWDG->RLR = 500-1;//10ms看门超时时间
  IWDG_SetReload(500-1);
  
  //先喂狗一次  让CNT从RLR拿到初值
  //IWDG->KR = 0xAAAA;
  IWDG_ReloadCounter();
  
  //使能看门
  //IWDG->KR = 0xCCCC;
  IWDG_Enable();

} 
相关文章
|
6月前
【STM32】基于HAL库的360度编码器、摇杆代码编写
【STM32】基于HAL库的360度编码器、摇杆代码编写
|
4月前
|
芯片
stm32f407探索者开发板(二十)——独立看门狗实验
stm32f407探索者开发板(二十)——独立看门狗实验
300 0
|
5月前
|
存储 数据安全/隐私保护 芯片
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
【STM32】详解嵌入式中FLASH闪存的特性和代码示例
|
5月前
|
传感器 数据格式
【STM32】DHT11温湿度模块传感器详解&代码
【STM32】DHT11温湿度模块传感器详解&代码
|
6月前
|
传感器
STM32循迹小车原理介绍和代码示例
STM32循迹小车原理介绍和代码示例
|
6月前
STM32控制SG90舵机原理及代码
STM32控制SG90舵机原理及代码
183 1
|
6月前
stm32f4外设学习篇(代码集合)(三)
stm32f4外设学习篇(代码集合)
120 0
|
6月前
stm32f4外设学习篇(代码集合)(二)
stm32f4外设学习篇(代码集合)
|
6月前
|
芯片
stm32f4外设学习篇(代码集合)(一)
stm32f4外设学习篇(代码集合)
144 0
|
6月前
STM32--WDG看门狗
STM32--WDG看门狗
101 0