标题: STM32看门狗操作 [打印本页]
作者: kevinkwok 时间: 2018-7-4 21:50
标题: STM32看门狗操作
窗口看门狗( WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。
简单来说,和IWDG的区别就是IWDG要靠手动去喂狗,而WWDG有内置中断,所以可以利用设置中断服务函数去喂狗
首先还是设置WWDG (记得往工程里面添加头文件)大致设置步骤如下:
1)使能 WWDG 时钟(系统内部时钟)
2)设置窗口值和分频数
3)开启 WWDG 中断并分组
4) 设置计数器初始值并使能看门狗
5) 编写中断服务函数
- #include "led.h"
#include "wwdg.h"
//保存 WWDG 计数器的设置值,默认为最大.
u8 WWDG_CNT=0x7f;
void WWDG_Init(u8 tr,u8 wr,u32 fprer)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_SetPrescaler(fprer);////设置 IWDG 预分频值
WWDG_SetWindowValue(wr);//设置窗口值
WWDG_Enable(tr); //使能看门狗 , 设置 counter .
WWDG_ClearFlag();
WWDG_NVIC_Init();//初始化窗口看门狗 NVIC
WWDG_EnableIT(); //开启窗口看门狗中断
}
void WWDG_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_ist;
NVIC_ist.NVIC_IRQChannel=WWDG_IRQn;
NVIC_ist.NVIC_IRQChannelPreemptionPriority=2;
NVIC_ist.NVIC_IRQChannelSubPriority=3;
NVIC_ist.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_ist);
}
void WWDG_IRQHandler(void)
{
WWDG_SetCounter(0x7f);//喂狗
WWDG_ClearFlag();//清除提前唤醒标志
LED1=!LED1;//检测中断函数是否工作了
- }
简单来讲(只是个人愚见)就是WWDG是一个递减的计数器,从最大值递减到0,到0的时候如果没喂狗(就是重置计数器,比如说将它重置为最大值)就会复位,但中断触发是在中途进行的,就是当递减到0x40的时候就会触发中断,这时候会转到我们写的中断服务函数里面去,只要我们在中断服务函数里面写喂狗函数就可以一直喂狗了
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |