STM32F767 WWDG的基本用法

 本文介绍STM32F767 WWDG(System window watchdog)的基本用法。

开发环境

硬件环境

  • 电脑:Windows 10 Home x64
  • Apollo STM32F767开发板(ST-LINK V2仿真器)

软件环境

  • Keil Version 5.24.1 (Pack Installer:Keil.STM32F7xx_DFP.2.9.0.pack)
  • STM32CubeMX Version 4.25.0(Packages Manager:STM32CubeF7)

WWDG主要特性

系统框图

主要特性

  • 自由计数递减计数器
  • 时钟源为APB1时钟
  • 复位条件
    • 递减计数器值小于0x40时(看门狗激活状态下)
    • 递减计数器在窗口之外时被重载(看门狗激活状态下)
  • 提前唤醒中断(EWI):当递减计数器等于0x40时触发(如已使能且看门狗激活状态下)

WWDG溢出时间计算

 WWDG使用APB1作为时钟源,经过4096WWDG_CFR寄存器的WDGTB位控制的共2次分频。本例中APB1的时钟频率为54MHz,则WWDG的时钟周期计算如下:

$$T{WWDG}=T{APB1}\cdot 4096\cdot 2^{WDGTB}$$

举例计算,设定WDGTB为3,则WWDG的时钟周期约为0.6068ms

  • 递减计数器值小于0x40(等于0x39)时WWDG复位;
  • 设定WWDG_CFR寄存器中W[6:0]窗口值为0x50
  • 设定WWDG_CR寄存器中T[6:0]计数器值为0x60

 则WWDG的允许刷新时间位于计数器值在窗口值0x40之间,在窗口之外或者计数值小于0x40时都将引起复位。由以上约束时间,则在WWDG计数器启动之后,计数值从0x600x50之间禁止刷新看门狗,计数值在0x500x39之间允许刷新看门狗,在计数器到达0x39时将引起看门狗复位。对应地,在9.71~20.02ms内刷新均可以重载看门狗,在此时间窗以外刷新IWDG都已经无法避免系统复位。

WWDG的基本用法

WWDG参数设置

 WWDG的初始化代码如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WWDG_HandleTypeDef hwwdg;
/* WWDG init function */
void MX_WWDG_Init(void)
{
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
hwwdg.Init.Window = 0x50;
hwwdg.Init.Counter = 0x60;
hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;
if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}

 其参数设置如下:

  • 预分频系数设置为8,窗口值设置为0x50,计数器值设置为0x60
  • 禁止EWI中断。

WWDG初始化

 WWDG初始化代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* @brief Initialize the WWDG according to the specified.
* parameters in the WWDG_InitTypeDef of associated handle.
* @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains
* the configuration information for the specified WWDG module.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg)
{
/* Check the WWDG handle allocation */
if(hwwdg == NULL)
{
return HAL_ERROR;
}
/* Check the parameters */
assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance));
assert_param(IS_WWDG_PRESCALER(hwwdg->Init.Prescaler));
assert_param(IS_WWDG_WINDOW(hwwdg->Init.Window));
assert_param(IS_WWDG_COUNTER(hwwdg->Init.Counter));
assert_param(IS_WWDG_EWI_MODE(hwwdg->Init.EWIMode));
/* Init the low level hardware */
HAL_WWDG_MspInit(hwwdg);
/* Set WWDG Counter */
WRITE_REG(hwwdg->Instance->CR, (WWDG_CR_WDGA | hwwdg->Init.Counter));
/* Set WWDG Prescaler and Window */
WRITE_REG(hwwdg->Instance->CFR, (hwwdg->Init.EWIMode | hwwdg->Init.Prescaler | hwwdg->Init.Window));
/* Return function status */
return HAL_OK;
}
void HAL_WWDG_MspInit(WWDG_HandleTypeDef* wwdgHandle)
{
if(wwdgHandle->Instance==WWDG)
{
/* USER CODE BEGIN WWDG_MspInit 0 */
/* USER CODE END WWDG_MspInit 0 */
/* WWDG clock enable */
__HAL_RCC_WWDG_CLK_ENABLE();
/* USER CODE BEGIN WWDG_MspInit 1 */
/* USER CODE END WWDG_MspInit 1 */
}
}

 WWDG初始化流程如下:

  • 使能WWDG时钟;
  • 设置WWDG_CR寄存器WDGA位为1,使能看门狗;向T[6:0]位写入计数器值;
  • 设置WWDG_CFR寄存器EWI位为0,禁止EWI功能;向WDGTB[1:0]位写入预分频值;向W[6:0]位写入窗口值。

刷新WWDG函数

 刷新WWDG函数如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @brief Refresh the WWDG.
* @param hwwdg pointer to a WWDG_HandleTypeDef structure that contains
* the configuration information for the specified WWDG module.
* @retval HAL status
*/
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)
{
/* Write to WWDG CR the WWDG Counter value to refresh with */
WRITE_REG(hwwdg->Instance->CR, (hwwdg->Init.Counter));
/* Return function status */
return HAL_OK;
}

测试程序

 在主程序中测试WWDG,程序设置如下:

1
2
3
4
5
6
7
while (1)
{
mainloop++;
//oled_putuint32(0, 2, mainloop);
SYS_Delay_US(9.7*1000);
HAL_WWDG_Refresh(&hwwdg);
}

 实验结果如下所示:

  • delay时间为9.6ms,系统复位,符合预期;
  • delay时间为9.8ms,系统正常,符合预期;
  • delay时间为19.9ms,系统复位不符合预期
  • delay时间为20.1ms,系统复位,符合预期;

 实验结果与预期不符合,降低delay时间继续进行验证:

  • delay时间设置为19.5ms,系统复位
  • delay时间设置为19.4ms,系统正常

由此可见,实验结果表示与理论值有较大误差。具体已经联系ST进行解决。

文章目录
  1. 1. 开发环境
    1. 1.1. 硬件环境
    2. 1.2. 软件环境
  2. 2. WWDG主要特性
    1. 2.1. 系统框图
    2. 2.2. 主要特性
    3. 2.3. WWDG溢出时间计算
  3. 3. WWDG的基本用法
    1. 3.1. WWDG参数设置
    2. 3.2. WWDG初始化
    3. 3.3. 刷新WWDG函数
    4. 3.4. 测试程序
|