你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

外部中断只能响应一次,求大神指点!

[复制链接]
eason1931 提问时间:2014-11-25 10:48 /
使用PB12,PB13,PE14,PE15作为外部中断,PE14,PE15响应正常,但PB12,PB13无法正常进入中断,代码如下,求指点。。

void EXTI15_10_IRQHandler(void)
{       
       
        //KEY_OK
        if(EXTI_GetITStatus(EXTI_Line14)==SET)
                {                       
                        IO_OutputData(0x00);
                        delay_us(10);
                        EXTI_ClearITPendingBit(EXTI_Line14);                                               
                }
               
        //KEY_UP
        if(EXTI_GetITStatus(EXTI_Line15)==SET)
                {                       
                        IO_OutputData(0xff);
                        delay_us(10);
                        EXTI_ClearITPendingBit(EXTI_Line15);                       
                }
        //KEY_DOWN
        if(EXTI_GetITStatus(EXTI_Line12)==SET)
                {
                       
                        IO_OutputData(0xff);
                        delay_us(10);
                        EXTI_ClearITPendingBit(EXTI_Line12);                                               
                }
               
        //KEY_CANCEL
        if(EXTI_GetITStatus(EXTI_Line13)==SET)
                {                       
                        IO_OutputData(0x00);
                        delay_us(10);
                        EXTI_ClearITPendingBit(EXTI_Line13);               
                }
}


----------------------------------------------------------------------
void NVIC_Configuration(void)
{       
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
       
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;         
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;         
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);               
}

--------------------------------------------------------------------------------------
void KEY_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
        EXTI_InitTypeDef        EXTI_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = KEY_OK        |        KEY_UP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);               
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin = KEY_DOWN        |        KEY_CANCEL;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource14);
        EXTI_InitStructure.EXTI_Line = EXTI_Line14 ;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                        
        EXTI_Init(&EXTI_InitStructure);

        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource15);
        EXTI_InitStructure.EXTI_Line = EXTI_Line15 ;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                        
        EXTI_Init(&EXTI_InitStructure);         
         
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);
        EXTI_InitStructure.EXTI_Line = EXTI_Line12 ;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                        
        EXTI_Init(&EXTI_InitStructure);         
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
        EXTI_InitStructure.EXTI_Line = EXTI_Line13;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;        
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                        
        EXTI_Init(&EXTI_InitStructure);  

        EXTI_ClearITPendingBit(EXTI_Line12);
        EXTI_ClearITPendingBit(EXTI_Line13);
        EXTI_ClearITPendingBit(EXTI_Line14);
        EXTI_ClearITPendingBit(EXTI_Line15);
                       
}



收藏 评论7 发布时间:2014-11-25 10:48

举报

7个回答
巅峰残狼 回答时间:2014-11-25 11:33:03
在EXTI_ClearITPendingBit(EXTI_Line12);之前加一句EXTI_ClearFlag(EXTI_Line12);试试
eason1931 回答时间:2014-11-25 13:05:47
巅峰残狼 发表于 2014-11-25 11:33
在EXTI_ClearITPendingBit(EXTI_Line12);之前加一句EXTI_ClearFlag(EXTI_Line12);试试

试了,没能解决问题,这两个函数是一样的吧
bbstr 回答时间:2014-11-26 08:04:01
如果12,13可以进入一次的话,可能配置没啥问题,将你的IO_OutputData贴出来看看,是不是在里面修改了12,13管脚的属性了
eason1931 回答时间:2014-11-26 08:47:37
bbstr 发表于 2014-11-26 08:04
如果12,13可以进入一次的话,可能配置没啥问题,将你的IO_OutputData贴出来看看,是不是在里面修改了12,1 ...

void IO_OutputData(u8 DATA)
{
        u8 IO_E,IO_B_L,IO_B_H;
        IO_E                =        ((DATA&0x01)<<1)|((DATA&0x02)>>1);       
        IO_B_H        =        ((DATA&0x04)>>1)|((DATA&0x08)>>3);
        IO_B_L        =        ((DATA&0x10)<<2)|((DATA&0x40)>>2)|(DATA&0x20)|((DATA&0x80)>>4);
        GPIOE->BSRR = (IO_E & 0xff) | (~IO_E & 0xff)<<16;       
        GPIOB->BSRR = (IO_B_L & 0xff)        |        (IO_B_H & 0xff)<<8        |        (~IO_B_L & 0xff)<<16        |        (~IO_B_H & 0xff)<<24;
}

求大神指点
无-387726 回答时间:2014-11-26 09:33:09
是不是不能在中断中有延时?为什么在中断中延时delay_us(10)?
eason1931 回答时间:2014-11-26 09:41:46
bbstr 发表于 2014-11-26 08:04
如果12,13可以进入一次的话,可能配置没啥问题,将你的IO_OutputData贴出来看看,是不是在里面修改了12,1 ...

已解决,果然是 IO_OutputData的问题
void IO_OutputData(u8 DATA)
{
        u8 IO_E,IO_B_L,IO_B_H;
        IO_E                =        ((DATA&0x01)<<1)|((DATA&0x02)>>1);       
        IO_B_H        =        ((DATA&0x04)>>1)|((DATA&0x08)>>3);
        IO_B_L        =        ((DATA&0x10)<<2)|((DATA&0x40)>>2)|(DATA&0x20)|((DATA&0x80)>>4);
        GPIOE->BSRR = (IO_E & 0xff) | (~IO_E & 0xff)<<16;       
        GPIOB->BSRR = (IO_B_L & 0xff)        |        (~IO_B_L & 0xff)<<16        |        (IO_B_H & 0x03)<<8        |        (~IO_B_H & 0x03)<<24;
       
}
bbstr 回答时间:2015-2-17 16:29:26
eason1931 发表于 2014-11-26 09:41
已解决,果然是 IO_OutputData的问题
void IO_OutputData(u8 DATA)
{

兄弟,如果解决了问题,把我的回复设为最佳答案啊,这样咱俩都有金币得了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版