STM32:看门狗
独立看门狗
简介
独立看门狗(IWDG)由独立的低速时钟(LSI)驱动,即便主时钟发生故障,它依然能够正常工作。其主要作用是在程序出现异常时,通过复位来保障系统的稳定性。独立看门狗的喂狗操作相对简单,只需在规定时间内对相关寄存器进行写入操作即可。它适用于对可靠性要求较高,且主时钟可能出现故障的场景。
窗口看门狗
简介
窗口看门狗(WWDG)由系统时钟(PCLK1)分频后驱动,其工作依赖于系统时钟的正常运行。它相较于独立看门狗,具有更严格的时间监控机制。窗口看门狗设置了一个时间窗口,喂狗操作必须在这个时间窗口内完成,早于或晚于该窗口都会导致系统复位。这种特性使其能够更精准地监控程序的运行状态,适用于对程序运行时序要求较为严格的场景。
两个看门狗的区别
独立看门狗使用方法
在独立看门狗(IWDG)中,看门狗的超时时间
计算公式为
prer
是预分频器的值,
rlr
是重装载寄存器的值,40 是独立看门狗的时钟频率(单位:kHz)。
int init_iwdg(u8 prer,u16 rlr)
{IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);IWDG_SetPrescaler(prer);IWDG_SetReload(rlr);IWDG_ReloadCounter(); IWDG_Enable();
}
void IWDG_Feed(void)
{IWDG->KR=0xAAAA;
}
int main(void)
{IWDG_Init(4,1875);while(1){IWDG_Feed();delay_ms(2500);}
}
窗口看门狗使用方法
窗口值:当计数器的值大于窗口值时进行喂狗操作,系统会发生复位。
下限值(固定为 0x40):如果计数器的值递减到 0x40 还没有进行喂狗操作,那么计数器再减一次到 0x3F 时,系统就会复位。
自动喂狗应该在上窗口值和下限值之间
在递减计数器减到 0X40 的时候,进入中断,称它为死前中断或者 叫遗嘱中断,在中函数里面我们应该出来最重要的事情,而且必须得快,因为递减计数器再减 一次,就会产生系统复位。
static void WWDG_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void WWDG_Config(uint8_t tr, uint8_t wr, uint32_t prv)
{ // 开启 WWDG 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);// 设置递减计数器的值WWDG_SetCounter( tr );// 设置预分频器的值WWDG_SetPrescaler( prv );// 设置上窗口值WWDG_SetWindowValue( wr );// 设置计数器的值,使能WWDGWWDG_Enable(WWDG_CNT); // 清除提前唤醒中断标志位WWDG_ClearFlag(); // 配置WWDG中断优先级WWDG_NVIC_Config(); // 开WWDG 中断WWDG_EnableIT();
}// 喂狗
void WWDG_Feed(void)
{// 喂狗,刷新递减计数器的值,设置成最大WDG_CNT=0X7FWWDG_SetCounter( WWDG_CNT );
}void WWDG_IRQHandler(void)
{// 清除中断标志位WWDG_ClearFlag();//真正使用的时候,这里应该是做最重要的事情}int main(void)
{uint8_t wwdg_tr, wwdg_wr;//初始化窗口看门狗,设置计数器初始值为0X7F,上窗口值为0X5F,预分频器为WWDG_Prescaler_8WWDG_Config(0X7F, 0X5F, WWDG_Prescaler_8);wwdg_wr = WWDG->CFR & 0X7F;//wwdg_wr获得上窗口的值while(1){wwdg_tr = WWDG->CR & 0X7F; //获得计数器值if( wwdg_tr < wwdg_wr )//当计数器的值减小到小于上窗口值的时候{// 喂狗,重新设置计数器的值为最大0X7FWWDG_Feed();}}
}
在调用 WWDG_Config(0X7F, 0X5F, WWDG_Prescaler_8) 函数时,把计数器初始值设为 0X7F,意味着将计数器设置成了其所能表示的最大值。窗口看门狗开启后,计数器会从这个最大值开始逐次递减。当计数器的值大于上窗口值(这里是 0X5F)时进行喂狗操作,系统会复位;而当计数器递减到 0X40 还未喂狗,再减一次到 0X3F 时系统也会复位。因此,需要在计数器的值处于 0X5F 和 0X40 之间时进行喂狗操作,以此保证系统正常运行。