|
窗口看门狗(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 时钟由APB1时钟PCK1提供,经过预分频器WDGTB对(TPCLK1/4096)进行分频。 超时时间计算公式:
窗口看门狗相关的HAL函数 窗口看门狗相关的HAL库函数相关源码和定义分布在文件stm32f7xx_wwdg.c 文件和头文件 stm32f7xx_wwdg.h 中。主要的函数如下: 1. WWDG初始化结构体定义WWDG_InitTypeDef - typedef struct
- {
- uint32_t Prescaler; /*!< Specifies the prescaler value of the WWDG.
- This parameter can be a value of @ref WWDG_Prescaler */
-
- uint32_t Window; /*!< Specifies the WWDG window value to be compared to the downcounter.
- This parameter must be a number lower than Max_Data = 0x80 */
-
- uint32_t Counter; /*!< Specifies the WWDG free-running downcounter value.
- This parameter must be a number between Min_Data = 0x40 and Max_Data = 0x7F */
- }WWDG_InitTypeDef;
复制代码该结构体定义了WWDG的预分频系数、窗口值和计数值。 2. 使能WWDG时钟函数 - #define __HAL_RCC_WWDG_CLK_ENABLE() do { \
- __IO uint32_t tmpreg = 0x00; \
- SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\
- /* Delay after an RCC peripheral clock enabling */ \
- tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\
- UNUSED(tmpreg); \
- } while(0)
复制代码WWDG使用APB1时钟。使能时将RCC寄存器的相应位置1。 3. WWDG初始化函数HAL_WWDG_Init - HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
复制代码该函数初始化一个WWDG_InitTypeDef实例,设置WWDG的预分频系数、窗口值和计数值。 4. 使能WWDG函数HAL_WWDG_Start() - HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg)
复制代码该函数置位WDGA,使能WWDG。 5. 使能中断模式下的WWDG函数HAL_WWDG_Start_IT
- HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg)
复制代码该函数使能提前唤醒中断WWDG_CFR_EWI,然后使能WWDG。 6. WWDG的中断服务函数HAL_WWDG_WakeupCallback - __weak void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg)
复制代码该函数是提前唤醒中断的服务程序,用户可以在该函数添加自定义的代码。 7. 喂狗函数HAL_WWDG_Refresh - 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开始闪烁。
|