> 文章列表 > STM32学习(十)

STM32学习(十)

STM32学习(十)

WWDG

Window watchdog,窗口看门狗。
本质:能产生系统复位信号和提前唤醒中断的计数器

  1. 递减的计数器
  2. 当递减计数器值从0x40减到0x3F时复位(从64减到63)(即T6位跳变到0)
  3. 当计数器的值大于W[6:0]值时喂狗会复位
  4. 提前唤醒中断(EWI):当递减计数器减到0x40时可产生中断
  5. 喂狗:在窗口期内重装载计数器的值,防止复位。

作用:用于监测单片机程序运行时效是否精准,主要检测软件异常。
应用:需要精准监测程序运行时间的场合。

WWDG工作原理

STM32学习(十)

  • 计数器最大初始值为:127(0x7f)
  • 在计数器初始值~窗口上限值这一区间(非窗口期)喂狗,会产生复位,所以只能减。
  • 减到64(固定值)时,可产生中断。
  • 减到63(固定值),窗口下限值,产生复位。
  • 窗口上限值到窗口下限值这一区间,称为窗口期,可以喂狗,不会产生复位。

W[6:0]≥窗口期>0x3F

窗口上限值W[6:0]必须大于窗口下限值63,否则无窗口期,系统一直复位。
STM32学习(十)

时钟源:
F103:PCLK1(36MHz)
F407:PCLK1(42MHz)
F429:PCLK1(45MHz)
F767:PCLK1(54MHz)
H743:PCLK3(100MHz)

WWDG寄存器

控制寄存器(WWDG_CR)
STM32学习(十)
用于使能窗口看门狗,以及重装载计数器值(即喂狗,直接写寄存器即可)。

配置寄存器(WWDG_CFR)
STM32学习(十)
使能窗口看门狗提前唤醒中断,设置预分频系数,设置窗口上限值。

状态寄存器(WWDG_SR)
STM32学习(十)
用于判断是否发生了WWDG提前唤醒中断。

WWDG超时时间计算

STM32学习(十)
Tout是WWDG超时时间(没喂狗)
Fwwdg是WWDG的时钟源频率
4096是WWDG固定的预分频系数
2^WDGTB是WWDG_CFR寄存器设置的预分频系数值
T[5:0]是WWDG计数器低6位

STM32学习(十)

WWDG配置步骤

  1. WWDG工作参数初始化:HAL_WWDG_Init()
  2. WWDG Msp初始化:HAL_WWDG_MspInit(),配置NVIC、CLOCK等
  3. 设置优先级,使能中断:HAL_NVIC_SertPriority()、HAL_NVIC_EnableIRQ()
  4. 编写中断服务函数WWDG_IRQHandler()->HAL_WWDG_IRQHandler()
  5. 重定义提前唤醒回调函数HAL_WWDG_EarlyWakeupCallback()
  6. 在窗口期内喂狗HAL_WWDG_Refresh()

STM32学习(十)

typedef struct
{uint32_t Prescaler; //预分频系数uint32_t Window;//窗口上限值uint32_t Counter; //计数值uint32_t EWIMode;//提前唤醒中断使能	
}WWDG_InitTypeDef;
typedef struct
{WWDG_TypeDef *Instance; //WWDG寄存器基地址WWDG_InitTypeDef Init; //WWDG初始化参数
}WWDG_HandleTypeDef;

验证窗口看门狗功能

预设:计数器值0x7F(127),窗口值0x5F(95),预分频系数为8。
STM32学习(十)

  • 初始化窗口看门狗后29.13ms内不能喂狗,否则自动复位。
  • 初始化窗口看门狗后过了58.25ms还没有喂狗,就会自动复位。