STM32
直播中

yuhonglong

12年用户 690经验值
私信 关注
[问答]

怎么用独立看门狗IWDG

怎么用独立看门狗IWDG?
独立看门狗IWDG初始化函数是什么?



回帖(1)

张子晶

2021-9-23 11:05:31
  怎么用 IWDG
  独立看门狗一般用来检测和解决由程序引起的故障,比如一个程序正常运行的时间是50ms,在运行完这个段程序之后紧接着进行喂狗,我们设置独立看门狗的定时溢出时间为60ms,比我们需要监控的程序 50ms 多一点,如果超过 60ms 还没有喂狗,那就说明我们监控的程序出故障了,跑飞了,那么就会产生系统复位,让程序重新运行。
  有关代码
  IWDG初始化函数
  void IWDG_Config(uint8_t prv ,uint16_t rlv)
  {
  // 使能 预分频寄存器PR和重装载寄存器RLR可写 IWDG_WriteAccessCmd( IWDG_WriteAccess_Enable );
  // 设置预分频器值 IWDG_SetPrescaler( prv );
  // 设置重装载寄存器值 IWDG_SetReload( rlv );
  // 把重装载寄存器的值放到计数器中 IWDG_ReloadCounter();
  // 使能 IWDG IWDG_Enable();
  }
  喂狗函数
  // 喂狗void IWDG_Feed(void)
  {
  // 把重装载寄存器的值放到计数器中,喂狗,防止IWDG复位
  // 当计数器的值减到0的时候会产生系统复位
  IWDG_ReloadCounter();
  }
  查看是否是独立看门狗复位的语句
  if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) 清除标志的函数
  RCC_ClearFlag();
  计算时间
  独立看门狗的时钟由独立的 RC 振荡器 LSI 提供,LSI 的频率一般在 30~60KHZ 之间,根据温度和工作场合会有一定的漂移,我们一般取 40KHZ,所以独立看门狗的定时时间并一定非常精确,只适用于对时间精度要求比较低的场合。
  溢出时间 Tout = (4*2^prv) / 40 * rlv (ms) ,prv 是预分频器寄存器的值,rlv 是重装载寄存器的值。
  如果我们需要设置 1s 的超时溢出,prv 可以取 IWDG_Prescaler_64,
  rlv 取 625,即调用:IWDG_Config(IWDG_Prescaler_64 ,625)。Tout=64/40*625=1s。
  总结
  使用独立看门狗时,先使用IWDG初始化函数,初始化后看门狗就开始工作了,使用喂狗函数喂狗,如果没有喂狗,看门狗将会将程序复位。查看rcc有关的寄存器可以查看是否时看门狗复位,注意标志位要手动清零,使用清零标志的函数。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分