stm32看门狗

STM32 有两个看门,一个是独立看门狗,一个是窗口看门狗.这里先说独立看门狗.

独立看门狗的特性是,要利用片内的40k RC振荡器作为时钟据(说这个RC是相当的不准),优点就是,即使CPU主晶振
停了,即使CPU进入了休眠模式,狗也可以生效.当CPU进入休眠模式,并且是深度休眠的时候,这个看门狗可以作为一个CPU 的定时唤醒闹钟,以达到超低功耗的同时还会定时醒来.看门狗由于最大可以分频到256,看门狗定时器最大可以设置到0xfff,所以最最长的喂狗时间是26秒.....用于CPU的唤醒恰到好处。

用户手册:

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

16.2
IWDG主要性能
●自由运行的递减计数器
●时钟由独立的RC振荡器提供(可在停止和待机模式下工作)
●看门狗被激活后,则在计数器计数至0x000时产生复位
16.3
IWDG功能描述
图153为独立看门狗模块的功能框图。
在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗;此时计数器开始从其复位值0xFFF递减计数。当计数器计数到末尾0x000时,会产生一个复位信号(IWDG_RESET)。
无论何时,只要键寄存器IWDG_KR中被写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中从而避免产生看门狗复位 。

 

void IWDG_Configuration(void)
{
 /* 写入0x5555,用于允许狗狗寄存器写入功能 */
 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
 
 /* 狗狗时钟分频,40K/256=156HZ(6.4ms)*/
 IWDG_SetPrescaler(IWDG_Prescaler_256);
 
 /* 喂狗时间5s/6.4MS=781 .注意不能大于0xfff*/
 IWDG_SetReload(781);
 
 /* 喂狗*/
 IWDG_ReloadCounter();
 
 /* 使能狗狗*/
 IWDG_Enable();
}

#include "STM32Lib\\stm32f10x.h"
#include "hal.h"


int main(void)
{
 ChipHalInit();   //片内硬件初始化
 ChipOutHalInit();  //片外硬件初始化

 if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)!=RESET)

{

LED2_ON;

RCC_ClearFlag();

}

/*如果上次的复位是看门复位的话LED2点亮*/
 LED1_ON;
 SysTickDelay(500);
 LED1_OFF;
 /*闪LED1 5秒后没喂狗将自动复位LED1又闪LED2亮*/
 IWDG_Enable();   //启动看门狗,自动就会使能内部的40K
 
 
 for(;;)
  {
            if(GET_LEFT())
            {
            IWDG_ReloadCounter(); //手动喂狗
            }
  }
 
}


WWDG简介
窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
17.2
WWDG主要特性
●可编程的自由运行递减计数器
●条件复位
─当递减计数器的值小于0x40,(若看门狗被启动)则产生复位。
─当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。见图155。
●如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免WWDG复位。

如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’),并且当7位(T[6:0])递减计数器从0x40翻转到0x3F(T6位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,也将产生一个复位。应用程序在正常运行过程中必须定期地写入WWDG_CR寄存器以防止MCU发生复位。只有当计数器值小于窗口寄存器的值时,才能进行写操作。储存在WWDG_CR寄存器中的数值必须在0xFF和0xC0之间:
●启动看门狗 在系统复位后,看门狗总是处于关闭状态,设置WWDG_CR寄存器的WDGA位能够开启看门狗,随后它不能再被关闭,除非发生复位。
●控制递减计数器 递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门狗被启用时,T6位必须被设置,以防止立即产生一个复位。 T[5:0]位包含了看门狗产生复位之前的计时数目;复位前的延时时间在一个最小值和一个最大值之间变化,这是因为写入WWDG_CR寄存器时,预分频值是未知的。 配置寄存器(WWDG_CFR)中包含窗口的上限值:要避免产生复位,递减计数器必须在其值小于窗口寄存器的数值并且大于0x3F时被重新装载,图155描述了窗口寄存器的工作过程。另一个重装载计数器的方法是利用早期唤醒中断(EWI)。设置WWDG_CFR寄存器中的WEI位开启该中断。当递减计数器到达0x40时,则产生此中断,相应的中断服务程序(ISR)可以用来加载计数器以防止WWDG复位。在WWDG_SR寄存器中写’0’可以清除该中断。

看这么多7788的肯定晕直接看代码:

这个就是窗口看门狗的例程了,窗口看门狗的特性:

喂狗太快—复位,喂狗太慢—复位.迟了喂狗,还可以有中断.WWDG_IRQHandler

#include "STM32Lib\\stm32f10x.h"


void WWDG_Configuration(void)
{
 /* 窗口看门狗时钟允许 */
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
 
 /* 看门狗节拍 =(36M/4096)/8 = 1098 Hz就是说一秒钟计数器减1098下*/
 WWDG_SetPrescaler(WWDG_Prescaler_8);
 
 /* 窗口值用0x42就是说计数器满是0x7f在减到0x42之前喂狗了就算喂早了-复位*/
 WWDG_SetWindowValue(0x42);
 
 /*看门狗使能并初始化定时器为0x7f最大就是0x7f计数器减到到0x3F(T6位清零)时,则产生一个复位*/
 WWDG_Enable(0x7F);
 
 /* Clear EWI flag 清中断标记*/
 WWDG_ClearFlag();
 
 /* 使能 EWinterrupt这个会在计数器减到0x40的时候产生一个"死前"中断 当然你也可以在这个中断里赶紧

喂狗-省的狗咬你(复位)*/
 WWDG_EnableIT();
}

 

/*******************************************************************************
* Function Name  : WWDG_IRQHandler”死"前中断
* Description    : This function handles WWDG interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
extern bool Feed_Dog;
void WWDG_IRQHandler(void)
{
 static u8 led2=0;
 
 /* 喂狗 */
 if(Feed_Dog==TRUE)
 {
  WWDG_SetCounter(0x7F);
  Feed_Dog=FALSE;
 }
 
 /* 清中断标志*/
 WWDG_ClearFlag();
   
 //每进入此中断,LED2翻转一次
 if(led2)
 {
  LED2_OFF;
  led2=0;
 }
 else
 {
  LED2_ON;
  led2=1;
 }
}

 /**********由于喂狗太早也会复位所以 就在“死”前中断喂狗了

for(;;)
 {
 
  if(GET_LEFT())  //按左键,则系统长时间等待,也就是不喂狗!
  {
   SysTickDelay(1000);
  }
  Feed_Dog=TRUE;
  if(GET_RIGHT())   //按右键则频繁喂狗
  {
   WWDG_SetCounter(0x7F);
  }
 }//按键左右的后果都是复位,不按的话会在“死”前中断【WWDG_IRQHandler】中及时喂狗LED2不停的闪

以一般的情况说,这个“死”前中断中断里面不应该
喂狗的,而是应该做系统临死前的一些工作,例如保存重要数据之类.

***************************************************************************/

电子白菜曰"STM32芯片内的BUG,至少是我手上那片CPUBUG.就是:初始
化窗口狗中断前,必须要有片内外设被允许,例如允许GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
只有允许了一个片内外设,再初始化窗口狗中断(NVIC_Configuration()),窗口狗中断才有
.你可以试试在RCC配置后就马上运行NVIC_Configuration(),之后再初始化GPIO,那么窗
口狗的中断WWDG_IRQHandler就不会进入了,对于我这个程序,就不会喂狗,结果系统就不停被复位.如果其他
CPU
也有这个情况,那么这个可以肯定就是STM32芯片的BUG.”

颠倒着两句话的顺序就可以了。

我的STM32 103VC T6也是,这个在勘误表中可以查到。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32看门狗(Watchdog)是一种硬件机制,用于监测程序是否正常运行。如果程序发生死循环或者挂起等异常情况,看门狗会在一定时间内未收到喂狗信号时,自动重启系统,确保系统能够正常运行。 下面是使用STM32看门狗的步骤: 1. 配置看门狗定时器 通过设置看门狗计数器(IWDG_PR)和重载值(IWDG_RLR)来配置看门狗定时器。这里以STM32F103为例,设置看门狗定时器时钟为40KHz,重载值为625,则看门狗定时器的定时时间为625/40KHz=15.625ms。 ```c RCC->APB1ENR |= RCC_APB1ENR_IWDGEN; // 使能看门狗时钟 IWDG->KR = 0x5555; // 开始寄存器操作 IWDG->PR = 4; // 分频系数为256,时钟为40KHz IWDG->RLR = 625; // 设置重载值,定时时间为15.625ms IWDG->KR = 0xAAAA; // 操作完成 ``` 2. 喂狗 在程序正常运行时,需要定期喂狗,以避免看门狗的复位。喂狗的方法是向看门狗喂狗寄存器(IWDG_KR)写入0xAAAA,然后再写入0x5555。 ```c IWDG->KR = 0xAAAA; // 喂狗 IWDG->KR = 0x5555; ``` 3. 启动看门狗 配置好看门狗定时器和喂狗后,需要启动看门狗,使其开始工作。启动看门狗的方法是向看门狗控制寄存器(IWDG_KR)写入0xCCCC。 ```c IWDG->KR = 0xCCCC; // 启动看门狗 ``` 4. 处理看门狗超时复位 在程序运行过程中,需要处理看门狗超时复位,以避免程序出现死循环或挂起等异常情况。当看门狗定时器到达重载值时,会自动触发复位,导致系统重启。程序需要在重启后重新初始化系统,并处理异常情况。 ```c if (RCC->CSR & RCC_CSR_IWDGRSTF) { // 判断是否是看门狗复位 RCC->CSR |= RCC_CSR_RMVF; // 清除复位标志位 // 处理异常情况 ... } ``` 以上就是STM32看门狗的使用步骤。需要注意的是,在配置看门狗时,要确保看门狗的定时时间足够长,以保证程序能够正常运行。另外,在程序中也要定期喂狗,以避免看门狗的复位。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值