HAL库 + STM32看门狗(IWDG/WWDG)

一.独立看门狗(IWDG)

1.IWDG简介

  • IWDG本质上是一个12位的递减经济暑期,计数器从初始值一直减到0是,系统会产生一个复位信号,CPU接收到这个信号后,会重新启动系统。
  • 在计数器减到0之前,如果通过程序给他喂一次食物 “喂狗”,那么就不会产生复位信号,系统也将正常运行。

2.IWDG配置所需函数

HAL_IWDG_Init()        //初始化函数
HAL_IWDG_Refresh()     //喂狗函数

3.IWDG溢出时间计算

  • Tout:看门狗溢出时间
  • Fiwdg:看门狗的时钟频率
  • psc:看门狗预分频系数
  • rlr:看门狗装载值
  • 看门狗的超时时间(40kHz的输入时钟(LSI))

 例:算出1秒

1s = 1250 * 32/40

二.窗口看门狗

1.WWDG简介

窗口看门狗的本质是一个能传声复位信号和提前唤醒中断的计数器。

产生复位条件:

  • 递减计数器从0X40减到0X3F是复位。
  • 计数器的值大于W[6:0]值喂狗会复位

产生中断条件

  • 当递减计数器等于0X40时可产生提前唤醒中断

2.WWDG所需函数

HAL_WWDG_Init();                        //初始化  
HAL_WWDG_MspInit();     
__HAL_RCC_WWDG_CLK_ENABLE();           //时钟开启函数
HAL_NVIC_SetPriority();                //中断优先级函数
HAL_NVIC_EnableIRQ();                  //启动中断函数
WWDG_IRQHandler();                     //中断服务函数
HAL_WWDG_EarlyWakeupCallback();        //提前唤醒和回调函数
HAL_WWDG_Refresh();                    //喂狗

3.WWDG溢出时间计算

窗口看门狗的时序图

这里使用的是F1系列所以用的是APB1 = 36Mhz,如果用其他系列的根据手册计算。

从0X3F开始到0X7F最多可以计数64个数。

例如,计数器的值为0X7F(127),窗口的值设置为0X50(80)。 127-80 = 47,计47个数

超时时间计算:(4096 * 2^3 *47) / 32 = 42.7ms;

4.WWDG配置步骤

5.窗口看门狗喂狗实验

实验目的:

开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X50 ,预分频系数为 8 。在 while 循环里喂狗, 同时翻转 LED1 状态;在提前唤醒中断服务函数进行喂狗,同时翻转 LED2 状态

wwdg.c

#include "wwdg.h"
#include "led.h"

WWDG_HandleTypeDef wwdg_handler = {0};

//设置预分频系数,重装载值,及窗口值
void wwdg_init(uint8_t TR,uint8_t wr,uint32_t psc)
{
	wwdg_handler.Instance = WWDG;
	wwdg_handler.Init.Prescaler = psc;
	wwdg_handler.Init.EWIMode = WWDG_EWI_ENABLE;
	wwdg_handler.Init.Counter = TR;					//计数器的值
	wwdg_handler.Init.Window = wr;					
	HAL_WWDG_Init(&wwdg_handler);
}

//MSP初始化
void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg)
{
	__HAL_RCC_WWDG_CLK_ENABLE();
	HAL_NVIC_SetPriority(WWDG_IRQn,2,2);
	HAL_NVIC_EnableIRQ(WWDG_IRQn);
}

//中断服务函数
void WWDG_IRQHandler(void)
{
	HAL_WWDG_IRQHandler(&wwdg_handler);
}

//提前唤醒回调函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
	led2_toggle();
}

/*喂狗函数*/
void wwdg_feed(void)
{
	HAL_WWDG_Refresh(&wwdg_handler);
}

wwdg.h

#ifndef __WWDG_H__
#define __WWDG_H__

#include "sys.h"

void wwdg_init(uint8_t TR,uint8_t wr,uint32_t psc);
void wwdg_feed(void);
#endif 

实验结果

  • 超时时间:(4096 * 2^3 *47) / 32 = 42.7ms;
  • 1.在main.c的while循环中当delay_ms设置为43毫秒时,程序正常运行。

  • 2.设置为42毫秒时,程序一直重启,实验完成。

三.窗口看门狗和独立看门狗的区别

对比点独立看门狗窗口看门狗
时钟源独立时钟LSI(40KHz),不精确PCLK1(36MHZ),精确
复位条件递减计数到0窗口期外喂狗或减到0X3F
中断计数器减到0x40可产生中断
递减计数器位数12位(最大计数范围:4096~0)7位(最大计数范围:127~63)
喂狗方式写入键寄存器,重装固定值RLR直接写入计数器,写多少重装多少
应用场合防止程序跑飞,死循环,死机检测程序时效,防止软件异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走下去-别回头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值