独立看门狗与窗口看门狗

本文详细介绍了STM32F10xxx芯片的两种看门狗:独立看门狗IWDG和窗口看门狗WWDG。讲解了它们的工作原理、设置方法、喂狗过程以及中断处理,强调了它们在提高系统安全性和时间精确性方面的应用。
摘要由CSDN通过智能技术生成

一、简介

STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
**独立看门狗(IWDG)**由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。
窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。
WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。

二、独立看门狗

独立看门狗由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍能够有效,所以此狗狗可以工作在与主时钟无关的要求下,或者待机模块下。
独立看门狗一旦开启,只能由MCU复位后才清除,让它不再工作。
独立看门狗的时钟是一个内部RC时钟,它会在30KHZ到60KHZ之间变化,并非是精确的40KHZ,而只是一般计算时取40KHZ。

喂狗时间计算:

1S喂狗所需的计数:40K/(42^预分频值);
喂狗时间=重装载值/1S喂狗所需的计数
例IWDG_Init(4,625); 与分频数4,重载值为625,溢出时间为1s
40K/(4
2^4)=625 625/625=1S

独立看门狗需要设置四个寄存器:

1、预分频寄存器(IWDG_PR),其低三位PR[2:0](Prescaler divider)有效。可设置4、8、16、32、64、128、256多种预分配系数。
**2、重装载寄存器(IWDG_RLR)**低12位RL[11:0]: 用来设置计数器的重装载值。
3、键寄存器(IWDG_KR),用来控制去除IWDG_PR和IWDG_RLR写保护功能以便正常写值。 向此寄存器写入0x5555则暂时去除IWDG_PR和IWDG_RLR的写保护功能才可向两个寄存器中写值;
向此寄存器写入0xAAAA则IWDG_RLR的值会重装载,防止MCU复位;
向此寄存器写入0xCCCC是开启狗立看门狗动作;
**4、状态寄存器(IWDG_SR)**最低两位有效RVU: 看门狗计数器重装载值更新 (Watchdog counter reload value update) 标识位和PVU: 看门狗预分频值更新(Watchdog prescaler value update) 标识位,分别用来指示此时是否可向IWDG_RLR 和 IWDG_PR写值,此寄存器由硬件置1与清0,只有当为0时才可向上面两个寄存器写值。

void IWDG_Init(u8 prer,u16 rlr) 
{	
//向键寄存器(IWDG_KR)写入0x5555使能对寄存器IWDG_PR和IWDG_RLR的写操作 
 	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); 
//设置IWDG预分频值:设置IWDG预分频值为64 	
	IWDG_SetPrescaler(prer);  
	//设置IWDG重装载值
	IWDG_SetReload(rlr);   
//向键寄存器(IWDG_KR)写入0xAAAA,重装载IWDG计数器  
	IWDG_ReloadCounter();  
	//向键寄存器(IWDG_KR)写入0xCCCC是开启狗立看门狗动作
	IWDG_Enable();  //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{   
 	IWDG_ReloadCounter();										   
}

三、窗口看门狗

在这里插入图片描述

窗口看门狗是用APB1总线驱动的,时钟频率最大36MHz。窗口看门狗的有两个值:窗口的上限值,上限值由用户独立设置;窗口的下限值,下限值固定为0X40。
窗口看门狗计数器的值必须在上限值和下限值之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义。
窗口看门狗递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断: CFR 位 9EWI 置 1,则产生提前唤醒中断。

窗口看门狗需要设置三个寄存器:

**1、控制寄存器(WWDG_CR)**中的值必须在0xFF与0xC0之间, 因为它的第0至第6位为递减计数器CNT,在它的第6位变为0时将产生复位,所以在初始化时需要为1。
第7位WDGA是用来设置启动或禁止窗口看门狗的,当为1进才会启动窗口看门狗,所以第6和第7位都需为1,即WWDG_CR 的值需要大于等于0xC0 。
控制寄存器(WWDG_CR)中第7位WDGA(Activation bit)激活位,需用软件来置1,以启动窗口看门狗,并且一旦启动后,只能在复位或重启后由硬件来清0。
2、配置寄存器(WWDG_CFR) 第0至第6位 是设置窗口上限值值用的,只有当递减计数器CNT的值小于边界值时才可以喂狗。
并且7位递减计数器CNT减少到0x3F时即T6位变为0,此时MCU也会复位。
配置寄存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]用来设置时基(Timer base)预分频数。
3、状态寄存器(WWDG_SR) 只用到了第0位,EWIF(Early wakeup interrupt flag )是提前唤醒中断标识,当递减计数器CNT的值到达0X40(若再减少一次则T6位变为0,产生复位)时此位由硬件置1,且需用软件清0,注意无论中断是否使能此位都会被硬件置1。
而提前唤醒中断使能设置是在配置寄存器(WWDG_CFR)第9位EWI(Early wakeup interrupt),此位需由软件置1,则会在当递减计数器CNT的值到达0X40时产生中断,并且与EWIF不同,此位是由硬件清0。
在这里插入图片描述

1、使能 WWDG 时钟
WWDG使用的是 PCLK1 的时钟,需要先使能时钟。
void RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
2设置分频数:配置寄存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]
void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);
3、设置看门狗的窗口上限值:设置窗口值:配置寄存器(WWDG_CFR) 第0至第6位
void WWDG_SetWindowValue(uint8_t WindowValue);
4、开启 WWDG 中断:配置寄存器(WWDG_CFR) 第9位
void WWDG_EnableIT();
5、中断优先级配置,
WWDG_NVIC_Init();
6、设置计数器初始值并使能看门狗:控制寄存器(WWDG_CR) 第0至第7位
void WWDG_Enable(uint8_t Counter);
7、 编写中断服务函数
通过该函数来喂狗,在中断服务函数里将状态寄存器的 EWIF 位清空。

void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{ 
//   WWDG时钟使能	
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  
//设置IWDG预分频值:配置寄存器(WWDG_CFR)的第8位和第7位WDGTB[1:0]
	WWDG_SetPrescaler(fprer);
//设置窗口值:配置寄存器(WWDG_CFR) 第0至第6位
	WWDG_SetWindowValue(wr);	
//使能看门狗 ,设置计数器初值:控制寄存器(WWDG_CR)  第0至第7位               
WWDG_Enable(tr);	 
//状态寄存器(WWDG_SR) 0位   提前唤醒中断标识清零
	WWDG_ClearFlag();    
//初始化窗口看门狗 NVIC
	WWDG_NVIC_Init();
//开启窗口看门狗中断  配置寄存器(WWDG_CFR) 第9位} 
	WWDG_EnableIT(); 
}
//重设置WWDG计数器的值
void WWDG_Set_Counter(u8 cnt)
{
    WWDG_Enable(cnt);	 
}
//窗口看门狗中断服务程序
void WWDG_NVIC_Init()
{
	NVIC_InitTypeDef NVIC_InitStructure;
	//WWDG中断
	NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;    
	//抢占2,子优3,组2
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	 //抢占2,子优先级3,组2
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 
	NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}

void WWDG_IRQHandler(void)
{
	// Update WWDG counter
	WWDG_SetCounter(0x7F);	  //当禁掉此句后,窗口看门狗将产生复位
	// Clear EWI flag */
	WWDG_ClearFlag();	  //清除提前唤醒中断标志位
}
  • 26
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值