IWDG常用函数
1 | void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess); |
写使能控制
1 | void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); |
写预分频器,即写PR寄存器
1 | void IWDG_SetReload(uint16_t Reload); |
写重装值,即写RLR寄存器
1 | void IWDG_ReloadCounter(void); |
重新装载寄存器(喂狗)
1 | void IWDG_Enable(void); |
启用看门狗使能
1 | FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG); |
获取标志位状态
1 | FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG); |
查看RCC标志位,查看时钟Ready和各种Reset标志位
独立看门狗
main.c
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | int main(void){ OLED_Init(); KEY_Init(); OLED_ShowString(1,1,"IWDG TEST"); if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)//查看RCC标志位,是不是IWDG复位 { OLED_ShowString(2,1,"IWDGRST"); Delay_ms(500); OLED_ShowString(2,1," "); Delay_ms(500); RCC_ClearFlag();//清除标志位 } else { OLED_ShowString(3,1,"RST"); Delay_ms(500); OLED_ShowString(3,1," "); Delay_ms(500); } IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//解除写保护 //根据预分频值和重装值,超时时间是1000ms IWDG_SetPrescaler(IWDG_Prescaler_16);//配置预分频 IWDG_SetReload(2499);//配置重装值 IWDG_ReloadCounter();//先喂一次狗 IWDG_Enable();//使能看门狗 while(1) { Key_GetNum();//获取按键值 IWDG_ReloadCounter();//喂狗 OLED_ShowString(4,1,"FEED"); Delay_ms(200); OLED_ShowString(4,1," "); Delay_ms(600); //Delay_ms(800);//延时800ms,程序不会被看门狗复位 //Delay_ms(1200);//延时1200ms,喂狗时间不满足要求,程序被看门狗复位 }} |
WWDG常用函数
1 | void WWDG_DeInit(void); |
WWDG恢复缺省配置
1 | void WWDG_SetPrescaler(uint32_t WWDG_Prescaler); |
WWDG写入预分频值
1 | void WWDG_SetWindowValue(uint8_t WindowValue); |
WWDG写入窗口值
1 | void WWDG_EnableIT(void); |
WWDG使能中断
1 | void WWDG_SetCounter(uint8_t Counter); |
WWDG写入计数器(喂狗)
1 | void WWDG_Enable(uint8_t Counter); |
WWDG使能窗口看门狗
1 | FlagStatus WWDG_GetFlagStatus(void); |
WWDG获取标志位
1 | void WWDG_ClearFlag(void); |
WWDG清除标志位
窗口看门狗
main.c
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 | int main(void){ OLED_Init(); KEY_Init(); OLED_ShowString(1,1,"WWDG TEST"); if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST) == SET)//查看RCC标志位,是不是WWDG复位 { OLED_ShowString(2,1,"WWDGRST"); Delay_ms(500); OLED_ShowString(2,1," "); Delay_ms(500); RCC_ClearFlag();//清除标志位 } else { OLED_ShowString(3,1,"RST"); Delay_ms(500); OLED_ShowString(3,1," "); Delay_ms(500); } RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//开启窗口看门狗时钟 WWDG_SetPrescaler(WWDG_Prescaler_8);//设置预分频值 WWDG_SetWindowValue(0x40 | 21);//设置窗口值,窗口时间30ms WWDG_Enable(0x40 | 54);//使能,超时时间50ms while(1) { Key_GetNum();//获取按键值 OLED_ShowString(4,1,"FEED"); Delay_ms(20); OLED_ShowString(4,1," "); Delay_ms(20); WWDG_SetCounter(0x40 | 54);//WWDG喂狗 //Delay_ms(800);//延时800ms,程序不会被看门狗复位 //Delay_ms(1200);//延时1200ms,喂狗时间不满足要求,程序被看门狗复位 }} |