| 
 
| 功能描述:按键按下,触发中断,输出一个高电平(对高电平时间无严格要求)。按键按下,伴随有蜂鸣器提示音。
 实验结果:按键按下蜂鸣器响,但是IO口不变,用示波器看,IO口一直都是有杂波的高电平。
 
 请各位前辈指点下,这个实验,不知道是哪里有纰漏。用debug调试的时候,按下按键后,依旧停留在服务函数的if语句。
 
 实在是检查不出来。在此谢过,麻烦大家给点看法。
 
 IO口和EXTI的中断线是对应的。debug时,进入中断服务函数中,执行到delay_ms(500);依旧会有蜂鸣器叫声,但是在flag前后再次加入BEEP=1和BEEP=0,又会再次鸣叫。也就是执行到了GPIO_SetBits,但是,示波器无显示。
 
 求解啊,这么简单的功能,程序也不复杂,但确实是不知道怎么下手了
 
 
 <exti文件>
 
 #include "exti.h"
 #include "led.h"
 #include "key.h"
 #include "delay.h"
 #include "usart.h"
 #include "beep.h"
 
 int flag;
 
 //外部中断0服务程序
 void EXTIX_Init(void)
 {
 
 EXTI_InitTypeDef EXTI_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 KEY_Init();         //        按键端口初始化,扫面按键是否按下
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
 
 //GPIOE.2 中断线以及中断初始化配置   下降沿触发
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
 
 EXTI_InitStructure.EXTI_Line=EXTI_Line2;        //KEY2
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 EXTI_Init(&EXTI_InitStructure);         //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
 
 //GPIOA.0          中断线以及中断初始化配置 上升沿触发 PA0  WK_UP
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
 
 EXTI_InitStructure.EXTI_Line=EXTI_Line0;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
 EXTI_Init(&EXTI_InitStructure);         //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
 
 
 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;         //使能按键WK_UP所在的外部中断通道
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;         //子优先级3
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道
 NVIC_Init(&NVIC_InitStructure);
 
 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;         //使能按键KEY2所在的外部中断通道
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;         //子优先级2
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道
 NVIC_Init(&NVIC_InitStructure);
 
 X_Y_DIR( );
 
 }
 ////////////////////////////////////////////////
 void X_Y_DIR(void) //PB3初始化,X方向手动输出
 {
 GPIO_InitTypeDef GPIO_InitStructure;
 //初始化KEY0-->GPIOA.13,KEY1-->GPIOA.15  上拉输入
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTE时钟
 
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3|GPIO_Pin_4;//PB3
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB3、4
 
 }
 /////////////////////////////////////////////////
 
 //外部中断0服务程序
 void EXTI0_IRQHandler(void)
 {
 delay_ms(10);//消抖
 if(KEY3==1)         //WK_UP按键
 {
 BEEP=1;
 delay_ms(100);
 BEEP=0;         //蜂鸣器提示一下
 
 flag=1;       //  //
 
 //            GPIO_SetBits(GPIOB, GPIO_Pin_3);              //PB.3输出一个脉冲
 delay_ms(500);
 //         GPIO_ResetBits (GPIOB, GPIO_Pin_3);
 
 flag=0;
 }
 EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
 }
 
 //外部中断2服务程序
 void EXTI2_IRQHandler(void)
 {
 delay_ms(10);//消抖
 if(KEY2==0)         //WK_2按键
 {
 BEEP=1;
 delay_ms(100);
 BEEP=0;         //蜂鸣器提示一下
 GPIO_SetBits(GPIOB, GPIO_Pin_4);              //PB.3输出一个脉冲
 delay_ms(500);
 GPIO_ResetBits (GPIOB, GPIO_Pin_4);
 }
 EXTI_ClearITPendingBit(EXTI_Line2);  //清除LINE2上的中断标志位
 }
 
 
 <main文件>
 #include "led.h"
 #include "delay.h"
 #include "key.h"
 #include "sys.h"
 #include "usart.h"
 #include "exti.h"
 #include "beep.h"
 
 extern int flag;
 int main(void)
 {
 delay_init();                     //延时函数初始化
 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 uart_init(9600);         //串口初始化为9600
 //        LED_Init();                   //初始化与LED连接的硬件接口
 BEEP_Init();         //初始化蜂鸣器端口
 
 KEY_Init();         //初始化与按键连接的硬件接口
 EXTIX_Init();         //外部中断初始化
 //        LED0=0;         //点亮LED0
 
 while(1)
 {
 //         printf("OK\r\n");
 //         delay_ms(1000);
 if( flag==1)
 GPIO_SetBits(GPIOB, GPIO_Pin_3);
 if(flag==0)
 GPIO_ResetBits (GPIOB, GPIO_Pin_3);
 
 }
 }
 
 
 
 | 
 |