标签:
窗口看门狗( 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;//检测中断函数是否工作了 }
#ifndef _WWDG_H #define _WWDG_H #include "sys.h" void WWDG_Init(u8 tr,u8 wr,u32 fprer); void WWDG_NVIC_Init(void); void WWDG_IRQHandler(void); #endif其中有一个地方一开始写错了。。WWDG_Init()的第三个参数 写成了u8 ..结果灯闪的超级快,后来找了一会才找到这错了。。估计参数穿进去溢出了
主函数
#include "led.h" #include "sys.h" #include "delay.h" #include "wwdg.h" #include "usart.h" void init(void) { delay_init(); uart_init(9600); LED_Init(); NVIC_Configuration(); LED0=0; delay_ms(300); WWDG_Init(0x7f,0x5f,WWDG_Prescaler_8); } int main(void) { init(); while(1) { LED0=1; } }
cortex_m3_stm32嵌入式学习笔记(六):窗口看门狗实验(WWDG)
标签:
原文地址:http://blog.csdn.net/qq_16255321/article/details/42965427