【嵌入式系统实验】实验五 独立看门狗实验

1.实验环境

(1)Keil uVision5
(2)STM32F407ZGT6

2.实验内容

(1) LED0亮指示系统正在运行,如果看门狗发出复位,则LED0会熄灭(跳闪)。
(2)按键KEY1的外部中断方式来喂狗,而不用查询方式;
(3)在看门狗复位信号产生前进行声光报警,即复位前1.5秒左右LED1开始闪烁,同时蜂鸣器间断鸣叫,提示喂狗。
(4)按KEY1喂狗后,报警信息立即全部解除。
(5)不允许用长延时,比如delay_ms(1000),或者变相的长延时, for循环等。

3.实验代码

【exti.c】

extern int flag;

//外部中断0服务程序
void EXTI3_IRQHandler(void)
{
    
    
	delay_ms(10);//
	if(KEY1==0)
	{
    
    
	   IWDG_Feed();//喂狗
		 BEEP=0;//解除报警
		 LED1=1;//熄灭闪烁的灯
		 flag=1;//修改标志位
	}		 
	EXTI_ClearITPendingBit(EXTI_Line3);  //
}

【main.c】

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "iwdg.h"
#include "exti.h"

void alarm(void)//报警函数
{
    
    
	  
	  GPIO_SetBits(GPIOF,GPIO_Pin_8);//蜂鸣器鸣叫
		GPIO_ResetBits(GPIOF,GPIO_Pin_10);//LED1闪烁
    delay_ms(50);
    GPIO_ResetBits(GPIOF,GPIO_Pin_8);
		GPIO_SetBits(GPIOF,GPIO_Pin_10);
    delay_ms(50);
}

int flag=0;//标志是否喂狗:1-喂了

int main(void)
{
    
     
  u8 count=0;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	LED_Init();				//初始化LED端口
	KEY_Init();		  	//初始化按键
	BEEP_Init();			//初始化蜂鸣器
	delay_ms(100);		//延时
	EXTIX_Init();			//中断初始化
	IWDG_Init(6,750); //与分频数为256,重载值为750,溢出时间为6s	
	LED0=0;					  //先点亮LED0
	while(1)
	{
    
    
		if(flag==1)
		{
    
    
			flag=0;//恢复标志位
			count=0;//重新将计数器清零,再次开始计数
		}
		count++;//计数器计数
		delay_ms(20);
		if(count>=220)//通过反复测试,得到一个计数值,满足
		{
    
    
			alarm();//复位前1.5秒左右开始报警
		}
	};

}

4.注意事项

(1)计数峰值count根据不同的实验板可能会有不同。

猜你喜欢

转载自blog.csdn.net/qq_41315788/article/details/108754821