IWDG(Independent Watchdog)是STM32微控制器中的独立看门狗。它是一个由内部低速振荡器(LSI)驱动的独立的硬件计时器,即使在主时钟发生故障时也能工作。IWDG 通常用于检测程序的运行状态,如果程序卡死或者跑飞,IWDG 会在设定的时间溢出后触发系统复位。
IWDG 的主要特点包括:
- 12位递减计数器:IWDG 内部有一个12位的计数器,计数器的值会持续递减。
- 独立时钟源:由内部RC振荡器(LSI)提供时钟,通常取频率为40kHz。
- 预分频器:计数器时钟可以通过预分频器进行分频,分频系数可选4、8、16、32、64、128或256。
- 重装载值:可以通过重装载寄存器(IWDG_RLR)设置计数器的加载值,这个值决定了IWDG的溢出时间。
- 喂狗:在计数器溢出前,可以通过向键寄存器(IWDG_KR)写入特定的值(0xAAAA)来重置计数器,这个操作称为“喂狗”。
- 启动IWDG:通过向键寄存器写入0xCCCC来启动IWDG。
- 写保护:在修改预分频器(IWDG_PR)和重装载寄存器(IWDG_RLR)之前,需要先向键寄存器写入0x5555来解除写保护。
IWDG 的配置步骤通常如下:
- 解除写保护:向IWDG_KR写入0x5555。
- 设置预分频器:选择合适的分频系数。
- 设置重装载值:设置溢出时间。
- 喂狗:在计数器溢出前写入0xAAAA到IWDG_KR。
- 启动IWDG:向IWDG_KR写入0xCCCC。
在STM32 HAL库中,可以使用HAL_IWDG_Init
和HAL_IWDG_Refresh
等函数来配置和操作IWDG。例如,初始化IWDG的代码可能如下:
IWDG_HandleTypeDef hiwdg;
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 625;
HAL_IWDG_Init(&hiwdg);
然后,在需要的时候进行喂狗操作:
HAL_IWDG_Refresh(&hiwdg);
IWDG 是STM32微控制器中重要的安全特性之一,适用于需要长时间稳定运行且对时间精度要求不高的场合。