野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14027|回复: 6

用中断控制LED,但是按键按下后LED灯暂停,而不是按照中断程序里面要求的进行,为啥?

[复制链接]
发表于 2016-7-30 01:20:51 | 显示全部楼层 |阅读模式
下面是我的LED 和定时器的配置是可以的  但是就是中断出错,不知道为什么,按键按下就是暂停了 而且只有一个按键有用,求大神指导一下是什么地方的问题,

#define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_0)
#define LED1_OFF  GPIO_SetBits(GPIOB,GPIO_Pin_0)

#define LED2_ON GPIO_ResetBits(GPIOB,GPIO_Pin_1)
#define LED2_OFF  GPIO_SetBits(GPIOB,GPIO_Pin_1)

//LED3õê¼»ˉoˉêy


//ÅäÖÃǶì×ÖD¶ÏNVIC

static void NVIC_Configuration(void)
{
        NVIC_InitTypeDef  NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        //ÅäÖÃÖD¶Ï0
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
       
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority       =0;
        NVIC_InitStructure.NVIC_IRQChannelCmd  =  ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        //ÅäÖÃÖD¶ÏÔ′ 13
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority       =0;
        NVIC_InitStructure.NVIC_IRQChannelCmd  =  ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

//ÅäÖÃÖD¶Ï¿ú£¬éèÖÃÖD¶ÏóÅÏ輶

void EXTI_Pxy_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        //¿aÆôê±ÖóPA0
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        NVIC_Configuration();
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //PA0ÖD¶ÏÏßéèÖÃ
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
        EXTI_InitStructure.EXTI_Line=EXTI_Line0;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        //PC13ÖD¶ÏÏßéèÖÃ
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
        EXTI_InitStructure.EXTI_Line=EXTI_Line2;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);

       
}



//¶¨ê±Æ÷Systick
static __IO u32 TimingDelay;

void SysTick_Init(void)
{
        if(SysTick_Config(SystemCoreClock/100000))
        {
                while(1);
        }
        //1رն¨ê±Æ÷
        SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

//USÑó3ùoˉêy
void us_delay(__IO u32 nTime)
{
        TimingDelay=nTime;
        SysTick->CTRL |=SysTick_CTRL_ENABLE_Msk;
        while(TimingDelay!=0);
}

void TimingDelay_Decrement(void)
{
        if(TimingDelay!=0x00)
        {
                TimingDelay--;
        }
}
//Ö′DDÖD¶Ïoˉêy
void EXTI_INT_FUNCTION(void)
{
        if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
        {
                GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//                us_delay(100000);
        //        LED1_OFF;
        //        us_delay(500000);
                //Çå3yÖD¶Ï±êÖ¾
                EXTI_ClearITPendingBit(EXTI_Line0);
/*                while(1)
                {
                        LED1_ON;
                        us_delay(100000);
                        LED1_OFF;
                        us_delay(500000);
                }
        }
        if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
        {
                LED2_ON;
                us_delay(100000);
                LED2_OFF;
                us_delay(100000);
                //
                EXTI_ClearITPendingBit(EXTI_Line2);
        }
        */
       
}
}               
/*
           Ö÷oˉêy
*/
void EXTI_INT_FUNCTION();
int main(void)
{
        GPIO_LED_Config();
        __set_PRIMASK(0);
        EXTI_Pxy_Config();
        SysTick_Init();
        while(1)
        {
                LED1_ON;
                us_delay(100000);
                LED1_OFF;
                us_delay(100000);
                LED2_ON;
                us_delay(100000);
                LED2_OFF;
                us_delay(100000);
                LED2_ON;
                us_delay(100000);
                LED2_OFF;
                us_delay(100000);
               
        }
       
}



回复

使用道具 举报

发表于 2016-7-30 08:47:22 | 显示全部楼层
检查下中断服务函数那个宏名是否写对了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-30 10:27:49 | 显示全部楼层
flyleaf 发表于 2016-7-30 08:47
检查下中断服务函数那个宏名是否写对了

写对了之后还是这样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-30 11:26:41 | 显示全部楼层
flyleaf 发表于 2016-7-30 08:47
检查下中断服务函数那个宏名是否写对了

那个按键中断一个是解决了,但是还有个问题,我另外一个按键没用了,我是设置了两个中断,一个按键执行一个中断,不知道为什么只有其中一个有用,要写多个中断要怎么写,注意什么啊
回复 支持 反对

使用道具 举报

发表于 2016-7-30 11:42:08 | 显示全部楼层
这个不是可以直接参考例程里的中断反转led灯吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-30 13:12:23 | 显示全部楼层
左丘冰 发表于 2016-7-30 11:42
这个不是可以直接参考例程里的中断反转led灯吗?

是参考了,就是一个按键有用,另一个没用了,我配置了两个中断线,两个按键,但是只有其中一个有用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-30 14:42:50 | 显示全部楼层
那个按键有用了  但是又有个问题出现了,就是两个按键在第一个按得时候,按照程序执行的来,但是第二次按得时候,好像就执行了中断服务函数里面的东西,没有跳出来,
其他配置应该没问题,下面是我写的主函数和中断服务函数,要实现按一下就切换到另一个灯的闪烁的功能,我用了两个按键和两个中断
//ÖD¶Ï·tÎñoˉêy
void EXTI0_IRQHandler (void)
{
        if(EXTI_GetITStatus(EXTI_Line0) != RESET) //è·±£êÇ·ñ2úéúáËEXTI LineÖD¶Ï
        {
                // LED1        
                LED1_ON;
                LED2_OFF;
                a=2;

                EXTI_ClearITPendingBit(EXTI_Line0);                //Çå3yÖD¶Ï±ê־λ

        }  
       
}

void EXTI15_10_IRQHandler (void)
{
        if(EXTI_GetITStatus(EXTI_Line13) != RESET) //è·±£êÇ·ñ2úéúáËEXTI LineÖD¶Ï
        {
                // LED1        
                LED1_OFF;
                LED2_ON;
                a=3;

                EXTI_ClearITPendingBit(EXTI_Line13);                //Çå3yÖD¶Ï±ê־λ

        }  
}

/*
           Ö÷oˉêy
*/
int main(void)
{
        a=1;
        GPIO_LED_Config();
        __set_PRIMASK(0);
        EXTI_Pxy_Config();
        SysTick_Init();
        for(;a==1;)
        {
                LED1_ON;
                us_delay(100000);
                LED1_OFF;
                us_delay(100000);
                LED2_ON;
                us_delay(100000);
                LED2_OFF;
                us_delay(100000);
                LED2_ON;
                us_delay(100000);
                LED2_OFF;
                us_delay(100000);
               
        }
        for(;a==2;)
        {
                LED1_ON;
                us_delay(100000);
                LED1_OFF;
                us_delay(500000);
               
        }
        for(;a==3;)
        {
                LED2_ON;
                us_delay(100000);
                LED2_OFF;
                us_delay(100000);
        }
       
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-12 09:49 , Processed in 0.063804 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表