STM32 HAL库 看门狗

STM32之CubeL4独立看门狗


一 看门狗简介

在单片机的正常工作时常常会收到各种各样的干扰,造成程序的跑飞,而陷入死循环。或者应为代码出现bug,导致程序会进入死循环或者进入 HardFault_Handler 导致无法正常工作,看门狗的作用就是为了防止因为某种原因,导致程序发生意外的时候,能重新回复到系统刚上电状态,保障系统出问题的时候可以自动重启一次。
通俗一点的来说就是当系统出问题的时候,可以通过看门狗来自动复位。

独立看门狗的本身就是12 位递减定时器,最大计数0XFFF,当使能计数器之后就一直在递减,重新写入计数器的值,来清除计数器这就是喂狗操作。
当计数器计数从设定值(窗口值)递减到零时,会产生一个复位信号,来对单片机进行复位。
如果在一定时间内没有喂狗,就表明程序已经跑飞,或已经进入死循环,看门狗此时会自动实现便实现重启复位。


二 STM32内部看门狗

STM32内置两个看门狗。独立看门狗、窗口看门狗可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。

  • Independent watchdog (IWDG)
    独立看门狗由专用的低速时钟(LSI)驱动(40kHz),即使主时钟发生故障它仍有效。独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。

  • System window watchdog (WWDG)
    窗口看门狗由从APB1时钟(36MHz)分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。 窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

两个狗的区别

  • 独立看门狗没有中断,窗口看门狗有中断
  • 独立看门狗有硬件和软件,窗口看门狗只能软件控制
  • 独立看门狗只有下限,窗口看门狗有下限和上限
  • 独立看门狗是12位递减的。窗口看门狗是7位递减的
  • 独立看门狗是用的内部的大约40KHZ RC振荡器,窗口看门狗是用的系统时钟APB1ENR

1. 独立看门狗(IWDG)

独立看门狗(IWDG)没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位。
独立看门狗可以是硬件使能或软件使能,硬件使能是通过设置选择字节配置,软件使能是通过软件设置寄存器位配置。

  • 硬件使能的看门狗,在系统上电之后就开始工作,一旦开始工作就没有办法让它停止工作;而软件使能的看门狗,只有在设置了相应的寄存器位后才能开始工作,看门狗一旦启动将不能被停止,除非 MCU 复位!
  • 如果启用了硬件使能,必须通过擦除相应的选择字节位关闭硬件看门狗功能,这时看门狗的功能可以通过软件使能。

一旦开启了硬件看门狗,那么就停不下来了,软件看门狗只需要设置 密钥寄存器IWDG->KR=0XCCCC;就可以启动看门狗了,软件狗可以在系统复位时关掉,如果在在初始化里开启软件看门狗,那就开启了软件看门狗

2.窗口看门狗(WWDG)

窗口看门狗(WWDG)有中断,这个中断的作用是在计数器达到下限 W[6:0] 的时候,产生中断,让你喂狗,如果你不喂狗,计数器的值变为 0x3f 的时候,将会产生系统复位。即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减一也会变成0x3f产生复位,这个时间根据芯片手册的公式进行计算即可得到,窗口看门狗只有软件开启方式,还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了,这个值小于计数器的初始值得时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器,意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。
在这里插入图片描述

三、IWDG配置

在这里插入图片描述
在这里插入图片描述
这里使用的是STM32L431RC 看门狗时钟是32KHz

在这里插入图片描述
IWDG counter clock prescaler 预分频器值设为 256
IWDG window value 串口值设为 4080
IWDG down-counter reload value 重装载寄存器值设为 4080

超出(溢出)时间计算:

Tout = ( 4 * 2^prv ) * rlv / LSI

单位毫秒;prv:预分频寄存器值;rlv:重装值,LSI 取 32(单位 kHz)

LSI 为 32 KHz,当 prv 取 IWDG_ PRESCALER_256 ,rlv 取 4080时,Tout=256/32*4080=32.64s。

在这里插入图片描述

独立看门狗函数库

看门狗初始化函数

	HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg)

喂狗函数

	HAL_IWDG_Refresh(&hiwdg);//喂狗

定时喂狗即可

低功耗问题

在做低功耗的时候问题,stm32一旦开启看门狗,就关不了,进入低功耗后,由于没有喂狗操作导致单片机复位,不使用看门狗非常危险。
一个方式是在休眠模式下通过RTC定时唤醒来喂狗,喂完狗立刻进入休眠模式。可以很好的解决这个问题,但是随之而来的就是功耗的增加,目前还不知道有没有其他解决方案。

// Core\Src\stm32l4xx_it.c
void RTC_WKUP_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_WKUP_IRQn 0 */

  /* USER CODE END RTC_WKUP_IRQn 0 */
  HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_WKUP_IRQn 1 */
  
	if(HAL_IWDG_Refresh(&hiwdg)!=HAL_OK)	//喂狗	
	{
		Error_Handler();
	}	
	
	MCU_EnterSTOPMode();		//进入STOP模式
	
  /* USER CODE END RTC_WKUP_IRQn 1 */
}

在RTC中断里进行喂狗并进入低功耗

文献连接

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值