目录
一、引言
在嵌入式系统中,可靠性是至关重要的。为了防止系统因软件故障或外部干扰而出现死机或异常情况,通常会使用看门狗(Watchdog)机制。STM32 系列微控制器提供了两种看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。本文将重点介绍 STM32 的独立看门狗。
二、独立看门狗的作用
独立看门狗主要用于在系统出现故障时,自动复位系统,以确保系统的正常运行。它独立于主系统时钟,即使主系统时钟出现故障,独立看门狗仍然可以正常工作。
当系统正常运行时,软件需要定期地 “喂狗”(即向独立看门狗写入特定的值),以防止看门狗超时。如果软件出现故障,未能及时 “喂狗”,独立看门狗将在超时后产生复位信号,使系统重新启动。
三、独立看门狗的工作原理
1.时钟源
独立看门狗使用内部低速时钟(LSI)作为时钟源。一般情况下,LSI 的频率为 32kHz 左右。这个时钟源独立于系统的主时钟(如 HSI、HSE 等),即使主时钟出现故障,独立看门狗仍然可以正常工作。
2.计数器
独立看门狗包含一个递减计数器。当计数器的值从预设的重载值开始递减,减到 0 时,独立看门狗将产生复位信号。
软件可以通过向独立看门狗的关键寄存器写入特定的值来重新加载计数器,这个操作通常被称为 “喂狗”。
3.喂狗操作
在系统正常运行时,软件必须在独立看门狗计数器递减到 0 之前进行喂狗操作,以防止系统复位。
喂狗的过程通常是向独立看门狗的键寄存器(IWDG_KR)写入特定的序列值。例如,先写入 0x5555,然后再写入 0xAAAA,以启动喂狗操作并重新加载计数器。
4.超时时间计算
独立看门狗的超时时间取决于预分频系数和重载值。计算公式为:
超时时间 = (预分频系数 × 重载值) / LSI 频率
例如,如果预分频系数设置为 4,重载值为 1000,LSI 频率为 32kHz,则超时时间为
(4×1000) / 32000 = 0.125 秒(125 毫秒)。
5.复位机制
当独立看门狗计数器减到 0 时,它会向系统发出复位信号,强制系统重新启动。
这个复位信号是独立于系统的其他复位源的,并且具有较高的优先级,确保在系统出现故障时能够及时进行复位操作。
四、独立看门狗相关寄存器
1.键寄存器(IWDG_KR)
- 地址偏移:0x00。
- 功能:用于启动喂狗操作、使能对寄存器的写访问以及启动独立看门狗。
- 位描述:
- 位 0-5:保留。
- 位 6(RLK):寄存器锁键位,用于锁定对寄存器的写访问,防止意外写入。当写入 0x0000AAAA 时,该位清 0,表示解锁寄存器,可以进行写操作。
- 位 7(PVU):预分频值更新位,当写入 0x00005555 时,该位清 0,允许修改预分频值和重载值。
- 位 15(EWI):早期唤醒中断标志位,当独立看门狗计数到接近超时值时(提前一个 LSI 时钟周期),该位由硬件置 1。如果使能了早期唤醒中断(IWDG->IER 寄存器),则会产生中断。
- 写入序列:
- 要启动喂狗操作,先写入 0xAAAA 到 IWDG_KR。
- 要使能对寄存器的写访问,先写入 0x5555 到 IWDG_KR。
2.预分频寄存器(IWDG_PR)
- 地址偏移:0x04。
- 功能:设置独立看门狗的预分频系数。
- 位描述:
- 位 0-2:PR [2:0],预分频值,可设置为 4、8、16、32、64、128、256 等不同的值。
- 例如,设置为 0x03 表示预分频系数为 64。
3.重载寄存器(IWDG_RLR)
- 地址偏移:0x08。
- 功能:设置独立看门狗的重载值,决定了看门狗超时的时间。
- 位描述:
- 位 0-11:RL [11:0],重载值,取值范围为 0-4095。
- 例如,设置为 0xFFF 表示重载值为 4095。
五、代码实现
#include "stm32f10x.h"
// 初始化独立看门狗
void IWDG_Init(void)
{
// 使能对独立看门狗寄存器的写访问(向 IWDG_KR 写入 0x5555)
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
// 设置独立看门狗的预分频系数和重载值
IWDG_SetPrescaler(IWDG_Prescaler_64); // 预分频系数为 64
IWDG_SetReload(1000); // 重载值为 1000
// 启动独立看门狗
IWDG_Enable();
}
// 喂狗操作
void IWDG_Feed(void)
{
IWDG_ReloadCounter();
}
int main(void)
{
// 初始化独立看门狗
IWDG_Init();
while (1)
{
// 模拟系统正常运行的一些操作
// 定期喂狗,防止看门狗超时复位
IWDG_Feed();
}
}
在上述代码中:
IWDG_Init
函数用于初始化独立看门狗,包括使能写访问、设置预分频系数和重载值以及启动独立看门狗。IWDG_Feed
函数用于进行喂狗操作,即重新加载计数器。- 在
main
函数中,首先初始化独立看门狗,然后在主循环中模拟系统正常运行的操作,并定期调用喂狗函数。
六、注意事项
1.喂狗时间
软件需要确保在独立看门狗超时之前进行喂狗操作。如果喂狗时间间隔过长,可能会导致独立看门狗超时,系统复位。
2.时钟源稳定性
独立看门狗使用内部低速时钟(LSI)作为时钟源。这个时钟源的稳定性可能不如主系统时钟,因此在设置超时时间时需要考虑时钟源的稳定性。
3.中断处理
在某些情况下,可能需要在中断处理程序中进行喂狗操作。需要注意的是,中断处理程序的执行时间不能过长,以免影响喂狗操作的及时性。
七、总结
STM32 的独立看门狗是一种非常重要的可靠性机制,可以在系统出现故障时自动复位系统,确保系统的正常运行。在使用独立看门狗时,需要注意喂狗时间、时钟源稳定性和中断处理等问题,以确保独立看门狗能够正常工作。希望本文对大家理解和使用 STM32 的独立看门狗有所帮助。