1. 什么是WDG?
WDG代表看门狗(Watchdog)。这个IP的主要目标是检测和解决由软件故障引起的故障。原理是定期刷新WDG(或者称为“喂狗”),如果计数器没有被刷新,就会生成系统重置。此外,WDG作为一种保护措施,因为它避免了在处理的某个特定阶段卡住。使用选项字节进行配置可以由硬件或软件启动WDG。一旦启用,它只能通过重置来禁用。
2. WDG类型
有两种类型的WDG:
WWDG:窗口看门狗
IWDG:独立看门狗
窗口看门狗(WWDG)和独立看门狗(IWDG)是两种在微控制器中用于系统稳定性和可靠性保障的机制,它们各自有不同的特点和优势。
窗口看门狗(WWDG)的特点和优势:
- 双向时间窗口:WWDG有一个设定的时间窗口,必须在这个窗口内重置计数器,既不能太早也不能太晚。
- 中断功能:WWDG具有提前唤醒中断(EWI)功能,在计数器达到某个预设值时触发中断,给予系统一次避免复位的机会。
- 软件控制:WWDG通常只能通过软件来控制和重置。
- 更精准的时间控制:WWDG使用系统时钟源,可以提供更精准的时间控制。
独立看门狗(IWDG)的特点和优势:
- 简单易用:IWDG不需要在喂狗的时间窗口内操作,只要在计数器归零前重置即可。
- 硬件/软件启动:IWDG可以通过硬件或软件启动。
- 没有中断:IWDG不具备中断功能,一旦启动,如果在设定的时间内没有重置,就会引发复位。
- 内部时钟:IWDG通常由内部低速时钟驱动,即使主时钟发生故障,它也仍然有效。
应用场景:
- WWDG适用于需要在特定时间窗口内进行系统监控的应用,如在系统即将复位前保存重要数据或状态。
- IWDG适用于需要简单持续监控的应用,它提供了一种基本的保护,以防止系统长时间运行在异常状态。
选择WWDG还是IWDG取决于具体的应用需求。如果需要在系统复位前执行一些关键操作,WWDG可能是更好的选择。如果需要一个简单且可靠的监控机制来防止长时间的系统故障,IWDG可能更适合。在设计系统时,两种看门狗有时会结合使用,以提供更全面的保护。
2.1 WWDG:窗口看门狗
2.1.1 定义
窗口看门狗基于一个7位的递减计数器,可以设置为自由运行。它可以用作看门狗,在出现问题时重置设备。它由主时钟驱动。它具有早期警告中断能力,计数器可以在调试模式下冻结。
2.1.2 应用优势
最适合需要看门狗在准确时间窗口内响应的应用。
通过预分频器值配置可变的时间窗口
可选择硬件或软件启动
在重置发生之前提供早期唤醒中断(EWI)
WWDG(窗口看门狗)的早期警告中断(Early Wakeup Interrupt,EWI)功能是一种在系统即将因为看门狗超时而发生重置之前提供的一种中断机制。这种设计允许系统在实际重置之前有机会采取一些预防措施或记录错误信息,从而提高系统的稳定性和可靠性。
以下是EWI功能的实现方式和它在系统设计中的角色:
EWI可以通过以下方式实现:
-
预设时间窗口:WWDG通过一个可配置的预分频器来设置一个时间窗口,在该时间窗口内,系统必须重置看门狗计数器。
-
计数器递减:系统运行时,WWDG的计数器会递减,直到达到0。
-
早期警告中断:在计数器达到0之前的某个预设点,WWDG会产生一个中断(EWI),通知系统看门狗即将超时。
-
中断处理:系统可以通过编写中断服务程序来响应这个EWI,进行必要的处理,比如记录日志、尝试稳定系统状态或执行其他安全措施。
-
重置:如果在EWI发生后,系统没有成功重置看门狗计数器,计数器最终会达到0,此时WWDG将引发系统重置。
EWI在系统设计中具有重要作用:
-
错误恢复:EWI为系统提供了在完全崩溃前进行错误恢复的机会,可以通过软件干预来尝试恢复系统的正常运行。
-
日志记录:在系统即将重置之前,EWI可以触发日志记录,保存系统状态和错误信息,这对于事后分析和调试非常重要。
-
状态保护:对于某些关键任务系统,EWI可以触发状态保护机制,确保关键数据的完整性和一致性。
-
系统监控:EWI可以作为系统监控的一部分,帮助系统管理员或自动监控系统及时发现潜在的问题。
-
用户通知:在某些应用中,EWI可以用来通知用户或操作员,以便他们可以采取适当的行动。
-
安全特性:对于需要高安全性的系统,EWI可以作为安全特性的一部分,确保在系统出现异常时能够及时响应。
编程配置WWDG的EWI功能
配置WWDG(窗口看门狗)的早期警告中断(EWI)功能通常涉及几个步骤,这些步骤可能因不同的微控制器(MCU)型号和制造商而异。以下是一个通用的步骤指南,用于通过编程配置WWDG的EWI功能:
步骤1:启用WWDG时钟
在大多数微控制器中,需要先启用WWDG的时钟。这通常通过设置相应的时钟控制寄存器来完成。
RCC->APB1ENR |= RCC_APB1ENR_WWDGEN; // 举例,具体寄存器和位字段可能不同
步骤2:配置WWDG预分频器和计数器值
接下来,配置WWDG的预分频器和计数器的初始值。预分频器和计数器的值决定了看门狗的超时时间。
WWDG->CFGR = WWDG_CFGR_WIN(0x3F) | WWDG_CFGR_PSC(0x7); // 举例,设置窗口和预分频器值
步骤3:启用WWDG
在配置了预分频器和计数器值之后,可以启用WWDG。
WWDG->CR |= WWDG_CR_T; // 举例,启动WWDG
步骤4:配置中断
为了使用EWI功能,需要配置并启用相应的中断。这通常涉及到设置中断优先级和使能中断。
NVIC_SetPriority(WWDG_IRQn, 0); // 设置中断优先级
NVIC_EnableIRQ(WWDG_IRQn); // 使能中断
步骤5:编写中断服务例程
实现WWDG中断服务例程,该例程将在WWDG发出EWI时被调用。
void WWDG_IRQHandler(void) {
if (WWDG->SR & WWDG_SR_EWIF) {
// 执行必要的操作,如记录日志、尝试稳定系统等
WWDG->SR &= ~WWDG_SR_EWIF; // 清除中断标志
}
}
步骤6:定期重置WWDG计数器
在系统正常运行期间,必须定期重置WWDG的计数器,以防止它超时并触发重置。
复制
WWDG->CR |= WWDG_CR_T; // 重置计数器,具体位字段可能不同
通过这种方式,WWDG的EWI功能不仅提高了系统的鲁棒性,还为系统设计者提供了更多的灵活性来处理潜在的软件故障。
2.1.3 WWDG的工作机制
下图说明了WWDG的工作原理。如果计数器重新加载得太早或太晚,窗口看门狗将启动重置。
在下面的框图中,计数器的值和窗口值被比较,以评估在可配置窗口内刷新递减计数器的时间。
2.2 独立看门狗(IWDG)
2.2.1 定义:
独立看门狗基于一个12位的递减计数器和8位的预分频器。它由一个独立的32 kHz内部RC(LSI)驱动,并且由于它独立于主时钟运行,因此它可以在停止和待机模式下工作。它可以用作家用设备出现问题时重置设备的看门狗,或者用作应用程序超时管理的自由运行定时器。它可以通过选项字节通过硬件或软件进行配置。在调试模式下,计数器可以被冻结。
2.2.2 应用优势:
- 完全独立于主应用程序之外的处理过程。
- 由于预分频器的值,超时周期可配置(例如,STM32L476xx具有从125微秒到32.7秒的可编程超时范围)。
- 可选择硬件或软件启动。
- 可选择在待机或停止模式下冻结的低功耗。
2.2.3 IWDG的工作机制
IWDG的结构如下所示:
在上述框图中可以看到,IWDG(独立看门狗)寄存器位于CORE(核心)电压域,而其功能则位于VDD电压域。8位预分频器用于分频LSI(低频内部RC振荡器)的振荡频率。当IWDG启动时,12位计数器从重置值0xFFF开始向下计数。为了刷新IWDG计数器,必须将密钥值(0xAAAA)写入密钥寄存器以重新加载计数器的值。如果递减计数器到达计数值的末尾(0x000),则会产生系统重置。
在独立看门狗的配置和操作中,以下几点是关键:
CORE电压域:IWDG的寄存器和控制逻辑位于核心电压域,这意味着它们与微控制器的核心逻辑紧密相关,并受核心电源电压供电。
VDD电压域:IWDG的功能,包括其计数器和时钟电路,位于VDD电压域,这表明它们由系统的主电源电压供电。
预分频器:8位预分频器用于降低LSI振荡器的频率,从而设定IWDG计数器的计数速率。
计数器重置值:IWDG的12位计数器在启动时从0xFFF开始计数。
刷新计数器:为了重置或刷新计数器,需要向密钥寄存器写入特定的密钥值(0xAAAA),这将计数器的值重新加载为初始值。
系统重置:如果计数器递减到0x000并且在此期间没有写入刷新值,IWDG将引发一个系统重置,以此来防止程序运行失控或系统故障。
2.2.4IWDG触发复位的条件
IWDG(独立看门狗)定时器会在以下情况下触发系统重置:
计数器归零:IWDG内部有一个12位的递减计数器,如果计数器从其初始值开始递减到0(0x000),并且在此过程中没有通过写入特定的“喂狗”值(如0xAAAA)来刷新它,IWDG将生成一个系统重置。
未及时刷新:在计数器递减至0之前,如果没有及时对IWDG进行“喂狗”操作,即没有写入正确的值到IWDG的控制寄存器,计数器最终会达到0,触发系统重置。
调试模式未冻结:如果在调试模式下IWDG计数器没有被冻结,且计数器递减到0,IWDG同样会触发系统重置。通常,在JTAG或SWD调试时,可以通过设置特殊的调试寄存器来冻结IWDG计数器。
电源模式变化:即使在微控制器进入低功耗模式(如待机或停止模式)时,IWDG仍然可以使用其内部的低频时钟继续计数。如果在低功耗模式下计数器递减到0,IWDG也会触发系统重置。
外部干扰:如果外部干扰或异常情况导致MCU无法正常运行并刷新IWDG,计数器可能会递减到0,从而导致系统重置。
软件错误:软件中的错误,如死循环或异常,如果没有设计适当的机制来刷新IWDG,也可能导致计数器递减到0并触发系统重置。
硬件故障:严重的硬件故障,如内存损坏或外设故障,如果影响了MCU的正常运行,可能导致无法刷新IWDG,最终触发系统重置。
3. 看门狗应用示例
窗口看门狗(WWDG)被设置如下:
时钟计数器预分频器(Nwwdg_prescaler):8 窗口值(Nwindow):80 自由运行递减计数器值(Nrefresh):128
这些设置定义了WWDG的行为:
-
时钟计数器预分频器(Nwwdg_prescaler):预分频器的值决定了WWDG计数器计数的速率。预分频器为8意味着WWDG的时钟将被系统时钟除以8。
-
窗口值(Nwindow):这个值定义了WWDG的一个可刷新计数器值的上限。在WWDG开始计数之后,系统必须在这个值以上时刷新计数器,否则WWDG将引发复位。
-
自由运行递减计数器值(Nrefresh):这是WWDG计数器的初始值,计数器将从这个值开始递减。当计数器递减到0时,如果没有在窗口值以上进行刷新,WWDG将触发系统复位。
示例初始化代码如下:
/* Infinite loop */ { HAL_Delay(20); // because (1/80000000)*4096*8*(127-80+1)) ~ 20ms HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); if (HAL_WWDG_Refresh(&hwwdg) != HAL_OK) { Error_Handler(); } }