【STM32】窗口看门狗概述、寄存器、库函数(WWDG一般步骤)

发布者:电子创意达人最新更新时间:2019-03-13 来源: eefocus关键字:STM32  窗口看门狗  寄存器  库函数 手机看文章 扫描二维码
随时随地手机看文章

STM32F1xx官方资料:

《STM32中文参考手册V10》-第18章 窗口看门狗


窗口看门狗概述

窗口看门狗的定义

窗口看门狗之所以称为窗口,就是因为其喂狗时间是一个有上下限的范围内(窗口),可以通过设定相关寄存器,设定其上限时间(但是下限是固定的0x3F)。也就是说:喂狗的时间不能过早,也不能过晚。


而对比与独立看门狗,独立看门狗限制喂狗时间在0-x内,x由相关RLR寄存器决定。


窗口看门狗的必要性:


对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了;


如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常的路径运行非正常地跳过了某些程序段的情况。


窗口看门狗工作示意图



在窗口看门狗的递减计数器递减至窗口配置寄存器配置的上窗口(W[6:0])之前,是不能刷新递减计数器的数值(喂狗操作)的;同样,在递减计数器递减到下窗口(0x3F)之后,也是不能刷新递减计数器的数值(喂狗操作)的,否则这两种状况都会产生复位信号的。也就是说,喂狗操作只能发生在上、下窗口之间。


可能直接看窗口看门狗的框图,会更简单明了:



从这个框图中可以看到:


当T6:0(当前的递减计数器)大于上窗口时,比较器结果是1;如果此时写入WWDG_CR(喂狗),直接通过与门,或门也直接通过,产生复位信号;

当T6为0的时候,也就是产生复位信号(此时递减计数器小于0x3F),取反再过或门,产生复位信号。

窗口看门狗工作过程总结

STM32F的窗口看门狗中有一个7位的递减计数器T[6:0],它会在出现下述2种情况之一时产生看门狗复位:


当喂狗的时候如果计数器的值大于某一设定数值W[6:0](上窗口)时;

当计数器的数值从0x40减到0x3F时【T6位跳变到0】 。

如果启动了看门狗并且允许中断,当递减计数器递减到0x40时产生提前唤醒中断(EWI),可以在中断处理函数中向WWDG_CR重新写入计数器的值来达到喂狗的目的。


注意:进入中断之后,必须在不长于一个窗口看门狗计数周期的时间(在PCLK1频率为36MHz且WDGTB为0的情况下,该值为113us)内重新写入WWDG_CR,否则,看门狗将产生复位!


窗口看门狗相关配置寄存器

控制寄存器(MMDG_CR)



作用:控制寄存器主要用于启动看门狗、存储当前递减计数器的值。


配置寄存器(MMDG_CFR)



作用:配置寄存器主要用于使能提前唤醒中断、设置预分频系数、设置上窗口值。


状态寄存器(WWDG_SR)



作用:状态寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位0有效,其他都是保留位。当计数器达到40h时,此位由硬件置1。它必须通过软件写0来清除。对此位写1无效。即使中断未被使能,在计数器的值达到0x40的时候,此位也会置1。


 


窗口看门狗超时时间


这里需要注意的是:由于PCLK1默认情况下是36MHz,还是很大的。但是看门狗不需要这么大的频率,通常是需要除以4096。而预分频等操作是在除以了4096之后再进行的。


窗口看门狗配置相关库函数

2个初始化函数

void WWDG_EnableIT(void);

void WWDG_Enable(uint8_t Counter);

作用:前者使能提前唤醒中断,后者使能窗口看门狗,并设置初始值。


2个参数设置函数

void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);

void WWDG_SetWindowValue(uint8_t WindowValue);

作用:前者设置预分频系数,后者设置上窗口值。


1个喂狗函数

void WWDG_SetCounter(uint8_t Counter);

作用:不断喂狗,避免复位。


这里有一个注意点:独立看门狗是通过向IWDG_KR寄存器写入0xAAAA,从而计数器会从复位值重新递减;而窗口看门狗则是直接向WWDG_CR寄存器写复位值,则重新从该复位值开始递减。


2个中断标志位函数

FlagStatus WWDG_GetFlagStatus(void);

void WWDG_ClearFlag(void);

作用:前者获取中断标志位,后者清除中断标志位。


窗口看门狗一般步骤

使能看门狗时钟。调用函数:RCC_APB1PeriphClockCmd();

设置分频系数。调用函数:WWDG_SetPrescaler();

设置上窗口值。调用函数:WWDG_SetWindowValue();

开启提前唤醒中断并分组。调用函数:WWDG_EnableIT()、NVIC_Init();

使能看门狗。调用函数:WWDG_Enable();

喂狗(通常在中断服务中调用)。调用函数:WWDG_SetCounter();

编写中断服务函数。调用函数:WWDG_IRQHandler()。

下面按照这个一般步骤来进行一个简单的窗口看门狗程序:


//保存WWDG计数器的设置值,默认为最大. 

u8 WWDG_CNT=0x7f; 

//初始化窗口看门狗

//tr   :T[6:0],计数器值 

//wr   :W[6:0],窗口值 

//fprer:分频系数(WDGTB),仅最低2位有效 

//Fwwdg=PCLK1/(4096*2^fprer). 

 

void WWDG_Init(u8 tr,u8 wr,u32 fprer)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);  //   WWDG时钟使能

 

WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.   

WWDG_SetPrescaler(fprer);////设置IWDG预分频值

 

WWDG_SetWindowValue(wr);//设置窗口值

 

WWDG_Enable(WWDG_CNT); //使能看门狗 , 设置 counter .                  

 

WWDG_ClearFlag();//清除提前唤醒中断标志位 

 

WWDG_NVIC_Init();//初始化窗口看门狗 NVIC

 

WWDG_EnableIT(); //开启窗口看门狗中断

//重设置WWDG计数器的值

void WWDG_Set_Counter(u8 cnt)

{

    WWDG_Enable(cnt);//使能看门狗 , 设置 counter .  

}

//窗口看门狗中断服务程序

void WWDG_NVIC_Init()

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;    //WWDG中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;   //抢占2,子优先级3,组2

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占2,子优先级3,组2

        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 

NVIC_Init(&NVIC_InitStructure);//NVIC初始化

}

 

void WWDG_IRQHandler(void)

{

 

WWDG_SetCounter(WWDG_CNT);   //当禁掉此句后,窗口看门狗将产生复位

 

WWDG_ClearFlag();   //清除提前唤醒中断标志位

 

LED1=!LED1; //LED状态翻转

}

 int main(void)

 {

delay_init();     //延时函数初始化   

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

  LED_Init();

KEY_Init();          //按键初始化  

LED0=0;

delay_ms(300);   

WWDG_Init(0X7F,0X5F,WWDG_Prescaler_8);//计数器值为7f,窗口寄存器为5f,分频数为8    

  while(1)

{

LED0=1;      

}   

}

WWDG_Enable(uint8_t Counter)函数


这个函数用于使能窗口看门狗,并设置初始值。由于使能窗口开门狗是默认功能,也就是在函数的实现中加上了WWDG_CR寄存器的WDGA位置1,也就是说在Counter参数中只需要提供后七位(计数器的初始值)就行了。所以在程序中出现了如下的一句:

WWDG_CNT=tr&WWDG_CNT;   //初始化WWDG_CNT.  

WWDG_IRQHandler()函数


提前唤醒中断是计数器计数到0x40的时候触发,在中断处理函数中,通常进行喂狗的操作。但是在喂狗操作之后,要记得清除中断标志位。也就是程序中的如下一句:

WWDG_ClearFlag();   //清除提前唤醒中断标志位


关键字:STM32  窗口看门狗  寄存器  库函数 引用地址:【STM32】窗口看门狗概述、寄存器、库函数(WWDG一般步骤)

上一篇:【STM32】通用定时器的基本原理(实例:定时器中断)
下一篇:【STM32】独立看门狗概述、寄存器、库函数(IWDG一般步骤)

推荐阅读最新更新时间:2024-03-16 16:25

STM32 TIM1 F1 四通道完全重映射PWM 配置
void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph
[单片机]
STM32串口终端
[单片机]
<font color='red'>STM32</font>串口终端
STM32通用定时器TIMx
STM32计数器时钟可由下列四种时钟源提供: (1)内部时钟(CK_INT) (2)外部时钟模式1:外部输入脚(TIx) (3)外部时钟模式2:外部触发输入(ETR) (4)内部触发输入(ITRx) 时钟源(CK_INT)经预分频(PSC)后得到定时时钟(CK_CNT),每个定时时钟计数寄存器计数(可设向上/向下/中央对齐模式),计数寄存器计数至捕获比较寄存器(CCR),则产生CC中断;计数寄存器计数至预装载值(ARR),则产生UPDATE中断,并重装预载值。 举个例子:(以向上计数为例,每40us中断一次)   例程: (省略RCC设置部分) void TIM2_Configuration(void) {
[单片机]
<font color='red'>STM32</font>通用定时器TIMx
STM32开发笔记68: keil中使用ST-Link不能成功下载的真实原因
单片机型号:STM32F091RCT6 在STM32开发笔记67: 在keil中使用ST-Link不能成功下载的解决方法提到解决keil中使用ST-Link不能成功下载的一种方法,经仔细分析其实原因还在于程序上。 不能成功下载的程序中,包含如下程序,: CInit::CInit(uint8_t mode) { //底层初始化 HAL_Init(); //GPIO时钟使能 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENAB
[单片机]
STM32输入捕获,实现红外解码,支持长按
初始化代码: static void RCC_Configuration( void ); static void GPIO_Configuration( void ); static void NVIC_Configuration( void ); void InputCaptureInit( void ) { TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; RCC_Configuration(); NVIC_Configuration(); GPIO_Conf
[单片机]
STM32】MDK中寄存器地址名称映射分析
对于MCU,一切底层配置,最终都是在配置寄存器。 STM32F1xx官方资料: 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO) 51单片机访问地址 51单片机经常会引用一个reg51.h的头文件。下面看看它是怎么把名字和寄存器联系在一起的: sfr p0=0x80; p0=0x00; sfr是一种扩充数据类型,点用一个内存单位,值域为0-255.利用它可以访问51单片机内部所有的特殊功能寄存器。前一句“sfr p0=0x80”就是将P0映射到地址0x80。后一句“p0=0x00”就是往p0地址(0x80)代表的寄存器写值。 STM32访问地址 寄存器地址名称映射 STM32肯定也是
[单片机]
【<font color='red'>STM32</font>】MDK中<font color='red'>寄存器</font>地址名称映射分析
SPI I2C 的原理及在STM32上使用I2C总线的常见问题
在微控制器中SPI,I2C是常用的挂接外设的总线,我们对他们的如果没有仔细研究的话我们对他们的认识基本就是串行,线少(I2C两根SCL SDA,SPI 单向3根双向4根 SCK MOSI MISO CS/LD ),多外设(SPI 可以并联也可以级联,I2C基本是随便接,地址不冲突即可),但是实际上这两种总线原理上还有有很大区别的,在微控制器上的操作及与程序控制流程也是完全不一样的。 SPI的原理 是主控使用SCLK 线,在SCLK信号的边沿 将数据寄存器的数据通过 MOSI一位一位的移出到 设备中 ,同时设备的寄存器也将数据在SCLK边沿的驱动下将数据通过MISO线一位一位的移出到主控中,所以SPI总线中读写是同时进行的,没有
[单片机]
意法半导体宣布STM32 F3新系列微控制器正式量产
意法半导体(STMicroelectronics,简称ST)为简化高性能STM32 F3微控制器开发项目,推出并开始量产一个简单易用的创新开发平台。 新款开发平台STM32 F3开发套件内置陀螺仪和电子罗盘(1)—9个自由度(DOF)(2) MEMS传感器,结合新系列微控制器的先进信号处理和计算功能,可实现具有价格竞争力的传感器融合应用,例如航姿参考系统(Attitude Heading Reference Systems ,AHRS)(3) 。传感器融合应用结合强大的计算性能,让设计人员能够在移动游戏、增强实境、光学图像防抖功能、便携式导航系统、机器人和工业自动化系统中实现先进的3D运动检测系统。 意法半导体微控制器产
[单片机]
意法半导体宣布<font color='red'>STM32</font> F3新系列微控制器正式量产
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved