OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2273|回复: 5

STM32F103RCT6外部中断求助

[复制链接]

5

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2019-4-19
在线时间
44 小时
发表于 2019-4-22 10:59:50 | 显示全部楼层 |阅读模式
3金钱



程序现象是8个按键都可以响一遍  但全部按过一遍后  只有UP键  还能响   ;单步调试是发现只在中断15_10处理函数中来回扫描   中断9_5函数一次都不扫描  也不会触发。求大佬说说我哪里出问题了。


//外部中断初始化函数
void EXTIX_Init(void)
{

          EXTI_InitTypeDef EXTI_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
       
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTB,PORTC时钟
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟

          KEY_Init();//初始化按键对应io模式

    //GPIOC.6 GPIOC.7 GPIOC.8 GPIOC.9 中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6|GPIO_PinSource7|GPIO_PinSource8|GPIO_PinSource9);

          EXTI_InitStructure.EXTI_Line=EXTI_Line6|EXTI_Line7|EXTI_Line8|EXTI_Line9;
          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寄存器

    //GPIOB.12 GPIOB.13 GPIOB.14 GPIOB.15        中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12|GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15);

          EXTI_InitStructure.EXTI_Line=EXTI_Line12|EXTI_Line13|EXTI_Line14|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);          //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
               
                NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                              //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);
               
          NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                                //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
               


}



void EXTI9_5_IRQHandler(void)     //中断处理函数
{       
        delay_ms(10);    //消抖                                        
        if(F2==0)
        {Beepalarm();EXTI_ClearITPendingBit(EXTI_Line8);} //清除LINE5上的中断标志位  
                                        
        if(DOWN==0)
        {Beepalarm();EXTI_ClearITPendingBit(EXTI_Line6);} //清除LINE5上的中断标志位  
                                
        if(Right==0)
        {Beepalarm();EXTI_ClearITPendingBit(EXTI_Line7);} //清除LINE5上的中断标志位  
                                        
        if(ESC==0)
        {Beepalarm();EXTI_ClearITPendingBit(EXTI_Line9);} //清除LINE5上的中断标志位  
}


void EXTI15_10_IRQHandler(void)
{
  delay_ms(10);    //消抖                         
  if(MENU==0){Beepalarm();EXTI_ClearITPendingBit(EXTI_Line12); } //清除LINE12线路挂起位

  if(F1 ==0){Beepalarm();EXTI_ClearITPendingBit(EXTI_Line13);}  //清除LINE12线路挂起位
         
  if(Left==0){Beepalarm();EXTI_ClearITPendingBit(EXTI_Line14);}  //清除LINE12线路挂起位

  if(UP ==0){Beepalarm(); EXTI_ClearITPendingBit(EXTI_Line15);}  //清除LINE12线路挂起位       

               
}


最佳答案

查看完整内容[请看2#楼]

你参照这种模式试下 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寄存器 //GPIOE.3 中断线以及中断初始化配置 下 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-4-22 10:59:51 | 显示全部楼层
本帖最后由 1208 于 2019-4-22 12:32 编辑

你参照这种模式试下
   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寄存器

   //GPIOE.3      中断线以及中断初始化配置 下降沿触发 //KEY1
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
      EXTI_InitStructure.EXTI_Line=EXTI_Line3;
      EXTI_Init(&EXTI_InitStructure);          //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

   //GPIOE.4      中断线以及中断初始化配置  下降沿触发    //KEY0
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
      EXTI_InitStructure.EXTI_Line=EXTI_Line4;
      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寄存器

业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

5

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2019-4-19
在线时间
44 小时
 楼主| 发表于 2019-4-24 11:25:32 | 显示全部楼层
1208 发表于 2019-4-22 12:28
你参照这种模式试下
   EXTI_InitStructure.EXTI_Line=EXTI_Line2;    //KEY2
      EXTI_InitStructure ...

您的意思是一个一个配置是吗?
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-4-24 12:33:08 | 显示全部楼层
Sunshinegeek 发表于 2019-4-24 11:25
您的意思是一个一个配置是吗?

你试下看看行不
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

5

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2019-4-19
在线时间
44 小时
 楼主| 发表于 2019-4-24 13:18:41 | 显示全部楼层
1208 发表于 2019-4-24 12:33
你试下看看行不

可以了  帅哥  是什么原因   导致的上面的问题?
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-4-24 17:12:32 | 显示全部楼层
Sunshinegeek 发表于 2019-4-24 13:18
可以了  帅哥  是什么原因   导致的上面的问题?

中断线和通道最好都分别设置,以免干扰
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 20:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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