你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32的独立看门狗(IWDG)(内附代码)

[复制链接]
STMCU小助手 发布时间:2022-5-18 21:00
一、什么是看门狗:     简单来说看门狗就是一种专用定时器。

二、看门狗的功能:   

        在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。

        简单来说就是在系统跑飞(程序异常执行)的情况时,系统复位,程序重新执行。

三、独立看门狗(IWDG)

        1、独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。

              独立看门狗适合应用于需要看门狗作为一个在主程序之外能够完全独立工作,并且对时间精度要求低的场合。

        2、独立看门狗的功能

        在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。

        无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。

        如果程序异常,就无法正常喂狗,从而系统复位。

X8{PW976YZ`%BL6E}V2LKNW.png

        3、独立看门狗寄存器

MGB}4KS@B({909()H@_TZNM.png

  ①键值寄存器IWDG_KR:0~15位有效

W~%V0N{)V6N_4741B5BF}(O.png


②预分频寄存器IWDG_PR:0~2位有效。具有写保护功能,要操作先取消写保护

QI@][$KF%@{S_%S~GBW1WUO.png

③重装载寄存器IWDG_RLR:0~11位有效。具有写保护功能,要操作先取消写保护

7KWDM1NIINMQL)6ZKDJ9N8C.png


④状态寄存器IWDG_SR:0~1位有效
@]UJ2_PKT(DD]N2@B9N0R9N.png

4、独立看门狗超时时间

[65(OX8[BYSOTNP(TCT5O(7.png

(适用M4)

溢出时间计算:Tout=((4×2^prer) ×rlr) /32 (M4)

             即是:最长超时时间= (IWDG_RLR寄存器最大值)X看门狗时钟周期

注意:M4的时钟频率LSI=32K, 一个看门狗时钟周期就是最短超时时间。

   5、独立看门狗操作步骤     

  1. //①取消寄存器写保护:

  2. void IWDG_WriteAccessCmd(uint16_tIWDG_WriteAccess);//取消写保护:0x5555使能

  3. //②  设置独立看门狗的预分频系数,确定时钟:

  4. void IWDG_SetPrescaler(uint8_tIWDG_Prescaler);//设置预分频系数:写PR
  5. //③ 设置看门狗重装载值,确定溢出时间:

  6. void IWDG_SetReload(uint16_tReload);//设置重装载值:写RLR

  7. //④ 使能看门狗

  8. void IWDG_Enable(void);//使能看门狗:写0xCCCC到KR

  9. //⑤ 应用程序喂狗:

  10. void IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
  11. //最后:

  12. FlagStatusIWDG_GetFlagStatus(uint16_tIWDG_FLAG);//状态:重装载/预分频 更新
复制代码

  6、代码如下:

  1. void IWDG_Init(u8 prer,u16 rlr)
  2. {
  3.     IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写
  4.     IWDG_SetPrescaler(prer); //设置IWDG分频系数
  5.     IWDG_SetReload(rlr);   //设置IWDG装载值
  6.     IWDG_ReloadCounter(); //reload //重载看门狗计数值
  7.     IWDG_Enable();       //使能看门狗
  8. }


  9. int main(void)
  10. {
  11.     delay_init(168);  //初始化延时函数
  12.     LED_Init();     //初始化LED端口
  13.     KEY_Init();   //初始化按键
  14.     delay_ms(100);    //延时100ms
  15.     IWDG_Init(4,500); //与分频数为64,重载值为500,溢出时间为1s

  16.     LED0=0;  //先点亮灯
  17.     while(1)
  18.     {
  19.         if(KEY_Scan(0)==WKUP_PRES)//如果WK_UP按下,则喂狗
  20.         {
  21.             IWDG_ReloadCounter(); //喂独立看门狗
  22.         }
  23.         delay_ms(10);
  24.     }
  25. }

  26. //检查系统是否已经从独立看门狗复位恢复:只需要几十ms
  27. if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
  28. {
  29.     printf("IWDG RESET OK!\r\n");
  30.     PFout(8) = ~PFout(8);
  31. }
复制代码





收藏 评论0 发布时间:2022-5-18 21:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版