IWDG:(Indpendent Watch Dog)独立看门狗,本身是一个定时器(TIM,SysTick)类似,当软件程序故障导致程序跑飞,这个时候就要及时复位芯片,独立看门狗递减计数,计数到0没有执行一个喂狗操作,这个时候就会导致芯片复位。独立看门狗 (IWDG) 由其专用低速时钟 (LSI) 驱动,因此即便在主时钟发生故障时仍然保持工作状态。
当通过对关键字寄存器 (IWDG_KR) 写入值 0xCCCC 启动独立看门狗时,计数器开始从复位 值 0xFFF 递减计数。当计数器计数到终值 (0x000) 时会产生一个复位信号(IWDG 复位)。 任何时候将关键字 0xAAAA 写到 IWWDG_KR 寄存器中,IWDG_RLR 的值就会被重载到计数器,从而避免产生看门狗复位。
IWDG_PR 和 IWDG_RLR 寄存器具有写访问保护。若要修改寄存器,必须首先对 IWDG_KR 寄存器写入代码 0x5555。而写入其他值则会破坏该序列,从而使寄存器访问保护再次生效。这意味着重装载操作(即写入 0xAAAA)也会启动写保护功能。
//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//rlr:自动重装载值,0~0XFFF.
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
void iwdg_init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写
IWDG_SetPrescaler(prer); //设置IWDG分频系数
IWDG_SetReload(rlr); //设置IWDG装载值
IWDG_ReloadCounter(); //reload
IWDG_Enable(); //使能看门狗
}
//喂独立看门狗
void iwdg_feed(void)
{
IWDG_ReloadCounter();//reload
}
预分频因子=4*2^prer
溢出时间计算:
Tout=((4×2^prer)×rlr)/32
prer是预分频寄存器的值,这里(4×2^prer)就是真正的预分频系数,32/预分频系数就是它的时钟,频率,频率的倒数乘以rlr就是它的溢出时间。也就是说最大时间就是rlr为0xFFF时公式的值,同理最短时间就是一个时钟周期的时间也就是当rlr为1时公式的值。
Tout=rlr*看门狗时钟周期=rlr*(1/freq)=rlr*(1/(32*预分频系数))
=rlr*(1/(32/预分频因子))
=rlr*(1/(32/(4*2^prer)))
=rlr*((2^(prer+2))/32)
=(4*2^prer)*rlr / 32