窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口寄存器数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。 上面提到的 T6 即是窗口看门狗的自减计数器的第六位(最高位)。在该计数器的 T6 位变为 0 后(小于 0X40),就会引起一复位。这是窗口的下限。而当计数器的值在大雨窗口配置寄存器的窗口值之前就被修改的话,也会引起一次复位,这里窗口值是上限。窗口值是由用户自己设定的,根据实际要求来设计窗口值,但是一定要确保窗口值大于 0X40,否则窗口就不存在了
void main(void)
{
uint8_t Index;
GPIO_Init(LED3_PORT,LED3_PIN,GPIO_Mode_Out_PP_Low_Fast);
//输出低电平-高速10M
GPIO_Init(LED4_PORT,LED4_PIN,GPIO_Mode_Out_PP_Low_Fast);
//输出低电平-高速10M
GPIO_Init(KEY_PORT,KEY_PIN,GPIO_Mode_In_FL_IT);
//输入浮空-中断
/* Set PC1 sensitivity to falling edge and low level 下降沿低电平触发*/
EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling_Low);
/* Check if the MCU has resumed from WWDG reset */
if (RST_GetFlagStatus(RST_FLAG_WWDGF) != RESET)
{
/* IWDGF flag set */
/* Toggle LED3 */
for (Index = 7; Index != 0; Index--)
{
GPIO_ToggleBits(LED3_PORT,LED3_PIN);
Delay(0x7FFF);
}
/* Clear WWDGF Flag */
RST_ClearFlag(RST_FLAG_WWDGF);
}
/* WWDG configuration: WWDG is clocked by SYSCLK = 2MHz */
/* WWDG timeout is equal to 251,9 ms */
/* Watchdog Window = (COUNTER_INIT - 63) * 1 step
= 41 * (12288 / 2Mhz)
= 251,9 ms
*/
/* Non Allowed Window = (COUNTER_INIT - WINDOW_VALUE) * 1 step
= (104 - 97) * 1 step
= 7 * 1 step
= 7 * (12288 / 2Mhz)
= 43.008 ms
*/
/* So the non allowed window starts from 0.0 ms to 43.008 ms
and the alowed window starts from 43.008 ms to 251,9 ms
If refresh is done during non allowed window, a reset will occur.
If refresh is done during allowed window, no reset will occur.
If the WWDG down counter reaches 63, a reset will occur. */
WWDG_Init(COUNTER_INIT, WINDOW_VALUE);
/* enable interrupts by switching to level 0 */
enableInterrupts();
while (1)
{
/* Check if WWDG counter refresh is allowed in Allowed window */
if (AllowedRefresh != 0)
{
/* get WWDG counter value */
/* wait until WWDG counter becomes lower than window value */
while ((WWDG_GetCounter() & 0x7F) > WINDOW_VALUE);
/* Refresh WWDG counter during allowed window so no MCU reset will occur */
WWDG_SetCounter(COUNTER_INIT);
}
/* Check if WWDG counter refresh is allowed in non Allowed window */
if (NonAlowedRefresh != 0)
{
/* wait until WWDG counter becomes higher than window value */
while ((WWDG_GetCounter() & 0x7F) < WINDOW_VALUE);
/* Refresh WWDG counter during non allowed window so MCU reset will occur */
WWDG_SetCounter(COUNTER_INIT);
}
/* Toggle LED4 */
GPIO_ToggleBits(LED4_PORT,LED4_PIN);
Delay(0x6FFF);
}
}
关键字:学习笔记 窗口看门狗 WWDG
引用地址:
STM8L探索套件学习笔记-窗口看门狗WWDG(十七)
推荐阅读最新更新时间:2024-03-16 14:40
STM32中的独立看门狗和窗口看门狗
一、前言 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况。为了避免这种情况的出现,后期的MCU都集成了看门狗的功能。但是目前看门狗发展到今天基本上分为两大类:独立看门狗和窗口看门狗。 独立看门狗:使用的是外部时钟,即使主频不工作了,看门狗也能正常工作。只要在到达喂狗时间的上限前喂狗即表示程序是正常的,这点和窗口看门狗是有区别的。另外独立看门狗是独立于整个系统之外的,这也是独立看门狗名字的由来,他有自己独立的时钟,不受整个系统的影响,所以独立看门狗主要用来监控硬件上的错误。 窗口看门狗:使用芯片内部时钟。喂狗的时间既有上限又有下限,即喂狗太早或者太晚都不行,比如我要求你在0.8s到0.9s内完成
[单片机]
STM32学习笔记(四)---RCC
RCC: Reset Clock Control 复位和时钟控制器 RCC时钟框图—时钟树 系统时钟 对应的是图中黄色部分,下面的数字标号对应上面的红色标号1-6 1.HSE高速外部时钟信号 HSE是高速的外部时钟信号,可由有源晶振或无源晶振提供。 当使用有源晶振时,时钟从OSC_IN引脚进入,OSC_OUT引脚悬空。 当使用无源晶振时,时钟从OSC_IN和OSC_OUT进入,并且要配谐振电容。 注意:当HSE故障时候,不仅HSE会被关闭,PLL也会被关闭,此时高速的内部时钟信号HSI会作为备用的系统时钟,直到HSE回复正常,HSI=16M。 2.锁相环PLL PLL的主要作用是对时钟进行倍频,然后把时钟输
[单片机]
msp430学习笔记之中断处理函数
//本平台 msp430f149 #include msp430.h void select_xt2(void){ unsigned char i; /*------选择系统主时钟为8MHz-------*/ BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡噿 do{ IFG1 &= ~OFIFG; //清除晶振失败标志 for (i = 0xFF; i 0; i--); //等待8MHz晶体起振 }while ((IFG1 & OFIFG)); //晶振失效标志仍然存在_ BCSCTL2 |= SELM_2
[单片机]
XMEGA128学习笔记1-bootloader下载程序
首先需要感谢AVR和与非网举办这次AVR大赛,其次要感谢在学习板申请当中阿呆给予我们小组的帮助,最后要感谢我们的指导老师。我们小组将在论坛版块连载《XMEGA128学习笔记》系列,分享学习心得与大家共同探讨,也欢迎大家分享自己学习的心得,共同进步。 今天主要是叙述如何使用XMEGA的BOOTLODER功能下载程序。 首先请大家将附近的内容下载,由于论文附件大小的限制,Flip Installer - 3.4.3这个软件分成三个压缩包,需要大家一起解压,解压后进行安装,安装过程大家点击下一步就可以了。 第二个附件是“AVR1927_XMEGA-A1_Xplained_Example_Applications.zip”,这个压缩包是板
[单片机]
TQ2440 学习笔记—— 31、移植U-Boot【U-Boot 的启动过程第二阶段源码分析】
二、U-Boot第二阶段代码分析 U-Boot 第二阶段流程图 移植U-Boot 的主要工作在于对硬件的初始化、驱动,所以下面的重点放在硬件的操作上。 (1)初始化本阶段要使用到的硬件设备 最主要的是设置系统时钟、初始化串口,只要这两个设置好了就可以从串口看到打印信息。 board_init 函数设置MPLL、改变系统时钟,它是开发板相关的函数,在board/EmbedSky/EmbedSky.c 中实现。 board_init 函数还保存了机器类型ID,这将在调用内核时传给内核代码如下: 串口的初始化函数主要是 serial_init,它设置 UART 控制器,是CPU 相关的函数,在cpuarm92
[单片机]
MSP430学习笔记3-PWM的产生
这个程序主要是利用定时器的比较输出功能来产生PWM波控制LED,定时器A的比较输出对应P2.3 P2.4,因此在程序的一开始需要设置比较匹配的工作模式,需要说明的是头文件中已经对各种模式给了详细的定义,不需要在去配置寄存器,程序较为简单,稍微扩展一下去控制舵机也很容易,大家自己分析。 /******************************************************* 程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁 ------------------------------------------------------- 拨码开关设置:将LED位拨至ON,其余拨至OFF
[单片机]
msp430学习笔记之uart
1 相关知识 MSP430系列,usart模块的波特率值设定是通过以下三个参数决定的:UxBR0,UxBR1,UxMCTL 波特率=BRCLK/N BRCLK:时钟源,可以通过寄存器设定何为时钟源; N:波特率产生的分频因子。N=UxBR1+UxBR0+UxMCTL,其中UxBR1+UxBR0为整数部分,UxMCTL为设定小数部分 。 举个例子:波特率=9600,时钟源=32.768kHz N=32768/9600=3.41 很明显:UxBR1+UxBR0=13,即UxBR1=0,UxBR0=13。 首先把小数部分0.41×8=3.28,取整后为3。这个5的意思就是在UxMCTL中的8位里要有3个1,剩下来的就是怎么
[单片机]
STM32学习笔记:基础例子
本例子代码参考了STM32库开发实战指南中的代码,由于使用的板子是尚学STM32F103ZET6,为了配合板上已有资源,也参考了其配套代码。为了便于书写文本,我尽量将代码都写到了一个文件中,这种方式是不推荐的,在做具体工程时最好代码分类管理,使工程逻辑清晰。 现在对板上一些资源说明:板上有两个LED灯,引脚为PE5、PE6,均为ResetBits时点亮。有三个按钮,依次为黄色复位,红色PE4(按下接GND)、红色PA0(按下接3.3V,WAKE UP按钮)。ISP口为靠近电源开关的USB,也是USART1口。USART2口为PA3(Rx)、PA2(Tx)。IPD为高电平中断(按键一边接高电平),IPU为低电平中断。 接下来
[单片机]