Expérience 5 Expérience de surveillance indépendante
1 Environnement de développement
- STM32F407ZGT6
- Wedge uVision 5
2 Contenu de l'expérience
- La LED0 est allumée pour indiquer que le système fonctionne. Si le chien de garde effectue une réinitialisation, la LED0 s'éteint (clignote).
- Appuyez sur le mode d'interruption externe de KEY1 pour nourrir le chien au lieu du mode de requête.
- Avant que le signal de réinitialisation du chien de garde ne soit généré, une alarme sonore et visuelle est déclenchée, c'est-à-dire que la LED1 commence à clignoter environ 1,5 seconde avant la réinitialisation et le buzzer émet un bip par intermittence pour rappeler au chien de se nourrir.
- Après avoir appuyé sur KEY1 pour nourrir le chien, tous les messages d'alarme seront immédiatement annulés.
- Les longs délais, tels que delay_ms (1000), ou les longs délais déguisés, pour les boucles, etc. ne sont pas autorisés.
- Les minuteries ne sont pas autorisées.
3 Code expérimental
[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 sujets nécessitant une attention particulière
Après avoir appris la minuterie, elle peut être réalisée par minuterie.