1 开发环境
- STM32F407ZGT6
- Keil uVision 5
2 实验内容
- LED0亮指示系统正在运行,如果看门狗发出复位,则LED0会熄灭(跳闪)。
- 按键KEY1的外部中断方式来喂狗,而不用查询方式。
- 在看门狗复位信号产生前进行声光报警,即复位前1.5秒左右LED1开始闪烁,同时蜂鸣器间断鸣叫,提示喂狗。
- 按KEY1喂狗后,报警信息立即全部解除。
- 不允许用长延时,比如delay_ms(1000),或者变相的长延时,for循环等。
- 不允许使用定时器。
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 注意事项
学了定时器后,可用定时器实现。