stm32中断配置出错

Posted

技术标签:

【中文标题】stm32中断配置出错【英文标题】:stm32 interrupt configurations goes wrong 【发布时间】:2021-06-19 21:28:43 【问题描述】:

早上好, 我正在处理在设置另一个引脚时关闭所选引脚上的中断的问题。我的 MCU 是 stm32f4xx。 我的意思是,我在 GPIO_MODE_IT_FALLING 检测上设置了 PC0、PC1、PC2、PC3、PB14、PB15,当我将引脚 PA1、PA2、PA3、PA4 设置为 GPIO_MODE_IT_RISING_FALLING 检测时,PC 和 PB 不起作用。 如果 PC-PB 单独设置,它可以工作。如果我设置了额外的 PA1-4,引脚 PC-PB 就会忘记中断。每个 PC0-3 和 PB14-PB15 的代码如下:

GPIO_InitTypeDef GPIO_InitStruct = 0;
GPIO_InitStruct.Pin = FAULT1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); // EXTI0_IRQn changes on dependently on selected pins e.g. EXTI15_10_IRQn
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // here the same

在我对每个引脚 PC0-3 和 PB14-15 进行迭代之后,我对 PA2-PA4 使用相同的模式,如下所示:

GPIO_InitTypeDef GPIO_InitStruct =  0 ;
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI2_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);

然后引脚PC,PB上的中断消失。只有来自 PA 的中断才能正常工作。 如何编写允许 PC、PB 和 PA 中断工作的程序? 我也在用FreeRTOS,可能有问题?

【问题讨论】:

【参考方案1】:

遗憾的是,这是 STM32 系列的“特性”。你想做的事做不到。

您必须安排您的引脚分配以解决此问题:每个数字只能在一个字母上中断(例如:PA2 或 PB2 不能同时使用)。

另一个限制是数字 5-9 和 10-15 共享中断。您可以在例如:PA5、PB6、PA7、PB8、PC9 上设置中断,但它们会导致相同的处理程序运行。显然,您可以在处理程序中读取 GPIO 输入,但如果信号是瞬时的并且在处理程序运行时已经消失,您将不知道发生了哪个信号。

【讨论】:

多么令人失望。你知道一些没有这种“功能”的MCU吗? Nordic nNRF5x 可以使用全局多路复用器在任何引脚上做任何事情,但它们专门用于蓝牙。我想不出另一个我使用中断的例子,但我希望允许任何引脚上的中断比不更常见。

以上是关于stm32中断配置出错的主要内容,如果未能解决你的问题,请参考以下文章

stm32啥触发串口接收中断

stm32如何启动串口中断

STM32Cubemx——外部中断

STM32外部中断用一根中断线怎样配置两个中断口,优先级设置

stm32cubemx 外部中断

stm32cubemx 外部中断