一、STM32外部中断线问题小结
1.1 不同的端口同一PIN
在STM32中,不同的端口(如PA、PB、PC等)上的相同PIN号(如PA1、PB1、PC1)可以共用一个外部中断线(EXTI_Line)。这意味着,虽然这些PIN位于不同的端口上,但它们都可以连接到同一个外部中断线上,但同一时间只能有一个PIN触发该中断线。因此,在配置时需要注意,如果先配置了某个PIN为中断源,再配置同一中断线上的另一个PIN,则后者会覆盖前者的配置。
1.2 几个PIN共用服务函数
STM32的外部中断系统允许多个PIN共用同一个中断服务函数(ISR)。这是通过中断线的共享和中断标志位的检查来实现的。例如,EXTI_Line6和EXTI_Line8可能共用一个中断服务函数。在中断服务函数中,可以通过检查中断标志位(如使用EXTI_GetITStatus函数)来确定是哪个PIN触发了中断,并据此执行相应的处理代码。这种机制提高了代码的复用性和效率。
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void EXTI1_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
}
void EXTI2_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
}
void EXTI3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
void EXTI4_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
}
void EXTI9_5_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
}
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
}
/**
* @brief This function handles EXTI interrupt request.
* @param GPIO_Pin Specifies the pins connected 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_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
二、总结注意事项
1.在配置外部中断时,需要确保不要同时配置多个PIN到同一个中断线上,以避免冲突。
2.如果多个PIN共用同一个中断服务函数,需要在中断服务函数中通过检查中断标志位来确定中断源,并据此执行相应的处理代码。
3.在编写中断服务函数时,需要注意中断的响应时间和处理效率,以避免影响系统的整体性能。