运动控制器37:STM32的看门狗功能

IWDG

IWDG由LSI驱动,就算外部高速时钟失效也能正常工作,用于程序以外,需要一个独立,对时间精度要求不太高的场合。

IWDG主要性能

自由运行的递减计数器,看门狗激活以后,计数到0时产生复位

IWDG功能描述

IWDG_KR中写入OXCCCC后,看门狗启动,从OXFFF减到0时产生复位,写入OXAAAA进行重新加载。

  • 硬件看门狗,如果有硬件看门狗功能,上电复位以后,看门狗自动运行。
  • 寄存器的保护:重载寄存器的修改必须按照一个流程才可以进行设置。

库函数

void  IWDG_Enable (void) 
 // 使能
FlagStatus  IWDG_GetFlagStatus (uint16_t IWDG_FLAG) 
 // 重载值和预分频设置是否完成
void  IWDG_ReloadCounter (void) 
void  IWDG_SetPrescaler (uint8_t IWDG_Prescaler) 
void  IWDG_SetReload (uint16_t Reload) 
void  IWDG_WriteAccessCmd (uint16_t IWDG_WriteAccess) 

设置流程

通常设置一个看门狗的流程如下:

//设置看门狗的参数开关
 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
//设置分频
   IWDG_SetPrescaler(IWDG_Prescaler_32);
//设置重载值
   IWDG_SetReload(LsiFreq/128);
//打开计数
   IWDG_ReloadCounter();
//使能看门狗,
   IWDG_Enable();

窗口看门狗WWDG

WDG1.png

如上图,我们可以递减计数器,同时设置W[6..0]位,WWDG由PCLK1分频后进行驱动,如果T减少到W时,可以进行刷新一次,如果不刷新,到T减小到3F时将产生一个复位,同时T6位置1,相当于重新开始计数。
那如果处于睡眠模式,时钟都没有了,该这么操作?我们在EWI中设置了一个中断,如果进入了睡眠模式,则自动喂狗,防止产生复位。

所以用到的函数都很简单,如下:

void  WWDG_ClearFlag (void) //清唤醒的FLAG
void  WWDG_DeInit (void)   //
void  WWDG_Enable (uint8_t Counter) 使能,并设置W
void  WWDG_EnableIT (void)  //使能中断
FlagStatus  WWDG_GetFlagStatus (void)  //FLAG状态,有无中断
void  WWDG_SetCounter (uint8_t Counter)  //设置T值
void  WWDG_SetPrescaler (uint32_t WWDG_Prescaler) //分频
void  WWDG_SetWindowValue (uint8_t WindowValue)  //设置W值

WWDG的配置如下:

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
 WWDG_SetPrescaler(WWDG_Prescaler_8);
  WWDG_SetWindowValue(80);
  WWDG_Enable(127);
 // ...
 //然后在一段程序以后,及时喂狗
  WWDG_SetCounter(127);

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容