初级会员

- 积分
- 85
- 金钱
- 85
- 注册时间
- 2012-6-13
- 在线时间
- 0 小时
|
背景:KEY1和KEY0分别控制一个LED灯,WA_UP控制两个灯全灭
外部中断会出现这样的问题:key1和key0按下时,我指的是一直按下,有的时候会出现灯一直闪烁的情况,有的时候灯会保持长亮或者灭掉非常稳定
没有找到具体规律。如果按下后中断清零,不应该出现一直按下,有的时候会出现灯一直闪烁的情况。寻求原因,谢谢
#include <stm32f10x_lib.h>
#include <sys.h>
#include <usart.h>
#include <delay.h>
void EXTI15_10_IRQHandler(void)
{
if((GPIOA->IDR&0x8000)==0) //PA15,有键KEY1按下
{
delay_ms(30);
if((GPIOA->IDR&0x8000)==0)
{
PAout(8)=~PAout(8); //PA8输出为0 ,led点亮
EXTI-> R=1<<15;// 写入1清除
}
}
if((GPIOA->IDR&0x2000)==0) //PA13,有键KEY0按下
{
delay_ms(30);
if((GPIOA->IDR&0x2000)==0)
{
PDout(2)=~PDout(2); //PD2输出为0 ,led点亮
EXTI-> R=1<<13;// 写入1清除
}
}
}
void EXTI0_IRQHandler(void)
{
if((GPIOA->IDR&0x0001)==1) //PA0为输入,按下键WA_UP接高电平
{
delay_ms(30);
if((GPIOA->IDR&0x0001)==1)
{
GPIOD->ODR|=0x00000004; //PD2输出高,关闭LED
GPIOA->ODR|=0x00000100; //PA8输出高,关闭LED
EXTI-> R=1<<0;// 写入1清除
}
}
}
main()
{ Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);//延时初始化
JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD
RCC->APB2ENR|=1<<2;//使能PORTA时钟
RCC->APB2ENR|=1<<5;//使能PORTD时钟
RCC->APB2ENR|=0x0001;//使能辅助功能IO时钟
GPIOA->CRH&=0xFF0FFFFF;
GPIOA->CRH|=0X00800000;//设定PA13为输入
GPIOA->ODR&=0x0000DFFF;
GPIOA->ODR|=0x00002000; //设定为输入上拉
GPIOA->CRH&=0x0FFFFFFF;
GPIOA->CRH|=0X80000000;//设定PA15为输入
GPIOA->ODR&=0x00007FFF;
GPIOA->ODR|=0x00008000; //设定为输入上拉
AFIO->EXTICR[3]&=0x0FFF;//选择PA13,PA15为外部中断输入源
AFIO->EXTICR[3]&=0xFF0F;//选择PA13,PA15为外部中断输入源
GPIOA->CRL&=0xFFFFFFF0;
GPIOA->CRL|=0X00000008;//设定PA0为输入
GPIOA->ODR&=0x0000FFFE;
GPIOA->ODR|=0x00000000; //设定输入下拉
AFIO->EXTICR[0]&=0xFFF0;//选择PA0为外部中断输入源
EXTI->IMR=0XA001;//使能线15,线13,线0中断输入
EXTI->EMR=0X0000; //屏蔽线15,线13,线0事件请求
EXTI->FTSR=0XA000;//使能线15,线13上的下降沿触发
EXTI->RTSR=0x0001;//使能线0上的上升沿触发
GPIOA->CRH&=0xFFFFFFF0;
GPIOA->CRH|=0X00000003;//设定PA8为输出,连接LED
GPIOA->ODR&=0x0000FEFF;
GPIOA->ODR|=0x00000100; //设定输出高
GPIOD->CRL&=0xFFFFF0FF;
GPIOD->CRL|=0X00000300;//设定PD2为输出,连接LED
GPIOD->ODR&=0x0000FFFB;
GPIOD->ODR|=0x00000004; //设定输出高
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2);//抢占2,子优先级1,组2
while(1)
{
delay_ms(10);
}
}
|
|