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

1 开发环境

  • STM32F407ZGT6
  • Keil uVision 5

2 实验内容

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

3 实验代码

[exti.c]

int flag=0;//喂狗标志

//外部中断3服务程序
void EXTI3_IRQHandler(void)
{
    
    
	delay_ms(10);	//消抖
	if(KEY1==0)	 
	{
    
    
		IWDG_Feed();
		BEEP=0;
		LED1=1;
		flag=1;
	}		 
	 EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位  
}

[main.c]

int main(void)
{
    
     
	u16 prer=4;					//分频系数,4*2^prer=64
	u16 rlr=500*5;				//计数重载值
	u16 count=0;				//计数变量
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置系统中断优先级分组2
	delay_init(168);			//初始化延时函数
	LED_Init();					//初始化LED端口
	KEY_Init();					//初始化按键
	BEEP_Init();				//初始化蜂鸣器
	EXTIX_Init();				//初始化外部中断输入
	delay_ms(200);				//延时200ms 
	IWDG_Init(prer,rlr);		//分频系数为64,重载值为500时,溢出时间为1s
								//此实验设计溢出时间为1*5=5s
	LED0=0;						//先点亮红灯
	
	while(1){
    
    
		count++;
		if(!flag){
    
    				//当没有喂狗
			if(count>=380){
    
    		//程序大约还剩1.5s运行结束
				mywarning();	//喂狗报警提示
			}
		}
		else{
    
    					//当喂狗了
			count=0;			//重新计数
			flag=0;				//清除喂狗标志
		}
		delay_ms(10);			//小延时
	};

}

/*声光报警*/
void mywarning(void){
    
    
	LED1=!LED1;
	BEEP=!BEEP;
	delay_ms(100);
}

4 注意事项

学了定时器后,可用定时器实现。

猜你喜欢

转载自blog.csdn.net/qq_44714521/article/details/108704695