#include "sys.h"
#include "delay.h"
#include "led.h"
#include "exit.h"
unsigned char LED_sta=0;
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //LED初始化
Exit_Init(); //外部中断初始化
while(1)
{
}
}
//外部中断0复服务程序
void EXTI0_IRQHandler(void)
{
//简单的防抖处理
delay_ms(5);
if(KEY!=0)
{
EXTI->PR=1<<0; //清除LINE0上的中断标志位
return;
}
LED0=~LED0;
EXTI->PR=1<<0; //清除LINE0上的中断标志位
}
外部中断实验:
通过中断来控制LED灯的亮灭
主函数中将所有要用的东西初始化,
然后进入while(1)中的“待机”状态
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //LED初始化
Exit_Init();
while(1)
{
}
}
看到外部中断0复服务程序(什么是复服务程序没懂)
//外部中断0复服务程序
void EXTI0_IRQHandler(void)
{
//简单的防抖处理
delay_ms(5);
if(KEY!=0)
{
EXTI->PR=1<<0; //清除LINE0上的中断标志位
return;
}
LED0=~LED0;
EXTI->PR=1<<0; //清除LINE0上的中断标志位
}
进入程序时先知道,按钮一旦按下,相当于把LINE0上的中断标志位置1,(这个东西应该是决定了中断程序是否进行下去的)让程序从while(1)中脱离,进入中断服务程序
进入程序后先进行简单的消除抖动(按键的物理特性按下时会有不规则的抖动),消除抖动后再判断按键是否按下(是否为低电平),如果是低电平说明按键并没有按下,则清除中断标志位,return到主函数中;
如果是高电平的话,就会滤过上面的 if 判断,将LED 状态取反,然后再清除 LINE0 的中断标志位,退出中断回到主函数中
#ifndef __EXIT_H
#define __EXIT_H
#include "sys.h"
#define KEY PCin(0)
void Exit_Init(void);
#endif
EXIT 头文件中定义了 KEY 是 PCin(0), 而中断程序就是要监测到 KEY 的电平状态来判断是否进入中断。