STM32F4X 独立看门狗 IWDG
什么是看门狗
我们都知道,当一个嵌入式在运行过程中发生死机或者程序跑飞的情况的时候,我们一般都是要手动进行开关机或者复位,让程序能够重新运行。但是当一个嵌入式系统被安装到一些特殊位置时,如果发生了死机又不能及时进行手动复位,这时候就需要看门狗了。看门狗的作用就是监控嵌入式系统的运行情况,如果系统出现死机或者程序跑飞时,就会自动复位系统,无需人为干预。
STM32F4X 独立看门狗的使用
独立看门狗时钟源
在数据手册上我们可以看到,STM32F4X的独立看门狗的时钟源是用LSI内部32K时钟源。
独立看门狗寄存器
关键字寄存器
关键字寄存器主要是通过配置不同的键值来设置独立看门狗的功能。
- 0xAAAA:重新写入重装载值到重装载寄存器,用于喂狗
- 0x5555:使能对PR和RLR寄存器的访问
- 0xCCCC:启动独立看门狗
预分频器寄存器
设置独立看门狗的预分频值
重载寄存器
设置独立看门狗的计数值
状态寄存器
判断独立看门狗的状态
可以看到独立看门狗其实跟普通定时器的原理是一样的,也是通过设置一个频率,然后不停地进行计数。不同的是独立看门狗当计数值超过设定值时,如果我们不进行喂狗,就会复位系统,需要注意的是,看门狗一旦启动就不能停止,只能通过复位或掉电停止。
独立看门狗计数频率计算
独立看门狗的计数频率其实跟普通定时器的计算是一样的。假设独立看门狗的时钟源为32KHZ,预分频为64分频,重载值设为1000。那么独立看门狗的溢出时间可以这样计算。
Tout = ( 1 / (32000 / 64)) * 1000 = 2s
也就是独立看门狗的溢出时间是2s,当这2秒内我们不进行喂狗的话,独立看门狗就会复位系统。
独立看门狗例程
在例程中会将看门狗的复位时间设置成3秒。在main函数中会先以500ms的频率进行10次喂狗,喂狗次数大于10次之后就停止喂狗,看门狗就会在3秒后复位系统。
#include "iwdt.h"
void bsp_iwdg_init(void)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 使能看门狗寄存器写
IWDG_SetPrescaler(IWDG_Prescaler_64); // 设置预分配为64 也就是 1 / (32000 / 64) = 2ms
IWDG_SetReload(1500); // 计1500个数
IWDG_ReloadCounter(); // 重新写入重装载值到重装载寄存器,用于喂狗
IWDG_Enable(); // 使能看门狗,一旦使能就不能停止
}
void IWDG_Feed(void)
{
IWDG_ReloadCounter();// 重新写入重装载值到重装载寄存器,用于喂狗
}
int main(void)
{
int cnt = 10;
NVIC_PriorityGroupConfig(2);
system_tick_init();
bsp_usart_init(115200);
bsp_iwdg_init();
printf("system init...\r\n");
while(1){
while(cnt-- > 0)
{
IWDG_Feed();
delay_ms(500); // 每隔500ms喂一次狗,防止复位
}
printf("看门狗将在3秒后复位\r\n");
delay_ms(1000);
printf("看门狗将在2秒后复位\r\n");
delay_ms(1000);
printf("看门狗将在1秒后复位\r\n");
delay_ms(1000);
}
}