历史上的今天
今天是:2025年04月23日(星期三)
2021年04月23日 | STM32窗口看门狗程序
2021-04-23 来源:eefocus
简介:窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6位(WWDG->CR的第六位)变成0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU复位。
在递减计数器达到窗口配置寄存器(WWDG->CFR)数值之前,如果7位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个MCU复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。

图 3.6.1.1中,T[6:0]就是WWDG_CR的低七位,W[6:0]即是WWDG->CFR的低七位。T[6:0]就是窗口看门狗的计数器,而W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40)。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。
上窗口值(W[6:0])是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于0X40,否则窗口就不存在了。
窗口看门狗的超时公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
Twwdg:WWDG超时时间(单位为ms)
Fpclk1:APB1的时钟频率(单位为Khz)
WDGTB:WWDG的预分频系数
T[5:0]:窗口看门狗的计数器低6位
窗口看门狗寄存器介绍:


如何使用窗口看门狗:
1)使能WWDG时钟
2)设置WWDG_CFR和WWDG_CR两个寄存器
在时钟使能完后,我们设置WWDG的CFR和CR两个寄存器,对WWDG进行配置。包括使能窗口看门狗、开启中断、设置计数器的初始值、设置窗口值并设置分频数WDGTB
3)开启WWDG中断并分组
4)编写中断服务函数
软件例程:
//---------------------------wdg.c-----------------------
#include "wdg.h"
#include "led.h"
u8 wwdg_cnt=0x7f; //窗口看门狗计数器初值
void wwdg_init(u8 tr,u8 wr,u8 fprer)
{
RCC->APB1ENR|=1<<11; //使能WWDG时钟
wwdg_cnt=tr&wwdg_cnt; // 初始化计数器值
WWDG->CFR|=fprer<<7; //设置频率时基
WWDG->CFR|=1<<9; //使能串口看门狗中断
WWDG->CFR&=0xff80; //窗口值清零
WWDG->CFR|=wr; //设定窗口值
WWDG->CR|=(wwdg_cnt|1<<7); // 启动看门狗设置7位计数器初值
MY_NVIC_Init(2,3,WWDG_IRQChannel,2);
}
void wwdg_feed(u8 cnt)
{
WWDG->CR|=(cnt&0x7f);//喂狗值
}
void WWDG_IRQHandler(void)
{
u8 tr,wr;
wr=WWDG->CFR&0x7f;
tr=WWDG->CR&0x7f;
if(tr WWDG->SR&=0x00; //清楚提前唤醒标志位 LED1=!LED1; } //------------------------wdg.h--------------------- #ifndef _wdg_h #define _wdg_h #include "sys.h" void wwdg_init(u8 tr,u8 wr,u8 fprer); void wwdg_feed(u8 cnt); #endif //------------------led.c---------------------- #include "led.h" void led_init(void) { RCC->APB2ENR|=1<<2; RCC->APB2ENR|=1<<5; GPIOA->CRH&=0xfffffff0; GPIOA->CRH|=0x00000003; GPIOD->CRL&=0xfffff0ff; GPIOD->CRL|=0x00000300; GPIOA->ODR|=1<<8; GPIOD->ODR|=1<<2; } //---------------------led.h------------------ #ifndef _led_h #define _led_h #include "sys.h" #define LED0 PAout(8) #define LED1 PDout(2) void led_init(void); #endif ///-----------------------主函数------------test.c--------------- #include #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "wdg.h" int main(void) { Stm32_Clock_Init(9); delay_init(72); uart_init(72,9600); led_init(); wwdg_init(0x7f,0x5f,3); LED0=0; delay_ms(1800); while(1) { LED0=1; } }
史海拾趣
|
活动时间/地点: 2010/01/26 14:00 杭州 浙江国际大酒店5楼影视厅(杭州下城区体育场路221号) 2010/01/28 14:00 深圳 金茂深圳JW万豪酒店3楼会议室I&II (深圳市福田区深南大道6005号) 2010/01/28 14:00 南京 ...… 查看全部问答> |
|
Linux MTD源代码分析(Jim Zeus著)--linux下flash驱动开发重要参考 目录 专有名词:.... 7 Linux MTD介绍:... 8 设备层和原始设备层的函数调用关系(红色部分需要我们实现):... 9 NOR型Flash芯片驱动与MTD原始设备... 10 NAND和NOR的比较... 11 源码分析... 14 头文件分析... 14 mtd.h. 14 MTD_CHAR_MAJ ...… 查看全部问答> |
|
为了完成作业,可发到我的信箱chenccq_666@sina.com,谢谢了。 名称: 基于多核处理器****的应用 要求: 1.市场前景 2. 系统的框架及其功能说明 3. 所设计内容涉及嵌入式领域 4. 系统中各具体功 ...… 查看全部问答> |
|
最近针对有一些需求,我们将在2008年8月左右推出一套基于STM32的WIFI模块,功能如下:1)基于MCU的网络应用需求2)标准的UART,SPI接口3)完整的API函数4)完全与标准的WIFI数据统一详细的User Manual请查看www.mxchip.com网站。… 查看全部问答> |
|
我作了一个控制系统,定时控制部分. 430采用电池(SONY的CR2032)供电, 每分钟系统激活一次,工作约100ms, 在激活工作期间以9600bps的波特率发送一个字节的数据. 发现工作三天之后电池电量就不足了. 有没有哪位遇到这样的问题. 发表一下看法吧… 查看全部问答> |




