0、窗口看门狗的使用
- 窗口看门狗基于CPU时钟fCPU运行,窗口看门狗实现基于一个递减计数器。
- 若fCPU运行正常,当主程序发生错误时,无法重置看门狗计数器,窗口看门狗将会产生复位标志位并重启。
- 由于窗口看门狗基于fCPU运行,当MCU进入停机模式或活跃停机模式时,窗口看门狗计数将会停止。
- 程序需在递减计数器的T6位变为0之前刷新递减计数器,防止看门狗威廉希尔官方网站
产生复位信号;同时,程序需要避免在7位的递减计数器数值达到窗口寄存器数值之前刷新递减计数器,否则看门狗威廉希尔官方网站
将产生复位信号。
- 窗口看门狗的递减计数器是自由运行计数器,即使未开启看门,它仍然不断地递减计数。当看起看门狗时,必须设置T6位以避免立刻产生复位
1、与窗口看门狗相关的选项字节
WWDG_HW:窗口看门狗激活方式,默认值为0。
0x4805: OPT3[1];
0x4806: NOPT3[1];
- 当WWDG_HW选项字节为0时,代表选择了软件看门狗,在系统复位后看门狗处于关闭状态。窗口看门狗需要通过设置WDGCR寄存器中的WDGA位开启窗口看门狗,此后在下次复位之前将不能关闭看门狗。
- 当WWDG_HW选项字节为1时,代表选择了硬件看门狗,看门狗将始终开启,而WDGA位将不起作用。
WWDG_HALT:当芯片进入停机模式时窗口看门狗的复位动作,默认值位0。
0x4805: OPT3[0];
0x4806: NOPT3[0];
- 当WWDG_HALT选项字节为0时,如果窗口看门狗使能,当芯片进入停机模式时不产生复位。在进入停机模式时
- 当WWDG_HALT选项字节为1时,如果窗口看门狗使能,当芯片进入停机模式时会产生复位。
2、窗口看门狗时序图
- 当CPU时钟fCPU为16MHz时,看门狗计数器(CNT)中的6位数值,与以毫秒为单位的超时时间线性关系表可见下图。
- 已知窗口看门狗每过(大约)12288个fCPU周期递减一次。看门狗计数器单步所需时长计算公式为:
step = 12288/fCPU
例如,fCPU = 8Mhz时,
step = 12288/8000000 = 0.001536s = 1.536ms,即一步为1.536ms
- WWDG_CR寄存器的T[6:0]由0x7F递减到0x40共63步。窗口看门狗的复位时间上限为step × 64。
- 若重置看门狗计数器时,WWDG_CR的T[6:0]位大于WWDG_WR[6:0],看门狗将产生复位信号。窗口看门狗的时序图如下图。
3、窗口看门狗的配置
窗口看门狗的时钟由CPU时钟fCPU提供,因此在使用窗口看门狗前,请配置合适的CPU时钟。
3.1、 通过官方库“stm8s_wwdg”提供的函数初始化WWDG
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void _WWDG_Init(void)
{
/* WWDG 配置: WWDG 的时钟为 SYSCLK = fCPU */
/* WWDG 的超时时间为 maxSetCounterTime */
/* Watchdog 窗口 = (COUNTER_INIT - 63) * 1 step
= 64 * (12288 / fCPU)
= maxSetCounterTime s
*/
/* 禁止复位窗口 = (COUNTER_INIT - WINDOW_VALUE) * 1 step
= (COUNTER_INIT - WINDOW_VALUE) * (12288 / fCPU)
= minSetCounterTime s
*/
/* 禁止复位窗口范围为 0.0 ms 到 minSetCounterTime ms
Watchdog 窗口范围为 minSetCounterTime ms to maxSetCounterTime ms
如果在禁止复位窗口进行复位,将产生一个复位信号。
如果在Watchdog 窗口范围进行复位,将不产生复位信号。
如果在WWDG向下计数器小于63进行复位,将产生一个复位信号。 */
WWDG_Init(COUNTER_INIT, WINDOW_VALUE);
}
例子(获得最大范围窗口范围):
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void _WWDG_Init(void)
{
/* WWDG 配置: WWDG 的时钟为 SYSCLK = fCPU */
/* WWDG 的超时时间为 maxSetCounterTime */
/* Watchdog 窗口 = (Counter- 63) * 1 step
= 64 * (12288 / fCPU)
= maxSetCounterTime s
*/
/* 禁止复位窗口 = (Counter- WindowValue) * 1 step
= (Counter- WindowValue) * (12288 / fCPU)
= minSetCounterTime s
*/
/* 禁止复位窗口范围为 0.0 ms 到 minSetCounterTime ms
Watchdog 窗口范围为 minSetCounterTime ms to maxSetCounterTime ms
如果在禁止复位窗口进行复位,将产生一个复位信号。
如果在Watchdog 窗口范围进行复位,将不产生复位信号。
如果在WWDG向下计数器小于63进行复位,将产生一个复位信号。 */
// 复位WWDG的WR寄存器的值,防止使能后,窗口看门狗立即产生复位信号。
WWDG->WR = 0x7F;
// 使能窗口看门狗,并配置计数器值。
WWDG->CR = (uint8_t)((uint8_t)(0x80| 0x40) | (uint8_t)Counter);
// 配置窗口看门狗窗口值。
WWDG->WR = (uint8_t)((uint8_t)(~0x80) & (uint8_t)(0x40| WindowValue));
}
3.2、 通过寄存器操作初始化WWDG
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void _WWDG_Init(void)
{
/* WWDG 配置: WWDG 的时钟为 SYSCLK = fCPU */
/* WWDG 的超时时间为 maxSetCounterTime */
/* Watchdog 窗口 = (Counter- 63) * 1 step
= 64 * (12288 / fCPU)
= maxSetCounterTime s
*/
/* 禁止复位窗口 = (Counter- WindowValue) * 1 step
= (Counter- WindowValue) * (12288 / fCPU)
= minSetCounterTime s
*/
/* 禁止复位窗口范围为 0.0 ms 到 minSetCounterTime ms
Watchdog 窗口范围为 minSetCounterTime ms to maxSetCounterTime ms
如果在禁止复位窗口进行复位,将产生一个复位信号。
如果在Watchdog 窗口范围进行复位,将不产生复位信号。
如果在WWDG向下计数器小于63进行复位,将产生一个复位信号。 */
// 复位WWDG的WR寄存器的值,防止使能后,窗口看门狗立即产生复位信号。
WWDG->WR = 0x7F;
// 使能窗口看门狗,并配置计数器值。
WWDG->CR = (uint8_t)((uint8_t)(0x80| 0x40) | (uint8_t)Counter);
// 配置窗口看门狗窗口值。
WWDG->WR = (uint8_t)((uint8_t)(~0x80) & (uint8_t)(0x40| WindowValue));
}
请确保窗口看门狗的窗口值WindowValue <= 0x7F,否则WWDG->WR会溢出。
4、WWDG寄存器简介
- CR控制寄存器
- WR窗口寄存器
0、窗口看门狗的使用
- 窗口看门狗基于CPU时钟fCPU运行,窗口看门狗实现基于一个递减计数器。
- 若fCPU运行正常,当主程序发生错误时,无法重置看门狗计数器,窗口看门狗将会产生复位标志位并重启。
- 由于窗口看门狗基于fCPU运行,当MCU进入停机模式或活跃停机模式时,窗口看门狗计数将会停止。
- 程序需在递减计数器的T6位变为0之前刷新递减计数器,防止看门狗威廉希尔官方网站
产生复位信号;同时,程序需要避免在7位的递减计数器数值达到窗口寄存器数值之前刷新递减计数器,否则看门狗威廉希尔官方网站
将产生复位信号。
- 窗口看门狗的递减计数器是自由运行计数器,即使未开启看门,它仍然不断地递减计数。当看起看门狗时,必须设置T6位以避免立刻产生复位
1、与窗口看门狗相关的选项字节
WWDG_HW:窗口看门狗激活方式,默认值为0。
0x4805: OPT3[1];
0x4806: NOPT3[1];
- 当WWDG_HW选项字节为0时,代表选择了软件看门狗,在系统复位后看门狗处于关闭状态。窗口看门狗需要通过设置WDGCR寄存器中的WDGA位开启窗口看门狗,此后在下次复位之前将不能关闭看门狗。
- 当WWDG_HW选项字节为1时,代表选择了硬件看门狗,看门狗将始终开启,而WDGA位将不起作用。
WWDG_HALT:当芯片进入停机模式时窗口看门狗的复位动作,默认值位0。
0x4805: OPT3[0];
0x4806: NOPT3[0];
- 当WWDG_HALT选项字节为0时,如果窗口看门狗使能,当芯片进入停机模式时不产生复位。在进入停机模式时
- 当WWDG_HALT选项字节为1时,如果窗口看门狗使能,当芯片进入停机模式时会产生复位。
2、窗口看门狗时序图
- 当CPU时钟fCPU为16MHz时,看门狗计数器(CNT)中的6位数值,与以毫秒为单位的超时时间线性关系表可见下图。
- 已知窗口看门狗每过(大约)12288个fCPU周期递减一次。看门狗计数器单步所需时长计算公式为:
step = 12288/fCPU
例如,fCPU = 8Mhz时,
step = 12288/8000000 = 0.001536s = 1.536ms,即一步为1.536ms
- WWDG_CR寄存器的T[6:0]由0x7F递减到0x40共63步。窗口看门狗的复位时间上限为step × 64。
- 若重置看门狗计数器时,WWDG_CR的T[6:0]位大于WWDG_WR[6:0],看门狗将产生复位信号。窗口看门狗的时序图如下图。
3、窗口看门狗的配置
窗口看门狗的时钟由CPU时钟fCPU提供,因此在使用窗口看门狗前,请配置合适的CPU时钟。
3.1、 通过官方库“stm8s_wwdg”提供的函数初始化WWDG
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void _WWDG_Init(void)
{
/* WWDG 配置: WWDG 的时钟为 SYSCLK = fCPU */
/* WWDG 的超时时间为 maxSetCounterTime */
/* Watchdog 窗口 = (COUNTER_INIT - 63) * 1 step
= 64 * (12288 / fCPU)
= maxSetCounterTime s
*/
/* 禁止复位窗口 = (COUNTER_INIT - WINDOW_VALUE) * 1 step
= (COUNTER_INIT - WINDOW_VALUE) * (12288 / fCPU)
= minSetCounterTime s
*/
/* 禁止复位窗口范围为 0.0 ms 到 minSetCounterTime ms
Watchdog 窗口范围为 minSetCounterTime ms to maxSetCounterTime ms
如果在禁止复位窗口进行复位,将产生一个复位信号。
如果在Watchdog 窗口范围进行复位,将不产生复位信号。
如果在WWDG向下计数器小于63进行复位,将产生一个复位信号。 */
WWDG_Init(COUNTER_INIT, WINDOW_VALUE);
}
例子(获得最大范围窗口范围):
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void _WWDG_Init(void)
{
/* WWDG 配置: WWDG 的时钟为 SYSCLK = fCPU */
/* WWDG 的超时时间为 maxSetCounterTime */
/* Watchdog 窗口 = (Counter- 63) * 1 step
= 64 * (12288 / fCPU)
= maxSetCounterTime s
*/
/* 禁止复位窗口 = (Counter- WindowValue) * 1 step
= (Counter- WindowValue) * (12288 / fCPU)
= minSetCounterTime s
*/
/* 禁止复位窗口范围为 0.0 ms 到 minSetCounterTime ms
Watchdog 窗口范围为 minSetCounterTime ms to maxSetCounterTime ms
如果在禁止复位窗口进行复位,将产生一个复位信号。
如果在Watchdog 窗口范围进行复位,将不产生复位信号。
如果在WWDG向下计数器小于63进行复位,将产生一个复位信号。 */
// 复位WWDG的WR寄存器的值,防止使能后,窗口看门狗立即产生复位信号。
WWDG->WR = 0x7F;
// 使能窗口看门狗,并配置计数器值。
WWDG->CR = (uint8_t)((uint8_t)(0x80| 0x40) | (uint8_t)Counter);
// 配置窗口看门狗窗口值。
WWDG->WR = (uint8_t)((uint8_t)(~0x80) & (uint8_t)(0x40| WindowValue));
}
3.2、 通过寄存器操作初始化WWDG
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void _WWDG_Init(void)
{
/* WWDG 配置: WWDG 的时钟为 SYSCLK = fCPU */
/* WWDG 的超时时间为 maxSetCounterTime */
/* Watchdog 窗口 = (Counter- 63) * 1 step
= 64 * (12288 / fCPU)
= maxSetCounterTime s
*/
/* 禁止复位窗口 = (Counter- WindowValue) * 1 step
= (Counter- WindowValue) * (12288 / fCPU)
= minSetCounterTime s
*/
/* 禁止复位窗口范围为 0.0 ms 到 minSetCounterTime ms
Watchdog 窗口范围为 minSetCounterTime ms to maxSetCounterTime ms
如果在禁止复位窗口进行复位,将产生一个复位信号。
如果在Watchdog 窗口范围进行复位,将不产生复位信号。
如果在WWDG向下计数器小于63进行复位,将产生一个复位信号。 */
// 复位WWDG的WR寄存器的值,防止使能后,窗口看门狗立即产生复位信号。
WWDG->WR = 0x7F;
// 使能窗口看门狗,并配置计数器值。
WWDG->CR = (uint8_t)((uint8_t)(0x80| 0x40) | (uint8_t)Counter);
// 配置窗口看门狗窗口值。
WWDG->WR = (uint8_t)((uint8_t)(~0x80) & (uint8_t)(0x40| WindowValue));
}
请确保窗口看门狗的窗口值WindowValue <= 0x7F,否则WWDG->WR会溢出。
4、WWDG寄存器简介
- CR控制寄存器
- WR窗口寄存器
举报