嵌入式系统开发【深入浅出】 IWDG 与 WWDG

 目录

简介

IWDG

工作流程:

键寄存器(IWDG_KR)【w  KEY[15:0]】

预分频寄存器(IWDG_PR)【rw  [2:0]】

重装载寄存器(IWDG_RLR)【rw  [11:0]】

状态寄存器(IWDG_SR)【r  [1:0]】

 IWDG 配置函数

WWDG

工作流程:

条件复位

IWDG与WWDG的区别:

IWDG和WWDG的相同点:


  1. 简介

    1. 独立看门狗和窗口看门狗都可用来检测和解决由软件错误引起的故障;当计数器达到给 定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
    2. IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精 度要求较低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
    3. 简单来说,看门狗属于定时器资源,可以检测程序是否异常, 可以帮助人们重启系统
  2. IWDG

    1. 工作流程:
    2. 通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减
      到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET,如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。【IWDG 属于单片机内部资源,某些芯片没有集成了看门狗,需要自行添加】
    3. 键寄存器(IWDG_KR)【w  KEY[15:0]】
      1. 写0XAAAA    把 RLR 的值重装载到 CNT 【喂狗】
      2. 写0X5555     使PR 和 RLR 这两个寄存器可写
      3. 写0XCCCC   启动 IWDG
      4. 一旦独立看门狗启动,它就关不掉,只有复位才能关掉。
    4. 预分频寄存器(IWDG_PR)【rw  [2:0]】
      1. 独立看门狗的时钟由独立的 RC 振荡器 LSI 提供,即使主时钟发生故障它仍然有效
      2. 预分频系数越大, 频率越小
    5. 重装载寄存器(IWDG_RLR)【rw  [11:0]】
      1. 计数值的范围:0 ~ 4095
      2. 超时时间 Tout = (prv)Hz / 40KHz * (rlv),prv 是预分频器寄存器的值,rlv 是重装载寄存器的值
    6. 状态寄存器(IWDG_SR)【r  [1:0]】
      1. RVU:看门狗计数器重装载值更新
      2. PVU: 看门狗预分频值更新
    7.  IWDG 配置函数

      /*
           TODO 在功能模块中
      	 IWDG 配置函数有两个形参
      	 prv 用来设置预分频值 可以为IWDG_Prescaler_4、IWDG_Prescaler_8等 
      	 rlv 用来设置重加载值  ----> 初始值
      */
      void IWDG_Configuration(uint8_t prv ,uint16_t rlv)
      {
              // 使能 预分频寄存器 PR 和重装载寄存器 RLR 可写
      		IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
      		IWDG_SetPrescaler(prv);			// 设置预分频器值
      		IWDG_SetReload(rlv);			// 设置重装载寄存器值
      		IWDG_ReloadCounter();			// 把重装载寄存器的值放到计数器中
      		IWDG_Enable();					// 使能 IWDG
      }
      
      /*
           喂狗函数:把重装载寄存器的值放到计数器中,喂狗,防止 IWDG 复位
                    当计数器的值减到 0 的时候会产生系统复位
      */
      void IWDG_Feed(void)
      {
      		IWDG_ReloadCounter();
      }
      
      
      
      /*
          TODO 在main模块中
          先检查  IWDG_Check();
          后配置  IWDG_Configuration(IWDG_Prescaler_64 ,625);
      */
      /* 检查是否为独立看门狗复位 */
      void IWDG_Check(void)
      {
      		if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET){
      				/* 独立看门狗复位 */
      
      				// 工作内容
                      // ....
      				RCC_ClearFlag();	// 清除标志 
      				/*如果一直不喂狗,会一直复位 | 在 1s 时间内喂狗 */
      		}else{
      				/*不是独立看门狗复位(可能为上电复位或者手动按键复位之类的) */
      
      				// 工作内容
                      // ....
      		}
      }
      
  3. WWDG

    1. 工作流程:
    2. 窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值 0X40 时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方,不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义
    3. 条件复位
      1. 当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。
      2. 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。
    4. 如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可 以被用于重装载计数器以避免WWDG复位。
    5. 等。【IWDG常用】
  4. IWDG与WWDG的区别:

    1. 时钟源不同
      1. IWDG 的时钟源LSI 40KHz
      2. WWDG 的时钟源由APB1 分频后得到
    2. 产生的中断不同
      1. IWDG 不会产生中断信号, 只要触发IWDG, 直接重启系统
      2. WWDG 是有中断的,当计数器达到超时时间可以产生中断信号 
    3. 计数值的范围不同
      1. IWDG 使用了12b的计数器
      2. WWDG 使用了7b的计数器 
    4. 喂狗的范围不同
      1. IWDG 只要在计数器计到0之前, 任意时间都可以喂狗 
      2. WWDG 喂狗存在上阙值和下阙值(0x40)
  5. IWDG和WWDG的相同点:

    1. IWDG和WWDG 都属于STM32提供的外设资源
    2. 当程序跑飞或者设备死机的时候,都可以使系统复位 
    3. 可以自行调节喂狗的时间 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值