为什么工业级无线路由器这么重视软硬件看门狗,今天我们就来看看软硬件看门狗区别。 工作原理:在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。 所以在使用有看门狗的芯片时要注意清看门狗。 4) 初始化:硬件看门狗上电后收到第一个喂狗脉冲就完成了初始化,软件看门狗则需要配置相关的寄存器(或者调用相关的看门狗子程序)。 软件和硬件的看门狗的最主要差异在于开启看门狗的时机,软件看门狗必须初始化(配置)看门狗才能使用,如果软件看门狗是厂商提供的SDK中的一个API接口,开发者又没有能力修改底层的uboot、内核,无法在uboot
stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。 独立看门狗是限制喂狗时间在0-x内,x由你的相关寄存器决定。喂狗的时间不能过晚。 图1 窗口看门狗的 上窗口就是配置寄存器WWDG->CFR里设定的W[6:0]; 下窗口是固定的0x40; 当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。 当外部中断发生(按下PA0按键),长时间不喂狗,引发窗口看门狗复位。 直接操作寄存器 相关寄存器如下: 控制寄存器WWDG->CR:低8位有效。 第8位为WDGA,看门狗激活位。 除以4096)除以4 11: CK计时器时钟(PCLK1除以4096)除以8 低7位[6:0]:为窗口值。 WWDG counter clock = (PCLK1/4096)/8 /* WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms) —PCLK1=8MHZ
在正式的产品开发中,软件中要加入看门狗,以确保系统安全和软件跑飞后可以复位到安全状态,最近一直在用NXP的K64,所以今天就以K64为例来说明,软件看门狗的使用。 首先像学其他外设一样先来看K64看门狗的框图 ? 由图就可以清楚的搞清楚他的工作流程和软件操作思路,在结合SDK的帮助,你 就可以轻松上手。 别忘了使能,其中比较重要的一点是配置时钟和看门狗定时器的值,从上图中就可以看出K64的看门狗模块由两种时钟可选,我比较喜欢用LPO时钟1kHz。 这样计算看门狗时间例如为2秒的喂狗周期,则timeoutValue 应为2000,如下图所示: ? 如果由多任务还要考虑在多个地方清狗。 喂狗可以直接使用SDK的喂狗函数 ? 注释掉喂狗程序和注释掉清狗程序一样都会引起复位,且测试方法相同,至此验证了我们的软件看门狗功能符合设计需求。
看门狗机制,博客从原理、分类、实现到注意事项全面覆盖,符合技术文档的规范性和实用性要求。 看门狗机制的核心原理 看门狗是一种用于监控系统运行状态的硬件或软件机制。 若系统未在规定时间内响应,看门狗会触发复位信号,强制系统重启以恢复稳定状态。 窗口看门狗的特点与应用 窗口看门狗要求系统必须在预设的时间窗口内完成定时器重置操作。 以下是一个窗口看门狗的伪代码逻辑示例: while (system_running) { if (current_time > reset_window_max || current_time < reset_window_min) { trigger_reset(); } feed_watchdog(); // 重置看门狗定时器 } 独立看门狗的特性与实现 独立看门狗通过固定超时周期工作 硬件/软件选择:硬件看门狗抗干扰能力强,软件看门狗灵活性高。 常见问题与解决方案 误复位:检查任务调度是否阻塞喂狗操作。 看门狗失效:验证硬件连接或软件初始化代码。
IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值 设置看门狗的重装载值的函数是: void IWDG_SetReload(uint16 . */ void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能对寄存器IWDG_PR 4)设置计数器初始值并使能看门狗 这一步在库函数里面是通过一个函数实现的: void WWDG_Enable(uint8_t Counter); 该函数既设置了计数器初始值,同时使能了窗口看门狗。 static u8 WWDG_CNT=0x7f; /*保存WWDG计数器的设置值,默认为最大. */ /** * 初始化窗口看门狗 * tr :T[6:0],计数器值 * wr :W[6:0],窗口值 * fprer:分频系数(WDGTB),仅最低2位有效 * Fwwdg=PCLK1/(4096*2^fprer). */ void WWDG_Init(u8 tr,u8 wr,u32 fprer) {
前言: 今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使用 两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误引起的故障。当计数器达到给定的超时值时,触发一个中断(仅适用窗口看门狗)或者产生系统复位。 Tout=((4×2^PRER) ×RLR)/LSI时钟频率 对应不同预分频系数的PRER值: 3时钟源设置 1选择外部时钟HSE 8MHz 举例: HAL_IWDG_Refresh(&hiwdg); //看门狗喂狗 使用该函数定时喂狗即可 WWDG-窗口看门狗 窗口看门狗的定义 窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数 WWDG时钟预分频系数 8 WWDG上窗口值 0x5F WWDG计数器值 : 0x7F 设置看门狗提前唤醒中断 3 使能窗口看门狗中断 其余配置与独立看门狗相同配置即可 HAL库独立窗口狗函数库讲解
IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值 设置看门狗的重装载值的函数是: void IWDG_SetReload(uint16 . */ void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能对寄存器IWDG_PR 4)设置计数器初始值并使能看门狗 这一步在库函数里面是通过一个函数实现的: void WWDG_Enable(uint8_t Counter); 该函数既设置了计数器初始值,同时使能了窗口看门狗。 static u8 WWDG_CNT=0x7f; /*保存WWDG计数器的设置值,默认为最大. */ /** * 初始化窗口看门狗 * tr :T[6:0],计数器值 * wr :W[6:0],窗口值 * fprer:分频系数(WDGTB),仅最低2位有效 * Fwwdg=PCLK1/(4096*2^fprer). */ void WWDG_Init(u8 tr,u8 wr,u32 fprer) {
这个类实现了程序退出能重启,但是程序停止运行弹出对话框,进程并没有退出却无法重启。希望有好建议处理这个bug的朋友提出你们的宝贵意见。 源码如下:
IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值 设置看门狗的重装载值的函数是: void IWDG_SetReload(uint16 . */ void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); /* 使能对寄存器IWDG_PR 4)设置计数器初始值并使能看门狗 这一步在库函数里面是通过一个函数实现的: void WWDG_Enable(uint8_t Counter); 该函数既设置了计数器初始值,同时使能了窗口看门狗。 static u8 WWDG_CNT=0x7f; /*保存WWDG计数器的设置值,默认为最大. */ /** * 初始化窗口看门狗 * tr :T[6:0],计数器值 * wr :W[6:0],窗口值 * fprer:分频系数(WDGTB),仅最低2位有效 * Fwwdg=PCLK1/(4096*2^fprer). */ void WWDG_Init(u8 tr,u8 wr,u32 fprer) {
为了避免应用陷入错误状态导致界面无响应,Apple 设计了看门狗 (WatchDog) 机制。一旦超时,强制杀死进程。 8badf00d = ate bad food,大概是在说看门狗吃了坏的食物所以暴走了?!异常记录则表示这并不是一次崩溃(邪魅一笑:强制退出而已)。信息一栏指出时间限制为 20 s。 同步网络请求,主线程,超长超时时间,满足这三点,一定场景下几乎必然会触发看门狗机制。 对策 合理解决方案: 异步网络请求:优点很多,最重要的是可以让你无忧无虑安全地访问网络,而无需担心线程。 此外,一部分情况下,例如这次遇到登录和模版同步时触发看门狗,事实上,即使在运用到模版时再次请求也是勉强可行的,因此姑且先跳过网络请求也可以。 应用的网络部分基于公司的通用框架,因此优先考虑在非主线程中进行网络请求来避免触发看门狗。 至于调试模式下为什么可以正常启动应用,完全是因为该模式下看门狗机制处于禁用状态。
/*此程序实现单片机”看门狗”WDT的功能*/ #include”p18f458.h” unsignedlongi; /*系统初始化子程序*/ voidinitial() { TRISD = 0X00 口设为输出*/ } /*延时子程序*/ voidDELAY() { for(i=19999;–i;) continue; } /*主程序*/ main () { initial();/*初始化,设定看门狗的相关寄存器 0X00;/*D口送00H,发光二极管亮*/ DELAY();/*给予一定时间的延时*/ PORTD = 0XFF;/*D口送FFH,发光二极管灭*/ while(1) { ; }/*死循环,等待看门狗溢出复位 */ } ——————-汇编语言版本的单片机看门狗程序—————- ;此程序实现”看门狗”WDT的功能 ;此单片机看门狗由http://www.51hei.com独家提供 LISTP=18F458 INCLUDE MOVLW0X00 MOVWFPORTD;D口送00H,发光二极管亮 CALLDELAY MOVLW0XFF MOVWFPORTD;D口送FFH,发光二极管灭 LOOP GOTOLOOP;死循环,等待看门狗复位
---- 前言 看门狗 看门狗的含义:当一切正常时,看门狗不会有什么反应,但是出现异常情况时,看门狗就会叫,并把异常情况阻挡在门外。 一般来说,看门狗我们也叫他看门狗定时器,从本质上面来看,其实它就是一个计数器,在使用的时候,我们需要给它一个数值,随后看门狗的计数器根据计数方向开始累计,在看门狗的计数器达到预设的数值之前,我们可以进行重置看门狗计数器的操作 软件方面,看门狗模块需要由程序员编写相应的代码实现,具体过程如下: 初始化看门狗模块,包括设置看门狗定时器的超时时间和模式等参数。 当看门狗定时器达到预设的超时时间时,会产生看门狗中断,并自动复位系统。 同时也可以通过设置看门狗模块的 RSTEN 位实现看门狗产生复位信号直接重启系统。
目录 1、IWDG 1.1 独立看门狗简介 1.2 独立看门狗的特点 1.3 独立看门狗功能描述 1.4 硬件看门狗 1.5 寄存器访问保护 1.6 调试模式 2、WWDG 2.1 简介 2.2 窗口看门狗主要特点 2.3 窗口看门狗功能说明 2.4 如何设置看门狗超时 2.5 调试模式 3、区别 1、IWDG 1.1 独立看门狗简介 IWDG(Independent watchdog)独立看门狗,可以用来检测并解决由于软件错误导致的故障 当计数器值到达0,会产生一个复位信号(独立看门狗复位) 无论何时向关键字寄存器写入0XAAAA,IWDG_RLR的数值会重载进计数器,避免看门狗复位 1.4 硬件看门狗 如果通过器件选项位使能“硬件看门狗 WWDG 最适合那些要求看门狗在精确计时窗口起作用的应用程序 为什么要窗口看门狗? 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看门狗就检测不出来了; 如果使用窗口看门狗
(freq为8位预分频器的值,递减计数器所用到的时钟频率) 独立看门狗由专用的低速时钟(LSI)驱动,LSI频率是40K。 根据手册中该寄存器的配置关系是:000对应4分频,001对应8分频,010对应16分频…由此得出预分频因子与prer的值关系是:预分频因子=4*2prer=2(prer+2)。 //取消写保护:0x5555使能 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR void IWDG_SetReload(uint16 __WDG_H #include"sys.h" void IWDG_Init(u8 prer, u16 rlr); #endif iwdg.c #include"iwdg.h" void IWDG_Init #include "key.h" #include "sys.h" #include "beep.h" #include "iwdg.h" int main(void) { vu8
IWDG_Init(u8 prer,u16 rlr) 2 { 3 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //①使能对寄存器 I 写操作 注意不能大于0xfff 6 IWDG_ReloadCounter(); //③按照 IWDG 重装载寄存器的值重装载 IWDG 计数器 7 IWDG_Enable(); //④使能 IWDG 8 6 位 窗口看门狗的配置工作代码: 1 void WWDG_Init(u8 tr,u8 wr,u32 fprer) 2 { 3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG WWDG_EnableIT(); //开启窗口看门狗中断 12 } 13 //重设置 WWDG 计数器的值 14 void WWDG_Set_Counter(u8 cnt) 15 { 16 8 11 while(1) 12 { 13 LED0=1; 14 } 15 } 使用区别 再来分析一下独立看门狗(IWDG)和窗体看门狗(WWDG)的区别: (
微控制器定时器的参数配置(其他型号大同小异,本文侧重讲解配置,至于各类定时器的特点后续再述),STM32定时器种类繁多有通用定时器、基本定时器、独立看门狗定时器、窗口看门狗定时器等。 AAAA 写到密钥寄存器中,计数器将会重载,从而避免产生看门狗复位,独立看门狗框图如下所示: ? 独立看门狗定时器时钟由LSI振荡器提供,STM32L011中LSI频率为37KHZ,看门狗定义周期时间的方式和基本、通用类型可编程定时器完全一致,假设定义1秒周期的看门狗定时器,超过1秒不喂狗就进行系统复位 3、窗口看门狗定时器 窗口看门狗定时器是可编程的自由运行递减计数器,窗口看门狗激活后当递减计数器值小于 0x40(从 0x40 递减到 0x3F) 时复位,在窗口阈值之外重载递减计数器时也会复位,只有在 01:CK 计数器时钟 (PCLK div 4096) 分频器 2、10:CK 计数器时钟 (PCLK div 4096) 分频器 4和11:CK 计数器时钟 (PCLK div 4096) 分频器 8;
看门狗的作用:防止单片机因未知原因死机或比我们预期的时间过长长时间不能响应,如果出现这种问题,看门狗就会把单片机复位 独立看门狗(IWDG): 时钟来源:内部低速时钟(LSI),所以用看门狗时不需要配置时钟 位1:RVU:看门狗重装载值更新状态位,1:指示重装载值正在更新,重载值只有在 RVU 位为 0 时才可更新。 IWDG->KR=0XCCCC; } 窗口看门狗(WWDG): 时钟来源:APB1时钟,使用时应先使能时钟,这一点与独立看门狗不一样 会先分频4096倍,再分2^WDGTB,所以WWDG超时公式如下 WWDG还有一个中断(提前唤醒中断),作用是当递减寄存器到0X40时会进入中断 一般配置过程: 寄存器: WWDG_CR: 32位,只用到低8位 位7:WDGA 激活位 位6:0 :这些位用来存储看门狗计数器的值 位8:7 :WDGTB(TIME Base ),用来分频 位6:0 :窗口置,要大于0x3f WWDG_SR: 位0:EWIF(Early Weakeup Interrupt Flag),在中断服务程序中要置
一、为什么需要看门狗? 运行程序很容易受到外界电磁场的干扰,从而造成程序运行错误甚至造成跑飞现象,从而陷入死循环,程序的正常运行被打乱,从而造成不可预料的严重后果,于是人们就设计了一款用于实时监测计算机运行状态的芯片,我们就将其称为看门狗 二、看门狗的作用 看门狗会无时无刻的去喂狗,如果程序发生跑飞的现象,那么单片机程序就不能继续去喂狗,继而计数器计数到0,看门狗产生复位脉冲信号。 三、看门狗工作原理 看门狗开始从复位值 0xFFF 递减计数,每次递减1计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。 那么看门狗是如何实现实时监测程序的呢?看门狗会无时无刻的去喂狗,如果程序发生跑飞的现象,那么单片机程序就不能继续去喂狗,继而计数器计数到0,看门狗产生复位脉冲信号。
从制造业、金融服务到公共部门的行业中的公司信任云服务提供商及其关键的数据,软件即服务(SaaS)应用程序(如Office 365和Salesforce)的快速增长取决于信任。但是,SaaS在IT安全专
5 //rlr:重装载寄存器值:低11位有效. 6 //时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms). 7 void IWDG_Init(u8 prer,u16 rlr 20 } 21 22 int main(void) 23 { 24 Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz 25 delay_init u8 WWDG_CNT=0x7f; //初始化窗口看门狗 //tr :T[6:0],计数器值 //wr :W[6:0],窗口值 //fprer:分频系数(WDGTB),仅最低2位有效 一般PCLK1=45Mhz void WWDG_Init(u8 tr,u8 wr,u8 fprer) { RCC->APB1ENR|=1<<11; //使能wwdg时钟 LED0=1; //关闭LED0 }; } 测试程序中设置的计数器值为0x7F,窗口计数器为0x5F,分频数为8,时钟45MHz,最大复位时间约46ms。