OpenEdv-开源电子网

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

按键中断进不去,可能是什么原因引起的?

[复制链接]

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
发表于 2020-3-16 17:15:08 | 显示全部楼层 |阅读模式
这是按键的初始化
void KEY_Init(void)   
{   

    GPIO_InitTypeDef GPIO_InitStructure;   

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);   
    //配置B端口  B3-6
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;   
    GPIO_Init(GPIOB, &GPIO_InitStructure);   

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;       
    GPIO_Init(GPIOB, &GPIO_InitStructure);   

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;       
    GPIO_Init(GPIOB, &GPIO_InitStructure);   

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode=  GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);       
}
//u8 key0_count=0;
//u8 key1_count=0;
//u8 wk_count=0;
u8 key_scan(u8 mode)
{
         static u8 key_up=1; //按键按&松开标志
         if(mode) key_up=1;
         if(key_up&&(KEY0==0|KEY1==0&&KEY2==0&&KEY3==0))
         {
                 delay_ms(10);        //按键去抖动,消抖
                 key_up=0;            //按键已松开,去判断是哪个按键按下
                 if(KEY0==0)        return 1;
             else if(KEY1==0)   return 2;
                 else if(KEY2==0)   return 3;
                 else if(KEY3==0)   return 4;                 
         }
         else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==1) key_up=1;  
         return 0;
         
         
         
}
中断配置以及中断函数
void EXTIX_Init(void)
{

          EXTI_InitTypeDef EXTI_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
     KEY_Init();//初始化按键对应io模式
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
         

    //GPIOB.3 中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource3);

          EXTI_InitStructure.EXTI_Line=EXTI_Line3;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//下降沿触发
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
        NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;                        //使能按键0所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先 0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);
       
       
    //GPIOB.4          中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);

          EXTI_InitStructure.EXTI_Line=EXTI_Line4;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
               
                NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                        //使能按键1所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
           NVIC_Init(&NVIC_InitStructure);
        //GPIOB.5     中断线以及中断初始化配置     按键2的中断
       
         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);
    EXTI_InitStructure.EXTI_Line=EXTI_Line5;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//下降沿触发
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器         
            NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0X02;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0X02;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        //GPIOB.6
         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);
        EXTI_InitStructure.EXTI_Line=EXTI_Line6;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;
        EXTI_Init(&EXTI_InitStructure);
           NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
void EXTI3_IRQHandler(void)
{       
        delay_ms(100);        // 延时消抖       
       
    if(EXTI_GetFlagStatus(EXTI_Line3)!=RESET)
        {               
        if(key_scan(0)==1)                                     //不支持连按模式
    {
                                                            //按键key0按一次pwm占空比增加
                if(ccr<3599)
                {
                ccr+=90;
                }
                else ccr=0;
        }
        EXTI_ClearITPendingBit(EXTI_Line3);        //清除LINE0上的中断标志位
    }

            //TIM_SetCompare1(TIM3,ccr);
        //TIM_SetCompare2(TIM3,ccr);
                //TIM_SetCompare3(TIM3,ccr);
                //TIM_SetCompare4(TIM3,ccr);
           //rintf("按键0在产生中断,pwm占空比增大");        
}
void EXTI4_IRQHandler(void)
{
       
      delay_ms(30);         //消抖
      if(EXTI_GetFlagStatus(EXTI_Line4)!=RESET)
          {                  
          if(key_scan(0)==2)                       //不支持连按模式
        {
            if(ccr>90)                            //key1  pwm占空比减小
                {
                ccr-=90;
                }
                else ccr=3599;       
        }
         EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE1线路挂起位
      }
            //TIM_SetCompare1(TIM3,ccr);
        //TIM_SetCompare2(TIM3,ccr);
                //TIM_SetCompare3(TIM3,ccr);
                //TIM_SetCompare4(TIM3,ccr);       
          
          
}

void EXTI9_5_IRQHandler(void)
{
        delay_ms(50);         //消抖
        if(EXTI_GetFlagStatus(EXTI_Line5)!=RESET)
        {
        if(key_scan(0)==3)                            //不支持连按模式
   {
            reload=TIM3->ARR;                                 //频率增大
            if(reload>90)
                {
        reload-=90;
                }
                else reload=3599;
               
                         


   }
    EXTI_ClearITPendingBit(EXTI_Line5);
        }
        TIM_SetAutoreload(TIM3,reload);

        //TIM_SetCompare1(TIM3,ccr1);
        //TIM_SetCompare2(TIM3,ccr2);
        //TIM_SetCompare3(TIM3,ccr3);          //设置固定占空比
        //TIM_SetCompare4(TIM3,ccr4);  
       //printf(按键2在产生中断,频率在增大");   

}

void EXTI9_5_IRQHandeler(void)
{
        delay_ms(50);
        if(EXTI_GetFlagStatus(EXTI_Line6)!=RESET)
  {
        if(key_scan(0)==4)                 //频率减小
        {
                reload=TIM3->ARR;
                if(reload<3599)
                {
                        reload+=90;             //超过TIM3->ARR的值,就变为0
                }
                else reload=0;
               
        }
        EXTI_ClearITPendingBit(EXTI_Line6);
  }
        TIM_SetAutoreload(TIM3,reload);
       
        //TIM_SetCompare1(TIM3,ccr1);
        //TIM_SetCompare2(TIM3,ccr2);      //固定的占空比
        //TIM_SetCompare3(TIM3,ccr3);
        //TIM_SetCompare4(TIM3,ccr3);

       
       
       
       
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4307
金钱
4307
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-16 19:56:08 | 显示全部楼层
仿真看看能不能进中断,不能的话,检查下初始化配置
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
 楼主| 发表于 2020-3-16 20:28:03 | 显示全部楼层
1208 发表于 2020-3-16 19:56
仿真看看能不能进中断,不能的话,检查下初始化配置

仿真进不去中断,不晓得哪儿配置的问题,还在查找问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 16:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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