woshi_ziyu
发表于: 2016-5-14 16:13:17 | 显示全部楼层

2.bmp

窗口看门狗(WWDG)可以监测应用程序是否按照预期的方式执行,如果没有,看门狗将会在产生一个MCU复位。与独立看门狗IWG相比,两者的功能类似,只是喂狗的时间不同。窗口看门狗WWDG的喂狗时间有一个上下限的时间范围。当窗口看门狗的控制递减计数器T[6:0]在高于上限窗口值,或是低于下限窗口值被更新时都会产生复位。窗口的上限值是配置寄存器WWDG_CFR的7位窗口值W[6:0],该值最大可以设定为127(0x7F),最小为64(0x40)。窗口的下限值是固定的64(0x64)。


STM32F7的窗口看门狗和其他系列的MCU功能类似。根据STM32F7参考手册的第28章系统窗口看门狗 (WWDG)的介绍,相关的寄存器有三个:控制寄存器 (WWDG_CR)、配置寄存器(WWDG_CFR)和状态寄存器 (WWDG_SR)。

1.  控制寄存器 (WWDG_CR)

WDGA是窗口看门狗的激活位。当该位置1时激活看门狗,并且激活后只有复位时才会由硬件进行清零。

T[6:0]是窗口看门狗的7位计数器,用来存储看门狗计数器的值。该计数器属于累减型计数器。当它从0x40变成0x3F(即T6 清零)时就会产生复位。

2.  配置寄存器(WWDG_CFR)

EWI是窗口看门狗的提前唤醒中断。当该位置1时,如果计数器值T[6:0]达到0x40时,就会产生中断。如果开启了相应的EWI中断,那么可以在中断服务程序里面重新写入WWDG_CR的计数值,这样就喂狗了。

WDGTB[1:0]是窗口看门狗的定时器时基。该值决定了看门狗的时钟。

W[6:0]是窗口看门狗的7位窗口值。如果计数器T[6:0]的值大于该窗口值,就会产生复位。

3.  状态寄存器 (WWDG_SR)

EWIF是窗口看门狗的提前唤醒中断标志。当计数器值T[6:0]达到 0x40 时此位由硬件置 1。它必须由软件通过写入 0 来清零(在中断服务函数中)。

WWDG-Register.png


窗口看门狗的超时时间设置

WWDG 时钟由APB1时钟PCK1提供,经过预分频器WDGTB对(TPCLK1/4096)进行分频。

超时时间计算公式:

WWDG-Formula.png


窗口看门狗相关的HAL函数

窗口看门狗相关的HAL库函数相关源码和定义分布在文件stm32f7xx_wwdg.c 文件和头文件 stm32f7xx_wwdg.h 中。主要的函数如下:

1.  WWDG初始化结构体定义WWDG_InitTypeDef

  1. typedef struct
  2. {
  3.   uint32_t Prescaler;  /*!< Specifies the prescaler value of the WWDG.
  4.                             This parameter can be a value of @ref WWDG_Prescaler */
  5.   
  6.   uint32_t Window;     /*!< Specifies the WWDG window value to be compared to the downcounter.
  7.                             This parameter must be a number lower than Max_Data = 0x80 */
  8.   
  9.   uint32_t Counter;    /*!< Specifies the WWDG free-running downcounter value.
  10.                             This parameter must be a number between Min_Data = 0x40 and Max_Data = 0x7F */

  11. }WWDG_InitTypeDef;
复制代码

该结构体定义了WWDG的预分频系数、窗口值和计数值。

2.  使能WWDG时钟函数

  1. #define __HAL_RCC_WWDG_CLK_ENABLE()   do { \
  2.                                       __IO uint32_t tmpreg = 0x00; \
  3.                                         SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\
  4.                                         /* Delay after an RCC peripheral clock enabling */ \
  5.                                         tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\
  6.                                         UNUSED(tmpreg); \
  7.                                       } while(0)
复制代码

WWDG使用APB1时钟。使能时将RCC寄存器的相应位置1。

3.  WWDG初始化函数HAL_WWDG_Init

  1. HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
复制代码

该函数初始化一个WWDG_InitTypeDef实例,设置WWDG的预分频系数、窗口值和计数值。

4.  使能WWDG函数HAL_WWDG_Start()

  1. HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg)
复制代码

该函数置位WDGA,使能WWDG。

5.  使能中断模式下的WWDG函数HAL_WWDG_Start_IT

  1. HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg)
复制代码

该函数使能提前唤醒中断WWDG_CFR_EWI,然后使能WWDG。

6. WWDG的中断服务函数HAL_WWDG_WakeupCallback

  1. __weak void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
复制代码

该函数是提前唤醒中断的服务程序,用户可以在该函数添加自定义的代码。

7.  喂狗函数HAL_WWDG_Refresh

  1. HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter)
复制代码

该函数向WWDG的计数器寄存器重新写入计数值,防止复位。


使用WWDG的一般步骤

1    使用__HAL_RCC_WWDG_CLK_ENABLE()函数开启WWDG时钟。

2    使用HAL_WWDG_Init设置预分频值、窗口值和计数值。这些值在WWDG启动就不能进行更改,直到MCU硬件复位。

3    使能WWDG或者中断模式的WWDG。

4    如果需要,编写WWDG的中断服务函数HAL_WWDG_WakeupCallback

5.   喂狗HAL_WWDG_Refresh


在STM32F7Cube中提供了WWDG的例程。使用MDK打开NUCLEO-F746ZG平台下的例程WWDG_Example,该例程采用主程序轮询的方式来进行喂狗。WWDG分频系数设置为8,计数值设置为127,窗口值设置为80。窗口的上限值是 T_min (mS) = 1000 * (Counter - Window) / WWDG clock = 30.69ms,下限值是:T_max (mS) = 1000 * (Counter - 0x40) / WWDG clock = 42ms。每隔37ms进行喂狗。

重新编译,并下载到开发板中运行。LED2每隔37ms进行闪烁。当用户按钮USER按下时,WWDG复位,LED1点亮约4ms,然后LED2开始闪烁。

IMG_1787.JPG

跳转到指定楼层
如果你能看到我的世界里那些渐渐消逝的美好,你就能体会到现在所拥有的幸福。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 32 | 回复: 51



手机版|

GMT+8, 2024-4-26 19:14 , Processed in 0.055444 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表