什么是看门狗
- STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
- 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
- IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完全独立工作,并且对时间精度要求较低的场合。 WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
本文主要以独立看门狗为例展开讨论
看门狗的使用
相关寄存器
- 键寄存器(IWDG_KR)
- 预分频寄存器(IWDG_PR)
- 重装载寄存器(IWDG_RLR)
- 状态寄存器(IWDG_SR)
上图为独立看门狗框图
框图及寄存器解释
看门狗电路时钟来源于LSI,LSI可的时钟信号进来后可以进行分频,再把分频后的时钟信号作为基准。看门狗计数器在此基础上变化,如何变化全看你对键寄存器的操作。
在键寄存器中写入0xCCCC,开启独立看门狗,此时计数器开始从复位值递减计数。向键寄存器中写入0xAAAA(也就是大家俗称的“喂狗”操作),重载寄存器中的值就会被重新加载到计数器,当计数到0时产生一个复位信号使单片机复位。
若需要更改看门狗时钟的分频系数和看门狗计数器重装载值则需要先向键寄存器中写入0x5555。
比如咱们需要看门狗在1s为进行“喂狗”操作时复位单片机,则可以设置分频系数为64,设置重装载值为625,因为LSI为40Khz,设置分频系数为64后,每次计数花费时间为(64/40000)s = 1/625 s ,那么计数625次就是1s。
附历程及效果视频
代码
void IWDG_Config(uint8_t prv ,uint16_t rlv)
{
IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable ); // 获取分频寄存器和重装载寄存器写入权限
IWDG_SetPrescaler( prv ); // 设置分频系数
IWDG_SetReload( rlv ); // 设置重装载值
IWDG_ReloadCounter(); // “喂狗”,重装载值加载到计数器(也就是上文提到的向键寄存器中写入0xAAAA)
IWDG_Enable(); // 开启看门狗(也就是上文提到的向键寄存器中写入0xCCCC)
}
/***************************下为主函数**************************/
int main(void)
{
led_init();
IWDG_Config(IWDG_Prescaler_64 ,625);
led13(0); // 亮灯
Delay_ms(500);
while (1)
{
led13(1); // 灭灯
// IWDG_ReloadCounter();
// Delay_ms(100);
// led13(0);
// Delay_ms(400);
}
}
效果视频
【STM32】看门狗