一、外部中断概述
1.1 什么是外部中断?
外部中断(External Interrupt)是STM32微控制器响应外部事件的重要机制,当指定GPIO引脚的电平发生跳变时,将触发中断请求,CPU暂停当前程序转去执行中断服务程序。
1.2 STM32F103的EXTI特性
-
支持20个中断/事件请求线(EXTI0-EXTI19)
-
每个中断线可独立配置触发方式(上升沿/下降沿/双边沿)
-
支持软件中断触发
-
具有独立的中断使能和挂起位
二、硬件设计
2.1 所需材料
-
STM32F103RCT6开发板
-
按键模块(连接PA0)
-
LED模块(连接PC13)
-
USB-TTL调试器
2.2 电路连接
模块 | 引脚连接 |
---|---|
按键 | PA0 |
LED | PC13 |
三、软件配置(标准库版本)
3.1 新建工程
使用Keil MDK创建基于STM32F103RCT6的工程,导入标准外设库。
3.2 GPIO配置
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
// 配置PA0为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置PC13为输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
3.3 EXTI配置
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 开启AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// PA0连接到EXTI0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
// 配置EXTI0
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 配置NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
3.4 中断服务函数
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
// 翻转PC13输出
GPIO_WriteBit(GPIOC, GPIO_Pin_13,
(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)));
// 清除中断标志
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
四、主函数实现
int main(void)
{
// 系统时钟初始化
SystemInit();
// GPIO配置
GPIO_Config();
// EXTI配置
EXTI_Config();
while(1)
{
// 主循环可执行其他任务
__nop();
}
}
五、实验现象
按下连接PA0的按键时,PC13的LED状态会翻转。使用示波器可观察到约1us的中断响应时间。
六、常见问题
Q1:中断无法触发怎么办?
-
检查GPIO时钟和AFIO时钟是否开启
-
确认GPIO模式配置正确(输入模式)
-
检查NVIC优先级配置
-
确保中断服务函数名称正确
Q2:中断频繁触发?
-
检查按键硬件消抖电路
-
在中断服务函数中添加软件延时消抖
-
调整触发方式为边沿触发而非电平触发
七、扩展应用
7.1 多路中断配置
对于多个外部中断,需注意:
-
同一时刻只能有一个GPIO连接到EXTI线
-
共享中断线(如EXTI0-EXTI4)需要在中断函数中判断具体引脚
7.2 中断嵌套配置
通过设置NVIC优先级分组实现:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
八、总结
外部中断是STM32响应外部事件的重要方式,合理使用可以显著提高系统实时性。需要注意时钟配置、中断优先级管理和标志位清除等关键操作。建议结合硬件设计优化抗干扰能力。
这篇教程按照优快云典型的技术博客结构编写,包含硬件配置、代码实现、常见问题解决等内容,配合清晰的代码注释和原理说明,适合STM32初学者学习参考。实际开发中请根据具体硬件电路调整参数。