独立看门狗寄存器说明:
键值寄存器(TWDG_KR)中写入0xCCCC;
计数器开始从复位值0xFFF递减计数;
计数器到0x000,产生一个复位信号(IWDG_RESET);
键值寄存器(RWDG_KR)中写入0xAAAA;
IWDG_RLR中的值会被重新加载到计数器中,避免看门狗复位;
IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能,修改两个寄存器之前先向 IWDG_KR寄存器中写入0x5555。
重装操作(0xAAAA)也会开启写保护功能。
预分频寄存器(IWDG_PR),用来设置看门狗时钟的分频系数。
独立看门狗启动步骤:
-
取消寄存器写保护(向 IWDG_KR 写入 0X5555):
/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
-
设置独立看门狗的预分频系数:
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置欲分频值
-
设置看门狗的重装载值:
void IWDG_SetReload(uint16_t Reload); //设置重装载值
看门狗溢出时间计算
T o u t = ( ( 4 × 2 p r e r ) × r l r ) / 40 Tout=((4 \times 2^{prer})\times rlr) /40 Tout=((4×2prer)×rlr)/40
-
重载计数值(向IWDG_KR写入0xAAAA)
IWDG_ReloadCounter(); //按照IWDG重载寄存器的值重装载IWDG计数器
-
启动看门狗(向IWDG_KR写入0xCCCC)
IWDG_Enable(); //使能IWDG
__注:__看门狗一旦启用,便不能关闭!!!
窗口看门狗超时公式:
T w w d g = ( 4096 × 2 W D G T B × ( T [ 5 : 0 ] + 1 ) ) / F p c l k 1 ; Twwdg=(4096\times2^{WDGTB}\times(T[5:0]+1))/Fpclk1; Twwdg=(4096×2WDGTB×(T[5:0]+1))/Fpclk1;
其中:
- T w w d g : Twwdg: Twwdg:WWDG超时时间(单位为ms)
- F p c l k 1 : Fpclk1: Fpclk1:APB1的时钟频率(单位为KHz)
- W D G T B : WDGTB: WDGTB:WWDG的预分频系数
- T [ 5 : 0 ] : T[5:0]: T[5:0]:窗口看门狗的计数器低6位
最小/最大超时时间表
WDGTB | 最小超时值 | 最大超时值 |
---|---|---|
0 0 0 | 113 μ s 113\mu s 113μs | 7.28 m s 7.28ms 7.28ms |
1 1 1 | 227 μ s 227\mu s 227μs | 14.56 m s 14.56ms 14.56ms |
2 2 2 | 455 μ s 455\mu s 455μs | 29.12 m s 29.12ms 29.12ms |
3 3 3 | 910 μ s 910\mu s 910μs | 58.25 m s 58.25ms 58.25ms |
窗口看门狗控制寄存器(WWDG_CR):
- WWDG_CR只有低八位有效
- T[6:0]用来存储看门狗的计数器值;
- 每个计数周期 ( 4096 × 2 W D G T B ) (4096\times2^{WDGTB}) (4096×2WDGTB)减一;
- 计数器值从0x40 变为 0x3F 的时候,将产生看门狗复位;
窗口看门狗配置寄存器(WWDG_CFR):
- EWI(位9)是提前唤醒中断;
- 此位值1,当计数器值达到40h,即产生中断;
- 此中断只能由硬件在复位后清除;
- 进入中断后立即重新写WWDG_SR;
窗口看门狗状态寄存器(WWDG_SR)
- 仅位0有效;
- 由硬件置一,软件清零;
- 计数器值达到0x40后该位也会被置1;
启用窗口看门狗步骤:
- 使能时钟:
ACC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
- 设置窗口值:
WWDG_SetWindowValue(uint8_t WindowValue);
- 设置分频数:
WWDG_SetPewscaler(uint32_t WWDG_Prescaler);
- 开启WWDG中断并分组:
WWDG_EnableIT(); //开启窗口看门狗
- 设置计数器初始值并使能看门狗:
WWDG_Enable(uint8_t Counter);
- 编写中断服务函数: