GPIO不只是点灯:STM32输入输出 + EXTI + NVIC彻底讲透

张开发
2026/6/9 15:28:21 15 分钟阅读
GPIO不只是点灯:STM32输入输出 + EXTI + NVIC彻底讲透
文章摘要很多人学 STM32都停留在点灯、串口、定时器阶段程序能跑外设能用但一到面试官问“GPIO 怎么配置外部中断”、“NVIC 抢占优先级和响应优先级怎么理解”就慌了手脚。本篇博客以面试题为导向从 GPIO 的输入输出模式、开漏/推挽区别到 EXTI 外部中断配置流程、NVIC 优先级管理带你完整梳理底层原理和面试答题思路。看完这篇你不仅能回答 GPIO 面试高频题还能顺利把GPIO → EXTI → NVIC的链路讲清楚面试稳如老狗文章目录文章摘要本栏系列文章其他专栏精品文章前言一、STM32 GPIO 输入输出模式都有哪些1. GPIO 的通用原理2. GPIO 输入模式3. GPIO 输出模式二、GPIO 怎么配置成外部中断2.1 EXTI 是什么2.1 EXTI 是什么2.2 EXTI 线与 GPIO 映射2.3 EXTI 配置流程三、NVIC 中断管理Nested Vectored Interrupt Controller3.1、NVIC 是什么3.1、NVIC 优先级体系NVIC 分组Priority Group2.2 总优先级计算2.3 分组对配置生效的影响2.4 核心异常与外部中断关系四、NVIC 配置流程4.1 配置分组4.2 配置中断五、NVIC 嵌套中断原理小结本栏系列文章STM32是怎么跑起来的启动流程 时钟树一次讲透面试高频)其他专栏精品文章大厂嵌入式代码规范二命名规范与数据结构单片机开发环境搭建看这里SLAMCraft自主导航机器人DIY(一)如何设计一个自己的SLAM机器人前言很多人学 STM32都是从点灯、串口、定时器开始的。程序能跑外设也能用但一到面试官问下面这些问题就开始卡壳“STM32 GPIO 输入输出模式都有哪些空闲状态是什么”“GPIO 如何触发外部中断EXTI 怎么配置”“NVIC 的抢占优先级和响应优先级是什么怎么理解”“开漏和推挽输出有什么区别什么时候用哪一个”归根结底这些问题都指向两件事把这两件事弄明白GPIO 面试题就不再是难点GPIO 的工作原理和模式STM32 的中断体系EXTI NVIC一、STM32 GPIO 输入输出模式都有哪些STM32 GPIO 主要分输入模式和输出模式但原理上和大部分 MCU如 AVR、NXP、TI类似。理解底层原理可以在面试中脱颖而出。1. GPIO 的通用原理GPIO 本质上是一个可配置的数字开关通过P/N MOS 管控制电平输出。输入状态由上下拉电阻或浮空决定。浮空输入容易受噪声影响因此 MCU 通常提供上拉或下拉选项。输入端通过施密特触发器做波形整形避免按键抖动导致误触发。2. GPIO 输入模式模式空闲电平应用场景上拉输入高按键、开关下拉输入低按键、开关浮空输入不确定外部信号读取需要注意抖动模拟输入不限ADC/DAC 输入浮空输入如果没有外部上拉/下拉很容易受到干扰导致状态不稳定。3. GPIO 输出模式模式描述面试可回答场景推挽输出高低电平都能输出驱动能力强LED、蜂鸣器、继电器开漏输出只能输出低电平需要外部上拉I2C SDA、多主总线推挽复用外设复用功能PWM 输出、USART TX开漏复用外设复用功能I2C SDA 等区分推挽和开漏输出并结合实际应用举例比如 I2C 总线用开漏控制 LED 用推挽。二、GPIO 怎么配置成外部中断面试常问“假设要用按键触发中断你怎么配置 GPIO 和 EXTI”2.1 EXTI 是什么标准回答流程初始化 GPIO 为输入开启 GPIO 时钟并映射到 EXTI 线配置 EXTI 触发方式上升沿 / 下降沿 / 双沿配置 NVIC 中断优先级并使能编写 ISR并清除中断标志示例代码// GPIOE Pin2 映射到 EXTI_Line2GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_LineEXTI_Line2;EXTI_InitStruct.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_TriggerEXTI_Trigger_Rising;EXTI_InitStruct.EXTI_LineCmdENABLE;EXTI_Init(EXTI_InitStruct);voidEXTI2_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line2)!RESET){// 中断逻辑EXTI_ClearITPendingBit(EXTI_Line2);}}2.1 EXTI 是什么EXTI 全称External Interrupt/Event Controller即外部中断/事件控制器。作用把 GPIO 的输入变化转换成中断请求IRQ每条 EXTI 线可连接一个 GPIO作为触发源可映射多个 GPIO但一次只能选一个。支持触发方式上升沿 / 下降沿 / 双沿2.2 EXTI 线与 GPIO 映射EXTI0-EXIT15对应 GPIO0~GPIO15特殊线EXTI16 → PVDEXTI17 → RTC AlarmEXTI18 → USB Wakeup2.3 EXTI 配置流程1、初始化 GPIO 为输入2、使能 GPIO 时钟3、配置 EXTI 线与 GPIO 映射4、设置触发方式上升沿 / 下降沿 / 双沿5、配置 NVIC 优先级并使能中断6、编写 ISR并清除挂起标志// GPIO 输入初始化GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.PinGPIO_PIN_2;GPIO_InitStruct.ModeGPIO_MODE_INPUT;GPIO_InitStruct.PullGPIO_NOPULL;HAL_GPIO_Init(GPIOE,GPIO_InitStruct);// 映射 GPIOE Pin2 到 EXTI2GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);// 配置 EXTI 触发方式EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_LineEXTI_Line2;EXTI_InitStruct.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_TriggerEXTI_Trigger_Rising;EXTI_InitStruct.EXTI_LineCmdENABLE;EXTI_Init(EXTI_InitStruct);// NVIC 配置NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannelEXTI2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority0;NVIC_InitStruct.NVIC_IRQChannelSubPriority1;NVIC_InitStruct.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStruct);// 中断服务函数voidEXTI2_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line2)!RESET){// 处理中断逻辑EXTI_ClearITPendingBit(EXTI_Line2);}}三、NVIC 中断管理Nested Vectored Interrupt Controller面试常问“NVIC 是啥抢占优先级和响应优先级怎么理解怎么配置”3.1、NVIC 是什么NVIC 全称Nested Vectored Interrupt Controller中文叫“嵌套向量中断控制器”集成在Cortex-M3 内核中功能管理 MCU 外部中断IRQ和可配置的核心异常决定中断优先级和嵌套执行顺序支持抢占式中断高优先级可以打断低优先级面试速记“NVIC 让 MCU 知道哪个中断先跑并允许高优先级中断打断低优先级中断是 Cortex-M3 的中断调度核心。”3.1、NVIC 优先级体系NVIC 的优先级由4 位有效优先级控制STM32F1 系列。优先级分为两部分1、抢占优先级Preemption Priority决定高优先级中断是否能打断低优先级中断。2、响应优先级Subpriority / Response Priority抢占优先级相同时决定先执行哪个中断。NVIC 分组Priority GroupNVIC 优先级 4 位有效位可以划分为抢占位和响应位STM32 提供 5 种分组方式分组宏抢占位响应位备注NVIC_PriorityGroup_004没有抢占位全用响应位NVIC_PriorityGroup_1131 位抢占 3 位响应NVIC_PriorityGroup_222平衡分配NVIC_PriorityGroup_331抢占位多嵌套能力强NVIC_PriorityGroup_440全用抢占位无响应位NVIC_PriorityGroupConfig()只调用一次后续所有中断都基于此分组。2.2 总优先级计算总优先级 (抢占优先级 响应位数) | 响应优先级例分组 PriorityGroup_22 位抢占 2 位响应抢占位有效值0~3响应位有效值0~3总优先级 0~15配置超出有效位数的优先级会被截断。2.3 分组对配置生效的影响分组 00 抢占位 4 响应位抢占优先级设置无效响应优先级有效范围 0~15配置抢占优先级会被忽略分组 22 抢占位 2 响应位抢占位有效值0~3响应位有效值0~3超出范围会截断到最大值分组 2如果你给响应优先级设置 5实际只生效 3。2.4 核心异常与外部中断关系类型可配置优先级范围示例核心异常部分可配置0~15SysTick、PendSV 可配置NMI/HardFault 固定最高不可改外部中断可配置0~15EXTI0~EXTI15USART1/2 等核心异常也使用 4 位有效位NMI / HardFault 是固定最高优先级不可屏蔽其他核心异常可通过 SHPR 寄存器配置四、NVIC 配置流程面试常问“NVIC 怎么配置举个例子。”4.1 配置分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 2 位抢占 2 位响应4.2 配置中断以 USART1 和 EXTI2 为例// USART1NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannelUSART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority1;NVIC_InitStruct.NVIC_IRQChannelSubPriority0;NVIC_InitStruct.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStruct);// EXTI2NVIC_InitStruct.NVIC_IRQChannelEXTI2_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority0;// 高于 USART1NVIC_InitStruct.NVIC_IRQChannelSubPriority1;NVIC_InitStruct.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStruct);其中 EXTI2 抢占优先级更高可以打断 USART1同抢占优先级时响应优先级决定先执行哪一个。五、NVIC 嵌套中断原理低优先级中断执行时高优先级中断到来CPU 保存当前上下文PC、寄存器跳转执行高优先级 ISR完成后恢复低优先级中断同级抢占优先级 → 按响应优先级执行不可屏蔽异常NMI/HardFault永远优先小结STM32 GPIO EXTI NVIC看似零散的知识其实是一条完整的链路GPIO 控制信号 → EXTI 生成中断 → NVIC 调度执行。面试官问你时不在乎你会调用多少函数而在乎你能否把这条链路讲顺、讲清楚。记住几个关键点1.GPIO 模式输入/输出/复用空闲电平和应用场景必须会讲。2.EXTI 配置映射、触发方式、NVIC 配置、ISR 清标志位缺一不可。3.NVIC 优先级分组决定抢占/响应位核心异常和外部中断优先级要分清。一句话总结理解底层原理 掌握配置流程 知道优先级逻辑 面试高分利器。 如果你能把 GPIO → EXTI → NVIC 链路讲顺面试官面前稳如老狗。

更多文章