独立看门狗 IWDG
IWDG 使用lSI低速内部时钟
寄存器
IWDG_KR key 15:0
软件必须间隔写入0xAAAA,否则看门狗复位
写入0x5555 访问 IWDG_PR() 和 IWDG_RLR(重装载)
写入0xCCCC 启动看门狗
库函数
IWDG_WriteAccessCmd 使能或者失能对寄存器 IWDG_PR 和 IWDG_RLR 的写操作
IWDG_SetPrescaler 设置 IWDG 预分频值
IWDG_SetReload 设置 IWDG 重装载值
IWDG_ReloadCounter 按照 IWDG 重装载寄存器的值重装载 IWDG 计数器
IWDG_Enable 使能 IWDG
IWDG_GetFlagStatus 检查指定的 IWDG 标志位被设置与否
例子:
void IWDG_ConfigurAction(void) {
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能
IWDG_SetPrescaler(IWDG_Prescaler_64); //设置 IWDG 预分频值 4x2pr pr=4次方 =64分频值
IWDG_SetReload(625); //重装载值 40khz/pkl 计数器-1 相当于 40000/4x2pr 625 x 40000/4x16 = 1s 到0复位
IWDG_ReloadCounter(); // 重装载寄存器的值重装载 IWDG 计数器
IWDG_Enable(); //使能 IWDG
}
void IWDG_feedDog(void) {
IWDG_ReloadCounter(); //喂狗不
}
窗口看门狗 WWDG(精确)
1.当窗口看门狗的递减计数器T[6:0] 大于上线W[6:0] 时,如果此时去喂狗,将cpu会复位
2.当递减计数器T[6:0]到达下线窗口0x3F的值时,会立刻触发cpu复位
只能在上窗口与下窗口之间的刷新窗口进行喂狗
例子:
unsigned char WWDG_CNT = 0x7F;
void wwdgInit_ConfigAction(unsigned int pr,unsigned char wr,unsigned char tr) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
WWDG_CNT = tr & 0x7F; //防止值过大
//WWDG_SetCounter(WWDG_CNT); //必须在0x40到0x7F之间
WWDG_SetPrescaler(pr); //WWDG_Prescaler_8
WWDG_SetWindowValue(wr); //上窗口值 必须在0x40到0x7F之间
WWDG_Enable(tr&0x7f); //必须在0x40到0x7F之间
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitTypeDef NVIC_InitStruct1;
NVIC_InitStruct1.NVIC_IRQChannel = WWDG_IRQn;
NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct1.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStruct1.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct1);
WWDG_ClearFlag();
WWDG_EnableIT();
}
void WWDG_IRQHandler() {
WWDG_SetCounter(WWDG_CNT); //必须在0x40到0x7F之间 喂狗
WWDG_ClearFlag();
}