中断是 STM32 响应外部事件的重要机制,可以实现实时响应和高效处理。
中断类型
- 外部中断(EXTI):GPIO 引脚中断
- 定时器中断:定时器溢出、比较匹配
- 串口中断:接收完成、发送完成
- DMA 中断:数据传输完成
外部中断配置
// 配置 GPIO 为中断模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置 EXTI 中断线
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 设置优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 使能中断
中断服务函数
// EXTI 线0中断服务函数
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
// HAL 库中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
// 处理 PA0 引脚的中断
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
}
}
NVIC 中断优先级
// 设置中断优先级分组
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
// 配置具体中断的优先级
// 参数:中断号,抢占优先级,子优先级
HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); // 较高优先级
HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0); // 较低优先级
// 使能中断
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
中断使用注意事项
- 中断服务函数应尽量简短
- 避免在中断中进行复杂计算
- 使用标志位在中断和主程序间通信
- 注意中断嵌套和优先级设置
- 及时清除中断标志位
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。