因为单片机的工做经常会受到来自外界电磁场的干扰,形成各类寄存器和内存数据混乱,会致使程序指针错误,不在程序区,取出错误的程序指令等,都会陷入死循环,程序的正常运行被打断,由单片机控制的系统没法正常工做,会形成整个系统陷入停滞状态,发生不可预料的后果。ide
STM32F4xx具备两个看门狗外设,都可用于检测并解决由软件错误致使的故障,当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。ui
独立看门狗(IWDG)由其专用的低速时钟(LSI)驱动,所以,即使在主时钟发生故障时仍然保持工做状态。窗口看门狗(WWDG)时钟由APB1时钟经预分频后提供,经过可配置的时间窗口来检测应用程序非正常的过迟或过早的操做。spa
LSI RC 可做为低功耗时钟源在停机和待机模式下保持运行,因此,在MCU进入停机或待机模式时,看门狗仍能正常运行,因此须要定时唤醒喂狗,不然,MCU复位重启。指针
独立看门狗适用于那些须要看门狗做为一个在主程序外,可以彻底独立工做,而且对时间精度要求较低的场合。窗口看门狗适合那些要求看门狗在精确计时窗口起做用的应用程序。code
当经过对关键字寄存器(IWDG_KR)写入值0xCCCC启动独立看门狗时,计数器开始从复位值0xFFF递减计数。当计数器计数到终值(0x000)时会产生一个复位信号(IWDG复位)。blog
任什么时候候将关键字0xAAAA写到IWDG_KR寄存器中,IWDG_RLR的值就会被重载到计数器,从而避免产生看门狗复位。事件
硬件看门狗
若是经过选项字节位使能“硬件看门狗”功能,上电时将自动使能看门狗,若是在计数器计数结束前,若软件没有向关键字寄存器写入相应的值,则系统会产生复位。图片
关于选项字节内存
选项字节(字,地址0x1FFF C000) ...... USER:用户选项字节
此字节用于配置如下用能:
选择看门狗:硬件或软件
进入停机模式时产生复位事件
进入待机模式时产生复位时间bit 7 nRST_STDBY
0:进入待机模式时产生复位
1:不产生复位bit 6 nRST_STOP
0:进入停机模式时产生复位
1:不产生复位bit 5 WDG_SW
0:硬件看门狗
1:软件看门狗...... 注:关于bit7和bit6的说明
1.进入待机模式时产生复位:
此复位的使能方式是清零用户选项字节中的nRST_STDBY位。使能后,只要成功执行进入待机模式序列,MCU就将复位,而非进入待机模式。
2.进入停机模式时产生复位:
此复位的使能方式是清零用户选项字节中的nRST_STOP位。使能后,只要成功执行进入中止模式序列,MCU就将复位,而非进入待机模式。ci
32kHz(LSI)频率条件下IWDG超时周期的最小值/最大值
预分频器 | PR[2:0]位 | 最短超时(ms) RL[11:0] = 0x000 |
最长超时(ms) RL[11:0] = 0xFFF |
---|---|---|---|
/4 | 0 | 0.125 | 512 |
/8 | 1 | 0.25 | 1024 |
/16 | 2 | 0.5 | 2048 |
/32 | 3 | 1 | 4096 |
/64 | 4 | 2 | 8192 |
/128 | 5 | 4 | 16384 |
/256 | 6 | 8 | 32768 |
/*IWDG看门狗初始化*/ void IWDTDOG_Init(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_256); IWDG_SetReload((u16)(SYSWDG_TIMEOUT * 1000 /6.4 + 0.5)); IWDG_ReloadCounter(); } /*使能IWDG看门狗*/ void IWDG_Enable(void) { IWDG->KR = KR_KEY_ENABLE; } /*使能对IWDG_PR和IWDG_RLR寄存器的写访问*/ void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess) { assert_param(IS_IWDG_WRITE_ACCESS(IWDG_WriteAccess)); IWDG->KR = IWDG_WriteAccess; } /*设置IWDG预分频器的值*/ void IWDG_SetPrescaler(uint8_t IWDG_Prescaler) { assert_param(IS_IWDG_PRESCALER(IWDG_Prescaler)); IWDG->PR = IWDG_Prescaler; } /*设置IWDG的重载值*/ void IWDG_SetReload(uint16_t Reload) { assert_param(IS_IWDG_RELOAD(Reload)); IWDG->RLR = Reload; } /*将Reload register的值从新加载IWDG计数器,喂狗操做*/ void IWDG_ReloadCounter(void) { IWDG->KR = KR_KEY_RELOAD; }
至此,IWDG看门狗已经初始化完毕,并开启,须要调用IWDG_ReloadCounter()定时喂狗。
STM32F系列的MCU看门狗开启以后是关闭不了的,因此在进入待机和停机以后,须要定时唤醒去喂狗,喂狗的时间很短,与ST确认,STM32LXXX和STM8系列,能够在进入待机和停机以前经过用户选线字节冻结看门狗。
文章参考资料: 《STM32F4xx中文参考手册》 《STM32F4xx Reference manual》