历史上的今天
今天是:2024年09月29日(星期日)
2021年09月29日 | STM8S(105K4)使用笔记——窗口看门狗WWDG的基础配置
2021-09-29 来源:eefocus
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);
}
例子(获得最大范围窗口范围):
fCPU = 16Mhz;
COUNTER_INIT = 127;
WINDOW_VALUE = 127;
#define WINDOW_VALUE 127
#define COUNTER_INIT 127
/**
* @brief WWDG Initialization Function
* @param None
* @retval None
*/
static void _WWDG_Init(void)
{
/* WWDG 配置: WWDG 的时钟为 SYSCLK = 16Mhz = 16 000 000 hz */
/* WWDG 的超时时间为 49.152 ms */
/* Watchdog 窗口 = (127 - 63) * 1 step
= 64 * (12288 / 16 000 000)
= 49.152 ms
*/
/* 禁止复位窗口 = (127 - 127) * 1 step
= (127 - 127) * (12288 / 16 000 000)
= 0.0 ms
*/
/* 禁止复位窗口范围为 0.0 ms 到 0.0 ms
Watchdog 窗口范围为 0.0 ms to 49.152 ms
如果在禁止复位窗口进行复位,将产生一个复位信号。
如果在Watchdog 窗口范围进行复位,将不产生复位信号。
如果在WWDG向下计数器小于63进行复位,将产生一个复位信号。 */
WWDG_Init(COUNTER_INIT, WINDOW_VALUE);
}
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窗口寄存器
史海拾趣
|
此电路结构简单,取材容易,性能可靠,操作方便。工作原理:假设水箱内没有水,需要进水预热,只要将K1合上(见下图),则绿色指示灯亮,电磁阀经J1-2常闭触点得电而开阀进水,待水箱内水升至平面S1时,BG1、BG2组成的复合管得正向偏压而驱动继电 ...… 查看全部问答> |
|
fopen打开的文件,如何实现当文件达到一定大小后,重头进行覆盖写入 我的那个文件要求记录5000条记录,超过5000条时,重头开始写入,用新的记录覆盖掉旧的记录。fopen就那几种打开方式,我试了下,好像都不支持。如果以“a+“的方式打开,然后用seek去定位,然后再写入也不行,仍然会加到文件尾。各位有没有什么好的 ...… 查看全部问答> |
|
usb驱动问题!!!dispatch_level在callusbdi下不可用!!急急急!! callusbdi windows wdm设备驱动程序开发指南(chris cant) 在dispatch_level调用出现死等,但是在passive_level正常 书上也说只能在Passive_level调用,是什么原因呢,怎样才能在dispatch_level调用呢? 高手快来啊 NTSTATUS CallUSBDI(IN PDEV ...… 查看全部问答> |
|
设计了一种基于Ms P 4 3 0处理器的温控系统, 介绍了系统主要硬件, 重点介绍了温度控制系统及其算法的实现, 这里采用的是史密斯一 模糊自调整 P I D控制系统, 该系统通过对传统的史密斯预估器进行改良, 将该模糊自调整P I D控制器引入史密斯控 ...… 查看全部问答> |
|
YM12864R读函数为什么读不出正确的数据,总是0xff,调了好久都没弄好,网上也有人有同样的问题,但是好像都没有解决,急求帮助uchar LcdRdata(void){ uchar getdata; RS=1; WRD=1; P0=0xff; E=0; E=1; delay(100); getdata=P0; E=0; return getdata ...… 查看全部问答> |
|
我在早上9点半玩易电源拼图游戏,发现电容电感问题,明显是错误的,而且后来更正过来了,那么在之前得100分的朋友们,你们难道没有发现这个简单的错误吗?如果发现了,为什么还跟着错?难道就为了那100分?为了奖品机会? 作为技术人员,发现问题 ...… 查看全部问答> |
|
基于安卓/苹果的物品防盗管家,用于对随身箱包和贵重物品进行管理 利用手机作为监控终端,既简便又易用,同时如果手机被人拿走的话,通讯断开,手机和开发模块都会报警。 1. 通过蓝牙与手机进行数据互联,若发送报警信息或是“心跳同步”时,通讯没有相应,则发送方进行报警 2. 检测光线有强烈变化时,进行报警 ...… 查看全部问答> |
|
晒WEBENCH设计的过程+DC8-16V转5V/1A车载充电器的设计过程 本帖最后由 a736015 于 2014-5-29 17:14 编辑 一、设计要求:输入DC8-16V,输出5V/1A二、应用:车载手机平板电脑充电器三、设计过程根据论坛窗口或进入TI在线设计工具页面 点击后进入到登陆(注册)界面 注册TI账号后进入WEBENCH在线设计工具在 ...… 查看全部问答> |




