单片机
返回首页

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;





}





}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章