STM32独立看门狗实验

声明:所有资源均来自于普中STM32F103开发板相关资料,这是自己购买的一款开发板,如果原作者认为侵权,请联系我以便及时处理。

IWDG介绍

STM32F1芯片内部含有两个看门狗外设,一个是独立看门狗IWDG,另
一个是窗口看门狗WWDG。两个看门狗外设(独立和窗口)均可用于检测
并解决由软件错误导致的故障。独立看门狗简单理解其是就是一个12位
递减计数器,当计数器从某一个值递减到0时(如果看门狗已激活),系
统就会产生一次复位。如果在计数器递减到0之前刷新了计数器值,那么
系统就不会产生复位。这个刷新计数器值过程我们称之为“喂狗”。看
门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。

内部结构

在这里插入图片描述

IWDG配置步骤

IWDG相关库函数在stm32f10x_iwdg.c和stm32f10x_iwdg.h文件中

1)开启寄存器访问(给IWDG_KR寄存器写入0X5555IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);2)设置IWDG预分频系数和重装载值 
		void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); 
		void IWDG_SetReload(uint16_t Reload);
		Tout = (4*2^pre) / 40 * rlr
	其中Tout为独立看门狗溢出时间,单位是ms。pre是预分频器系数(0-6),rlr 
是重装载寄存器的值,公式内的40是独立看门狗的时钟。
(3)重载计数器值(喂狗)(给IWDG_KR寄存器写入0XAAAAIWDG_ReloadCounter();4)开启IWDG(给IWDG_KR寄存器写入0XCCCCIWDG_Enable();

硬件电路

D1指示灯用来提示系统运行,D2指示灯用来作为喂狗和系统重
启时的提示,K_UP按键用来喂狗操作,喂狗时D2指示灯亮,喂狗失败系
统重启,D2指示灯灭。

编写独立看门狗控制程序

通过K_UP按键进行喂狗,喂狗的时候D2指示灯亮,同时串口输出“喂狗”提示信息,超过喂狗时间系统重启D2指示灯灭,同时串口输出“复位系统”提示信息,同时使用D1指示灯闪烁表
示系统运行。

iwdg.h

#ifndef _iwdg_H
#define _iwdg_H

#include "system.h"
void IWDG_Init(u8 pre,u16 rlr);
void IWDG_FeedDog(void);  //喂狗

#endif


iwdg.c

#include "iwdg.h"

/*******************************************************************************
* 函 数 名         : IWDG_Init
* 函数功能		   : IWDG初始化
* 输    入         : pre:预分频系数(0-6)
					 rlr:重装载值(12位范围0xfff)
					 独立看门狗复位时间计算公式:t=(4*2^pre*rlr)/40
* 输    出         : 无
*******************************************************************************/
void IWDG_Init(u8 pre,u16 rlr)
{
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护
	IWDG_SetPrescaler(pre);//设置预分频系数 0-6
	IWDG_SetReload(rlr);//设置重装载值
	IWDG_ReloadCounter();  //重装载初值
	IWDG_Enable(); //打开独立看门狗
	
}

/*******************************************************************************
* 函 数 名         : IWDG_FeedDog
* 函数功能		   : 喂狗
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void IWDG_FeedDog(void)  //喂狗
{
	IWDG_ReloadCounter();  //重装载初值
}


main.c

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "key.h"
#include "iwdg.h"

/* bug:使用普中自带的串口助手,调试信息可以打印;但是使用其它的串口助手,发现系统
*       没有起来,原因未知,看门狗程序是正确的,只是调试打印信息有问题
*/
/*******************************************************************************
* 函 数 名         : main
* 函数功能		     : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main()
{
	u8 i=0; 
		
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	LED_Init();
	USART1_Init(9600);
	
	KEY_Init();
	IWDG_Init(4,800); //只要在1280ms内进行喂狗就不会复位系统
	
	led2=1;
	printf("复位系统\r\n");
	
	while(1)
	{
		if(KEY_Scan(0)==KEY_UP)
		{
			IWDG_FeedDog();//喂狗
			led2=0;
			printf("喂狗\r\n");
		}
		
		i++;
		if(i%20==0)
		{
			led1=!led1;
			
		}
		delay_ms(10);
	}
}

实验现象

如果在规定的时间内没有按下KEY_UP按键,串口打印系统复位,如果按下了按键,那么串口打印喂狗。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值