1. STM32中断与引脚复用基础解析
在嵌入式开发中,中断机制和引脚复用是STM32单片机最核心的两个特性。作为一名有十年经验的嵌入式工程师,我发现很多初学者对这两个概念的理解存在误区。今天我就用最接地气的方式,结合实战经验,带大家彻底搞懂这些知识点。
1.1 外部中断:硬件世界的"门铃"机制
外部中断的本质是让单片机能够即时响应外部事件。想象你正在书房专心工作,突然门铃响了,你会放下手头工作去开门,处理完再回来继续工作。外部中断就是STM32的这个"门铃"系统。
在STM32中,几乎所有GPIO引脚都可以配置为外部中断源。以常见的按键检测为例:
- 默认状态下,按键引脚通过上拉电阻保持高电平
- 当按键按下时,引脚电平变为低电平
- 这个下降沿就可以触发外部中断
c复制// 外部中断配置示例(GPIOA Pin0)
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 1. 使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 2. 配置PA0为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. 配置外部中断线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
// 4. 配置EXTI
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);
// 5. 配置NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
注意:STM32的外部中断线是有限的(通常16条),多个GPIO可能共享同一条中断线。例如PA0、PB0、PC0等都共用EXTI0中断线,因此不能同时使用。
1.2 定时器中断:精准的"内部时钟"
如果说外部中断是门铃,那么定时器中断就是STM32内部的精准闹钟。它不依赖外部信号,完全由内部时钟驱动,可以实现精确的定时功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
