datasheet

STM32学习笔记一一窗口看门狗

2019-01-09来源: eefocus 关键字:STM32  窗口看门狗

1.窗口看门狗( WWDG):通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。


2.窗口看门狗工作示意图:



T[6:0]就是 WWDG_CR 的低七位, W[6:0]即是 WWDG->CFR 的低七位。T[6:0] 


就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的( 0X40)。当窗口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。上窗口值( W[6:0]) 是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于 0X40,否则窗口就不存在了。


3.相关寄存器


a.控制寄存器( WWDG_CR):各位描述如下图



WWDG_CR 只有低八位有效, T[6:0]用来存储看门狗的计数器值,随时更新,每个窗口看门狗计数周期( 4096×2^ WDGTB)减 1。当该计数器的值从 0X40 变为 0X3F 的时候,将产生看门狗复位。


WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一旦设置,就只能在硬件复位后才能清零了。


b.配置寄存器( WWDG_CFR)L


EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间(T[6:0]=0X40) 来提醒我们,需要进行喂狗了,否则将复位!


c.状态寄存器( WWDG_SR)


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


4.WWDG库函数配置步骤:


1)使能 WWDG 时钟:WWDG 不同于 IWDG, IWDG 有自己独立的 40Khz 时钟,而 WWDG使用的是 PCLK1 的时钟,需要先使能时钟。


操作: 

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


2)设置窗口值和分频数


设置窗口值的函数:void WWDG_SetWindowValue(uint8_t WindowValue);//入口参数为窗口值


设置分频数的函数是:void WWDG_SetPrescaler(uint32_t WWDG_Prescaler);//入口参数是分频值


3)开启 WWDG 中断并分组


开启 WWDG 中断的函数为:WWDG_EnableIT(); //开启窗口看门狗中断


中断优先级配置,使用 NVIC_Init()函数。


4) 设置计数器初始值并使能看门狗


void WWDG_Enable(uint8_t Counter);//该函数既设置了计数器初始值,同时使能了窗口看门狗。


5) 编写中断服务函数


在最后,编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存器的 EWIF 位清空。


5.库函数实现


/*窗口看门狗初始化*/

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

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


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


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


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


    WWDG_ClearFlag();


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


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

//重设置WWDG计数器的值

void WWDG_Set_Counter(u8 cnt)

{

    WWDG_Enable(cnt);    

}

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

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)

    {

    // Update WWDG counter

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

    // Clear EWI flag */

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

    // Toggle GPIO_Led pin 7 */

    LED1=!LED1;

    }


注:具体的函数实现参见库函数文件:stm32f10x_iwdg.c


参考:


《原子库函数教程》



关键字:STM32  窗口看门狗

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2019/ic-news010942859.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32学习笔记一一TFTLCD 显示
下一篇:STM32学习笔记一一独立看门狗

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32:STM32库函数配置

stm32 固件库V3.0以上的版本,main等源文件中不再直接包含stm32f10x_conf.h,而是stm32f10x.h,stm32f10x.h则定义了启动设置,以及所有寄存器宏定义,此文件中需要注意的有:使用V3.0以上版本固件库的方法如下:1.选择device(配置函数STM32F10x.h,具体配置方法如下)在STM32F10x.h中有如下代码:#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined
发表于 2019-01-17
STM32:STM32库函数配置

STM32:STM32学习记录1:MDK基本数据类型及代码优化

大概一年前开始接触STM32,当时就被它的库函数开发所吸引,但是迫于各种压力放弃了学习,一直在使用所谓稳定的单片机来开发(忍不住要吐槽),现在终于有时间了,开始自己的兴趣之旅喽!!现在网上有各种大牛的经验文档使我受益匪浅,也感谢室友的无私帮助!!!大概看了一下大牛的经验文档,好像没有一个提到MDK的基本数据类型的,自己找找看在MDK的帮助里面有。打开MDK-----help----uVision help----RealView Compiler Reference Guide----C and C++ implementation details----C and C++ implementation
发表于 2019-01-17
STM32:STM32学习记录1:MDK基本数据类型及代码优化

STM32:STM32学习记录5: 外部中断

配置流程:1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。2:IO口初始化,包括引脚,速率,输入输出模式等。3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。说明:1:主函数写在main.c中,中断函数写在stm32f10x_it.c 中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。2:中断函数名在startup_stm32f10x_xx.s中查阅3:清除 EXT13 线路的挂起位  注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中3:NVIC一般配
发表于 2019-01-17

STM32学习记录——printf函数重定位

功能: 重定位printf函数,使printf作为串口打印输出函数。代替usart_send_string()函数步骤: usart.c中包含USART初始化函数 1、USART初始化(使能时钟、使能GPIO、GPIO和USART初始化) 2、打开USART 3、在usart.c中加入如下代码#ifdef __GNUC__     /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf      
发表于 2019-01-17

STM32USART串口调节与printf重定义

首先,printf重定义后可以直接使用printf函数从串口发送数据在usart.c中添加代码:#ifdef __GNUC__  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf     set to 'Yes') calls __io_putchar() */  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else  #define PUTCHAR_PROTOTYPE int f
发表于 2019-01-17

STM32中使用标准库重定义printf()函数

//重定义函数1PUTCHAR_PROTOTYPE{ /* Place your implementation of fputc here */ /* e.g. write a character to the USART */  USART_SendData(USART1, (uint8_t) ch);   /* 循环等待直到发送结束*/  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)  {}   return ch;}//重定义函数2 int fputc
发表于 2019-01-17

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved