STM32自学☞WDG(看门狗)及其案例

本文介绍了在STM32F10x微控制器上实现独立看门狗(IWDG)和窗口看门狗(WWDG)的基本配置步骤,包括开启时钟、解除写保护、设置预分频器、重装值、喂狗和中断处理等。
摘要由CSDN通过智能技术生成

 

 一、WDG简介

e2c0dfb3c3ce497e992e6dc3ba9b3fb4.jpg

由于看门狗的代码很少所以就直接在main主函数中写了,没单独建文件

 二、独立看门狗

涉及的按键可参考之前的key.c和key.h文件

独立看门狗配置流程:

1.开启时钟(LSI)

2.解除IWDG_PR和IWDG_RLR的写保护

3.写入预分频和重装值

4.启用独立看门狗

5.喂狗

相关函数:

IWDG_WriteAccessCmd() //写使能控制

IWDG_SetPrescaler() //写预分频器

IWDG_SetReload() //写重装值

IWDG_ReloadCounter() //重新装载寄存器(喂狗)

IWDG_Enable() //启动独立看门狗

IWDG_GetFlagStatus() //获取标志位状态

main.c文件

#include "stm32f10x.h"

#include "stm32f10x_iwdg.h"

#include "delay.h"

#include "OLED.h"

#include "key.h"

int main (void)

 //初始化

 OLED_Init();

 key_Init();

 OLED_ShowString(1,1,"IWDG TEST:");

 //如果查看独立看门狗复位标志位==SET说明本次复位是独立看门狗导致的

 //否则是正常复位导致的

 if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)

 {

  OLED_ShowString(2,1,"IWDGRST");

  delay_ms(500);

  OLED_ShowString(2,1,"");

  delay_ms(100);

  RCC_ClearFlag();

 }else

 {

  OLED_ShowString(3,1,"RST");

  delay_ms(500);

  OLED_ShowString(3,1,"");

  delay_ms(100);

 }

//开启时钟

/*如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG*/

//解除写保护

 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

//写预分频器

  IWDG_SetPrescaler(IWDG_Prescaler_16);

//写重装值

 IWDG_SetReload(2499);

//喂狗

 IWDG_ReloadCounter();

//启动独立看门狗

 IWDG_Enable();

 while(1)

 {

  key_Getnum();

  IWDG_ReloadCounter();

  OLED_ShowString(4,1,"FEED");

  delay_ms(200);

  OLED_ShowString(4,1," ");

  delay_ms(600);

 }

}

三、窗口看门狗

 

 相关函数:

 WWDG_DeInit(); //恢复缺省配置

 WWDG_SetPrescaler( ); //写入预分频器

 WWDG_SetWindowValue( ); //写入窗口值

 WWDG_EnableIT(); //使能中断

 WWDG_SetCounter(); //写入计数器

 WWDG_Enable( ); //使能窗口看门狗

 FlagStatus WWDG_GetFlagStatus(); 

 WWDG_ClearFlag(); 

涉及的按键可参考之前的key.c和key.h文件

main.c文件

#include "stm32f10x.h"

#include "stm32f10x_wwdg.h"

#include "delay.h"

#include "OLED.h"

#include "key.h"

int main (void)

 //初始化

 OLED_Init();

 key_Init();

 OLED_ShowString(1,1,"WWDG TEST:");

 //如果查看独立看门狗复位标志位==SET说明本次复位是独立看门狗导致的

 //否则是正常复位导致的

 if(RCC_GetFlagStatus(RCC_FLAG_WWDGRST)==SET)

 {

  OLED_ShowString(2,1,"WWDGRST");

  delay_ms(500);

  OLED_ShowString(2,1,"");

  delay_ms(100);

  RCC_ClearFlag();

 }else

 {

  OLED_ShowString(3,1,"RST");

  delay_ms(500);

  OLED_ShowString(3,1,"");

  delay_ms(100); }

//开启时钟

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);

//写入预分频器

  WWDG_SetPrescaler(WWDG_Prescaler_8);   

//写入窗口值

  WWDG_SetWindowValue(0x40|21);

//使能  

 WWDG_Enable(0x40|54);

 while(1)

 {

  key_Getnum();

  OLED_ShowString(4,1,"FEED");

  delay_ms(20);

  OLED_ShowString(4,1," ");

  delay_ms(20);

  WWDG_SetCounter(0x40|54);

 }

}

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鯨觞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值