单片机/MCUwilliam hill官网
直播中

闫旭霞

12年用户 83经验值
擅长:控制/MCU
私信 关注
[问答]

STM32一个中断线配置两个中断的问题

最近做项目,按键比较多,所以需要外部中断也比较多。比如,PA3和PC3占用一个中断线,我设置完后,后面设置的中断会覆盖前面设置的。这种一个中短线配置多个中断的问题应该怎么配置呢?还是跟优先级有关?可是,每个按键的优先级不是一样的吗?
已退回2积分

回帖(16)

人中狼

2017-11-29 10:13:42
没做过这个,但是你怎么判断后面设置的中断会覆盖前面设置的,毕竟即使时同一个中断,产生中断得引脚时不一样得,这种情况应该跟51的中断扩展类似,多个中断源使用同一个中断时,进入中断后,需要判断时哪个中断源产生的中断。
举报

闫旭霞

2017-11-29 10:58:31
引用: 人中狼 发表于 2017-11-29 10:13
没做过这个,但是你怎么判断后面设置的中断会覆盖前面设置的,毕竟即使时同一个中断,产生中断得引脚时不一样得,这种情况应该跟51的中断扩展类似,多个中断源使用同一个中断时,进入中断后,需要判断时哪个中断源产生的中断。
...

因为我设置的前面的中断不起作用,比如我配置时先配置了PA3中断,又配置了PC3中断,PA3对应按键不起作用,PC3起作用。而我单独配置PA3时是起作用的。PA3和PC3公用一条中断线,由此判断PC3的配置覆盖了PA3的
举报

闫旭霞

2017-11-29 11:00:05
引用: 人中狼 发表于 2017-11-29 10:13
没做过这个,但是你怎么判断后面设置的中断会覆盖前面设置的,毕竟即使时同一个中断,产生中断得引脚时不一样得,这种情况应该跟51的中断扩展类似,多个中断源使用同一个中断时,进入中断后,需要判断时哪个中断源产生的中断。
...

您有什么好的方法吗?
举报

赵春刚

2017-11-29 11:24:34

/**
* @Brief This function handles EXTI line 0 and 1 interrupts.
*/
void EXTI0_1_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_1_IRQn 0 */

  /* USER CODE END EXTI0_1_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  /* USER CODE BEGIN EXTI0_1_IRQn 1 */

  /* USER CODE END EXTI0_1_IRQn 1 */
}

/**
  * @brief  Handle EXTI interrupt request.
  * @param  GPIO_Pin Specifies the port pin connected to corresponding EXTI line.
  * @retval None
  */
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
   
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
                __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
  }
}



void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
        if(GPIO_Pin==GPIO_PIN_0)
                {
                App.KEY_VALUE=Button_Function;
                }
        if(GPIO_Pin==GPIO_PIN_1)
                {
                App.KEY_VALUE=Button_Power;
                }
//                delay_ms(20);
//                Button_Process();
//                xSemaphoreGiveFromISR(Semaphore_Button,NULL);

}

看上面3个函数  同一条中断线进来后判断是哪一个引脚发生中断时是第二个函数完成的,如果该引脚发生的中断就调用第3个函数进行处理
举报

h1654155956.5608

2017-11-29 12:31:55
PA3和PC3只能有一个占用中断线。
举报

人中狼

2017-11-29 13:15:38
你的判断方法应该还是不能说明先设置的中断被覆盖了,你需要判断的是PA3和PC3的按键是否都进入了中断程序,如果进入了中断程序,而没有判断到按键,那就是程序的问题了。
举报

不吃菜的虫

2017-11-29 13:28:51
顶                                 
举报

闫旭霞

2017-11-29 15:05:07
引用: 人中狼 发表于 2017-11-29 13:15
你的判断方法应该还是不能说明先设置的中断被覆盖了,你需要判断的是PA3和PC3的按键是否都进入了中断程序,如果进入了中断程序,而没有判断到按键,那就是程序的问题了。

亲测先设置PA3,再设置PC3,按PA3对应按键,进不了中断,PC3可以
举报

闫旭霞

2017-11-29 15:22:16
引用: zhifubao 发表于 2017-11-29 12:31
PA3和PC3只能有一个占用中断线。

这样的话,我的按键比较多的话,是不是中断方式实现不了呢?
举报

人中狼

2017-11-29 15:27:49
那只能改线路或换其他的方法了,这个可能跟芯片的内部设计有关,查看芯片资料的AFIO_EXTICR1寄存器和External interrupt/event GPIO mapping,似乎硬件上同一编号的引脚只能选择一个。
举报

闫旭霞

2017-11-29 15:28:42
引用: xuxia 发表于 2017-11-29 15:22
这样的话,我的按键比较多的话,是不是中断方式实现不了呢?

因为我有些键是按键,有些是拨断开关,所以没法设计矩阵键盘。
举报

h1654155956.5608

2017-11-29 16:21:12
本帖最后由 zhifubao 于 2017-11-29 16:25 编辑
引用: xuxia 发表于 2017-11-29 15:22
这样的话,我的按键比较多的话,是不是中断方式实现不了呢?

最多支持16个引脚中断,有一个原则是假设你使用了PA1那么其他下标为1的引脚就不能使用,不如PB1、PC1就不能再用于引脚中断。
举报

闫旭霞

2017-11-29 16:48:30
引用: zhifubao 发表于 2017-11-29 16:21
最多支持16个引脚中断,有一个原则是假设你使用了PA1那么其他下标为1的引脚就不能使用,不如PB1、PC1就不能再用于引脚中断。

嗯嗯,谢谢啦
举报

闫润

2017-12-4 18:04:33
路过学习,顶起来
举报

猎国倾城

2017-12-5 11:49:43
哥们,你要想实现这个功能,得要在外部添加一个多输入或门才行啊。你要想实现16个以上的外部中断响应,得要额外添加硬件啊
举报

idianze

2017-12-5 11:55:21
淡定,淡定,淡定……
举报

更多回帖

发帖
×
20
完善资料,
赚取积分