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根据不同的实验板可能会有不同。