STM32保姆级入门教程|第4章:GPIO输入+外部中断 实现按键控制LED(手把手全流程)

系列前置博客:

  1. STM32保姆级入门教程|第1章:零基础必看,从认知到实战全解析
  2. STM32保姆级入门教程|第2章:STM32CubeIDE 使用+STM32F103RCT6 + J-Link 实现 PA0 引脚 LED 点亮 )
  3. STM32保姆级入门教程|第3章:从新建工程到LED闪烁点灯(Hex生成+ST-Link/J-Link切换全攻略)

本文核心:解决新手「GPIO输入不会配、中断配置踩坑多、按键控制无响应」三大痛点,从新建工程开始,手把手教你配置GPIO外部中断,实现PA5按键触发中断→PA0 LED亮灭翻转,同时兼容ST-Link/J-Link下载调试。


一、前置准备

1. 软件准备

  • 已安装STM32CubeIDE(2024/2025版),完成基础环境配置;
  • 已安装ST-Link或J-Link官方驱动(实在不行通过串口下载也行);
  • 无前置工程要求,本文全程从0新建工程,零基础可直接跟随。

2. 硬件准备

硬件器材 规格与说明
STM32开发板 STM32F103RCT6核心板(核心芯片,教程全基于此)
外设与引脚 PA0接LED(低电平点亮)、PA5接按键(带硬件消抖)
调试器 ST-Link V2/V3、J-Link V9/V11(任意一款均可)
辅助工具 USB数据线、SWD杜邦线、万用表(可选,验证引脚电平)

3. 硬件逻辑提前讲(新手必看)

  • LED逻辑(PA0) :3.3V→限流电阻→LED阳极→LED阴极→PA0,PA0输出低电平点亮,高电平熄灭
  • 按键逻辑(PA5) :硬件带施密特触发器+RC滤波(无需软件消抖),按键未按PA5为高电平,按下为低电平 ,采用下降沿触发中断 (高→低电平跳变时触发)。(我是使用下面电路图--带保护、电平转换和状态指示的数字输入接口电路)


二、新建STM32CubeIDE工程(部分截图前置文章都有如果不会可以参考前置文章)

步骤1:启动软件并选择工作空间
  1. 双击打开STM32CubeIDE,首次启动弹出工作空间选择窗口,选择全英文、无空格、无特殊符号 的文件夹(如F:\Stm32Studio\KEY_EXTI_LED);
  2. 勾选Use this as the default and do not ask again,点击Launch启动软件,进入主界面。
步骤2:新建STM32工程
  1. 点击顶部菜单栏 FileNewSTM32 Project,弹出芯片选择窗口;

  2. Commercial Part Number搜索框输入STM32F103RCT6,选中对应芯片后点击Next(可点亮右侧星星收藏,后续无需重复搜索);

  3. 工程配置页面按要求填写:

    • Project Name:填写STM32F103RCT6_KEY_EXTI_LED(禁止中文/空格/特殊符号,避免编译报错);
    • Project Location:默认继承工作空间路径,无需修改;
    • 其余选项保持默认,点击Finish
  4. 弹出切换透视图提示,勾选Remember my decision,点击Yes,进入CubeMX图形化配置界面。

步骤3:基础配置(调试接口+时钟,必配!)
  1. SYS调试接口配置 :左侧System CoreSYSDebug下拉选择Serial Wire(SWD模式,不配会导致芯片锁死,无法下载);
  2. RCC时钟源配置 :左侧System CoreRCCHigh Speed Clock (HSE)下拉选择Crystal/Ceramic Resonator(外部晶振),无外部晶振则选Internal RC Oscillator
  3. 时钟树配置 :顶部点击Clock Configuration,在HCLK (MHz)输入框填写72,按下回车,软件自动配置整个时钟树,无红色报错即配置成功

三、GPIO引脚配置(LED输出+按键中断输入)

步骤1:配置PA0为LED输出模式(复用第一、二章博客)

  1. 回到Pinout & Configuration标签页,在芯片引脚图中找到PA0,左键点击选择GPIO_Output

  2. 左侧System CoreGPIO,选中PA0引脚,按以下参数配置(新手直接照搬):

    配置项 参数选择 配置说明
    GPIO output level High 初始上电输出高电平,LED默认熄灭
    GPIO mode Output Push Pull 推挽输出,驱动能力强,适合直接驱动LED
    Pull-up/Pull-down No pull-up and no pull-down 硬件电路无需求,无需内部上下拉
    Maximum output speed Low 点灯无需高速,降低功耗与干扰
    User Label LED1 给PA0起别名,后续代码直接调用,避免写错
  3. 配置完成后,引脚图中PA0显示LED1,即为配置成功。

步骤2:配置PA5为按键外部中断模式(核心!)

  1. 在芯片引脚图中找到PA5,左键点击选择GPIO_EXTI5(外部中断模式,对应EXTI5中断线);

  2. 左侧System CoreGPIO,选中PA5引脚,按以下参数配置(中断核心配置,一步都不能错):

    配置项 参数选择 配置说明
    GPIO mode External Interrupt Mode with Falling edge trigger detection 下降沿触发,按键按下(高→低)时触发中断
    Pull-up/Pull-down Pull-up 内部上拉,确保按键未按时时PA5稳定为高电平
    User Label KEY1 给PA5起别名,方便代码中识别按键引脚
  3. 配置完成后,引脚图中PA5显示 KEY1,即为配置成功。

步骤3:开启NVIC中断控制器(中断能响应的关键)

仅配置引脚中断模式不够,必须开启NVIC,芯片才会响应中断请求!

  1. 左侧System CoreNVIC,在中断列表中找到EXTI line[9:5] interrupts(PA5属于EXTI5,归为EXTI9-5中断组);
  2. 勾选Enabled开启该中断组,配置中断优先级(新手直接照搬,避免冲突):
    • Preemption Priority:2(抢占优先级,数值越小优先级越高);
    • Sub Priority:0(子优先级,同抢占优先级下数值越小优先级越高);

四、Hex文件生成配置+调试器配置

1. Hex文件自定义生成配置(精准找到烧录文件)

  1. 右键点击工程名STM32F103RCT6_KEY_EXTI_LED → 选择Properties,打开工程属性窗口;
  2. 左侧找到C/C++ BuildSettings → 右侧Tool SettingsMCU Post build outputs
  3. 勾选核心选项(默认关闭,必须勾选):
    • Convert to Intel Hex file (-Oihex):生成通用Intel格式Hex烧录文件;
    • Convert to binary file (-Obinary)(可选):生成bin文件,兼容更多烧录工具;
  4. 点击Apply and Close保存配置,Hex文件将在编译后生成在工程Debug文件夹中。

2. J-Link调试器配置(ST-LINK配置可参考第三章博客)

前提:SWD硬件接线规则(绝对不能接反!)
调试器引脚 STM32核心板SWD引脚 重要备注
3.3V 3.3V/VCC 禁止接5V,否则烧坏芯片/调试器
SWDIO SWDIO/DIO 数据引脚,接反无法通信
SWCLK SWCLK/CLK 时钟引脚,接反无法通信
GND GND 共地,必须接,否则电平不稳定
步骤1:配置J-Link调试器(复制配置,快速修改)
  1. 点击顶部菜单栏RunRun Configurations...,打开运行配置窗口;
  2. 切换到Debugger选项卡,修改以下核心配置:
    • Debug probe选择SEGGER J-Link
    • Interface仍选择SWD
    • Device name填写STM32F103RC(必须精准,否则无法识别芯片);
  3. 点击Apply保存配置,完成双调试器配置,后续可通过播放图标下拉箭头无缝切换。

五、生成初始化代码+编写中断控制代码(新手直接复制)

步骤1:生成工程初始化代码

  1. 确认所有配置(引脚/中断/时钟/Hex/调试器)无误后,3. 点击右上角保存图标💾,进入代码编辑界面。

步骤2:编写外部中断回调函数(实现按键控制LED核心逻辑)

⚠️ 核心提醒:所有手写代码必须放在/* USER CODE BEGIN X *//* USER CODE END X */之间,否则重新生成配置时代码会被覆盖!

  1. 左侧工程栏,依次展开CoreSrc → 双击打开main.c文件;
  2. 向下滚动代码,找到/* USER CODE BEGIN 4 *//* USER CODE END 4 */区域(该区域为中断函数专属编写区);
  3. 在该区域粘贴以下中断回调函数(新手直接复制,无需修改):
c 复制代码
/* USER CODE BEGIN 4 */
// 外部中断回调函数,中断触发后自动执行
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    // 判断是否为PA5(KEY1)引脚触发的中断
    if(GPIO_Pin == KEY1_Pin)
    {
        // 翻转PA0(LED1)引脚电平,实现亮灭切换
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
    }
}
/* USER CODE END 4 */
  1. 主循环while(1)保持空即可,无需添加任何代码:
c 复制代码
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

代码简单解释(新手能看懂)

  • HAL_GPIO_EXTI_Callback:HAL库自带的外部中断通用回调函数,所有EXTI中断触发后都会执行此函数;
  • if(GPIO_Pin == KEY1_Pin):判断触发中断的引脚是否为我们配置的PA5按键,避免其他中断干扰;
  • HAL_GPIO_TogglePin:HAL库电平翻转函数,自动将引脚电平取反(高→低、低→高),完美实现LED亮灭切换。

六、编译工程+下载调试(ST-Link/J-Link通用)

步骤1:编译工程,检查无报错

【对应截图12:工程编译按钮与编译结果界面】

  1. 点击软件顶部工具栏锤子图标🔨(Build按钮),开始编译工程;
  2. 等待编译完成,查看下方Console控制台输出,显示Build Finished. 0 errors, 0 warnings.即为编译成功
  3. 若出现红色报错,优先排查:① 工程名/路径含中文/空格;② 代码写在USER CODE区域外;③ 引脚/中断配置错误。

步骤2:选择调试器,下载程序到开发板

【对应截图13:调试器选择与程序下载界面】

  1. 将调试器(ST-Link/J-Link)通过SWD杜邦线与开发板连接,调试器插入电脑USB口,开发板电源指示灯亮起即为供电正常;
  2. 点击软件顶部工具栏绿色播放图标旁的下拉箭头 ,选择对应的调试器配置(ST-Link_Config/J-Link_Config);
  3. 点击绿色播放图标,软件自动识别调试器,将程序烧录到STM32F103RCT6芯片中,烧录完成后芯片自动复位运行。

步骤3:效果验证(成功标志,新手一眼就能看)

【对应截图14:按键控制LED效果实拍图】

  • 上电初始状态:PA0输出高电平,LED1默认熄灭
  • 第一次按下PA5按键:触发下降沿中断,翻转PA0电平,LED1点亮
  • 第二次按下PA5按键:再次触发中断,再次翻转PA0电平,LED1熄灭
  • 循环按键,LED实现按一次亮、再按一次灭 的效果,即为实现功能!
    第一次按下PA5按键;

第二次按下PA5按键;

恭喜你!成功完成了STM32的按键输入!

七、常见问题排查(90%新手必踩的坑,附解决方法)

故障现象 排查优先级 详细解决方法
按键按下无任何反应,LED不翻转 1 1. 检查PA5是否配置为GPIO_EXTI5下降沿触发;2. 检查NVIC中EXTI line[9:5]是否勾选Enabled;3. 确认中断函数写在USER CODE BEGIN 4区域;4. 用万用表测量PA5按键按下时是否为低电平
下载失败,提示"无法连接芯片/设备未找到" 1 1. 检查SYS是否配置为Serial Wire(SWD模式);2. 检查SWD接线是否接反/虚焊;3. 确认调试器驱动安装正常,设备管理器无黄色感叹号;4. 重新给开发板上电,重启STM32CubeIDE
LED一直亮/一直灭,按键触发无变化 2 1. 检查PA0配置是否为GPIO_Output推挽输出;2. 确认HAL_GPIO_TogglePin函数参数为LED1_GPIO_PortLED1_Pin;3. 测量PA0引脚电平,确认是否能正常翻转
中断频繁触发,LED乱闪 2 1. 检查硬件消抖电路是否正常(施密特触发器/RC滤波);2. 可在中断回调函数中添加HAL_Delay(10)软件消抖(放在if判断内);3. 检查按键是否卡滞,未完全弹起
编译成功但无Hex文件生成 2 1. 检查是否勾选Convert to Intel Hex file (-Oihex);2. 确认工程编译无报错,报错会导致Hex文件生成失败;3. 检查工程路径是否有写入权限,换默认路径重试

八、核心知识点总结(新手必记,夯实基础)

  1. GPIO外部中断核心 :STM32每个GPIO可映射到EXTI中断线,同组中断(如EXTI9-5)共享中断服务函数,通过回调函数HAL_GPIO_EXTI_Callback区分引脚;
  2. 中断触发方式 :按键常用下降沿触发(按下高→低),释放用上升沿触发,可根据需求选择;
  3. NVIC必配:所有外部中断都需在NVIC中开启并配置优先级,数值越小优先级越高,避免与系统中断冲突;
  4. 代码编写规范 :手写代码必须放在USER CODE区域,防止被CubeIDE自动生成的代码覆盖;
  5. 中断函数原则:中断回调函数要简洁高效,避免执行耗时操作(如长时间延时),复杂逻辑可放在主循环中。

原创不易,若本文对你有帮助,欢迎点赞👍、收藏⭐、关注➕,有任何问题可在评论区留言,我会一一回复!

下一篇预告:STM32 GPIO八大模式电路原理及应用场景!

本文所使用的工程文件已上传至配套资源中,如有需要可自行下载。也可关注博主后留言获取。

🎁欢迎关注,获取更多技术干货!

公众号:BackCatK Chen,文章末尾可以扫码关注

🎁资料包亮点

这份资料包涵盖了从硬件电路设计STM32单片机开发 ,再到Linux系统学习的全链路内容,适合不同阶段的学习者:

  • 硬件基础:包含硬件电路合集、硬件设计开发工具包,帮你打牢底层基础。
  • STM32专项:从环境搭建、开发工具、传感器模块到项目实战,还有书籍和芯片手册,一站式搞定STM32学习。
  • C语言进阶:C语言学习资料包,助你掌握嵌入式开发的核心语言。
  • 面试求职:嵌入式面试题合集,提前备战技术面试。
  • Linux拓展:Linux相关学习资料包,拓宽技术视野。
📂资料包目录
  • 00-STM32单片机环境搭建
  • 01-硬件电路合集
  • 02-硬件设计开发工具包
  • 03-C语言学习资料包
  • 04-STM32单片机开发工具包
  • 05-STM32传感器模块合集
  • 06-STM32项目合集
  • 07-STM32单片机书籍&芯片手册
  • 08-Linux相关学习资料包
相关推荐
悠哉悠哉愿意2 小时前
【单片机学习笔记】第十二届国赛经验复盘
笔记·单片机·嵌入式硬件·学习
rit84324993 小时前
STC8单片机模拟AD转换程序(NTC测温)
单片机·嵌入式硬件
szxinmai主板定制专家3 小时前
基于 STM32 + FPGA 船舶电站控制器设计与实现
arm开发·人工智能·stm32·嵌入式硬件·fpga开发·架构
我不是程序猿儿3 小时前
【嵌入式】编码器计数倍频,机械一格与电气计数
stm32·单片机·嵌入式硬件·学习
Hello World . .3 小时前
51单片机基础外设:GPIO(以LED、按键、数码管为例)
单片机·嵌入式硬件
Flamingˢ3 小时前
基于ARM的裸机程序设计和开发(三):C编程基础与Zynq裸机开发常用方法
c语言·arm开发·单片机
Crazyong5 小时前
FreeRTOS-CPU使用率统计
单片机·嵌入式硬件
_Ningye12 小时前
STM32 — 6.1 TIM定时中断
stm32·单片机·嵌入式硬件
非鱼䲆鱻䲜14 小时前
vscode开发stm32添加新的头文件路径和包含源文件
ide·vscode·stm32·cmake·包含头文件·包含源文件