我在stm32f100系列中使用中断事件。我的问题很容易理解。有一个交互功能可以控制 EXTI10 到 EXTI15。
void EXTI15_10_IRQHandler(void){
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
//EXTI10
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_10) != RESET){
//functionevent
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
}
//EXTI11
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_11) != RESET){
//function event
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_11);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
}
}
}
当 EXTI10 和 EXTI12 事件分别中断时,我如何管理它们。当他们打断时
您需要测试 EXTI 寄存器以查看哪些寄存器触发了中断。
类似:
void EXTI10_15_IRQHandler(void)
{
if (LL_EXTI_IsActiveFallingFlag_0_31(LL_EXTI_LINE_10) != RESET)
{
LL_EXTI_ClearFallingFlag_0_31(LL_EXTI_LINE_10);
// Process EXTI10 interrupt
}
if (LL_EXTI_IsActiveFallingFlag_0_31(LL_EXTI_LINE_12) != RESET)
{
LL_EXTI_ClearFallingFlag_0_31(LL_EXTI_LINE_12);
// Process EXTI12 interrupt
}
}
这是一个将中断配置为下降沿的示例。如果您使用其他中断配置,您可能需要调整。
此示例将项目配置为使用“低级”
LL
驱动程序接口。使用 HAL 可能有类似的东西,或者您可以直接进行寄存器访问。 (查看 LL
驱动程序以了解它使用的寄存器。)
void EXTI15_10_IRQHandler(void)
将在 EXTI10 - EXTI15 之间任何线路上的 EXTI 中断时被调用(读取 GPIO 引脚 10 至 GPIO 引脚 15)。您必须确定处理程序本身的来源。您的处理程序的结构通常应类似于以下内容:
void EXTI15_10_IRQHandler(void){
uint8_t sourcepin = get_exti10_15_source_pin(); //tests EXTI registers, returns pin number
switch(sourcepin){
case(10):
gpio_10_exti_handler();
break;
case(15):
gpio_15_exti_handler();
break;
default:
break;
}
}