STM32独立看门狗,实现单片机自动重启

今天学习了一下独立看门狗,看门狗的主要作用就是防止程序中有死循环或是不知道的bug,而造成在while循环中没有及时喂狗,程序就会控制单片机重启复位,从而不至于影响程序一直不能正常工作。

其实看门狗的应用也不是很复杂,主要分了4步,第一步还不用任何操作。

第一步:开启LSI的时钟(打开看门狗会自动开LSI,所以这一步什么都不做)

第二步:写入0x5555 解除写保护 (IWDG_WriteAccessCmd())

第三步:写入预分频器IWDG_PR和重装寄存器IWDG_RLR 超时时间:Tiwdg= Tlsi * PR预分频 系数 X (RL+1) Tlsi=1/Flsi (喂狗)

IWDG_SetPrescaler()写预分频器

IWDG_SetReload()写重装值

IWDG_ReloadCounter()(喂狗)

第四步:写入0xCCCC 启动独立看门狗

为了验证是不是由看门狗引起的复位,特此调用rcc里面的检查独立看门狗的复位标志位,来显示不同的字符串,就可以看出来到底是手动复位还是看门狗复位了。

下面就是启动看门狗的四步了:

这里就要仔细的看看预分频系数和重装值的计算了:

最后就是在while循环中不停地喂狗了,如果while循环在1秒内能够循环一次,喂一次狗,单片机就不会重启,如果超过了1秒钟还没有喂狗那就有可能程序中有bug需要重启来解决这个问题了。

main.c的源文件:

复制代码
#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"


int main(void)
{
	OLED_Init();       //oled  屏幕初始化
	
	/*
	第一步:开启LSI的时钟(打开看门狗会自动开LSI,所以这一步什么都不做)
	
	第二步:写入0x5555 解除写保护  (IWDG_WriteAccessCmd())
	
	第三步:写入预分频器IWDG_PR和重装寄存器IWDG_RLR  超时时间:Tiwdg= Tlsi * PR预分频系数 X (RL+1) Tlsi=1/Flsi (喂狗)
			IWDG_SetPrescaler()写预分频器
			IWDG_SetReload()写重装值
			IWDG_ReloadCounter()(喂狗)
	
	第四步:写入0xCCCC  启动独立看门狗
	*/
	
	OLED_ShowString(1,1,"IWDG Reset");
	if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) == SET)   //如果(RCC读看门狗复位标志位为1)
	{
		OLED_ShowString(2,1,"IWDG RST");                    // 显示:IWDG RST
		Delay_ms(500);                                      // 等待500毫秒 
		OLED_ShowString(2,1,"        ");                    // 显示:空格
		Delay_ms(500);                                      // 等待500毫秒
		
		RCC_ClearFlag();                                    //清除看门狗复位标志位
	}
	else                                             //否则:
	{
		OLED_ShowString(3,1,"RST");                         // 显示:RST
		Delay_ms(500);                                      // 等待500毫秒 
		OLED_ShowString(3,1,"   ");                         // 显示:空格
		Delay_ms(500);                                      // 等待500毫秒
	}
	
	//第二步:写入0x5555 解除写保护  (IWDG_WriteAccessCmd())
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	
	//第三步:写入预分频器IWDG_PR和重装寄存器IWDG_RLR
			//IWDG_SetPrescaler()写预分频器
			//IWDG_SetReload()写重装值
			//IWDG_ReloadCounter()(喂狗)
	IWDG_SetPrescaler(IWDG_Prescaler_16);   //比如设置超时时间为1000ms  Tlsi=1/40KHz 0.025ms  预分频系数设为16  那重装值=1000/0.025/16-1
	IWDG_SetReload(2499);
	IWDG_ReloadCounter();  //喂一次狗
	IWDG_Enable();         //启动看门狗
	
	while(1)
	{
		IWDG_ReloadCounter();  //喂一次狗
		Delay_ms(1050);       //这个延时过长就会触发看门狗复位
	}
	
}

这样编译下载后就能看到程序的最终效果:

相关推荐
蹊黎20 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
Zw-awa1 天前
从 CPU 搬运到自动搬运:DMA、空闲中断和两块缓冲
stm32
无敌贵点大王1 天前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件
庙堂龙吟奈我何1 天前
二进制和十六进制
stm32·单片机
国科安芯1 天前
长期在轨的计算底座:商业空间站与在轨服务飞行器健康管理中的抗辐射MCU—— 面向可维护空间平台的分层容错与安全通信综述
人工智能·单片机·嵌入式硬件·安全·低轨卫星·抗辐射
TST-魚爷1 天前
小型视频会议室音频踩坑:一体化拾音扩音方案实测分享(易视讯)
stm32·电脑·音视频·钉钉·腾讯会议·zoom会议
不昀1 天前
RMII切到10Mbps,50MHz参考时钟也要降到5MHz吗?
单片机·嵌入式硬件·硬件设计·以太网接口
路上有只喵1 天前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇6
单片机·嵌入式硬件
国科安芯1 天前
核电站蒸汽发生器传热管在役无损检测模拟前端的低噪声供电研究
嵌入式硬件·ldo·低压差线性稳压器·无损检测·核电站·蒸汽发生器·传热管
集芯微电科技有限公司1 天前
40V/24A高频率增强型GaN HEMT功率开关管/高频DC转换/电动工具/GaN充电器 方案首选
人工智能·科技·单片机·嵌入式硬件·深度学习·神经网络·生成对抗网络