系列前置博客:
本文核心:解决新手「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:启动软件并选择工作空间
- 双击打开STM32CubeIDE,首次启动弹出工作空间选择窗口,选择全英文、无空格、无特殊符号 的文件夹(如
F:\Stm32Studio\KEY_EXTI_LED); - 勾选
Use this as the default and do not ask again,点击Launch启动软件,进入主界面。
步骤2:新建STM32工程
-
点击顶部菜单栏
File→New→STM32 Project,弹出芯片选择窗口; -
在
Commercial Part Number搜索框输入STM32F103RCT6,选中对应芯片后点击Next(可点亮右侧星星收藏,后续无需重复搜索);

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

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

三、GPIO引脚配置(LED输出+按键中断输入)
步骤1:配置PA0为LED输出模式(复用第一、二章博客)
-
回到
Pinout & Configuration标签页,在芯片引脚图中找到PA0,左键点击选择GPIO_Output; -
左侧
System Core→GPIO,选中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起别名,后续代码直接调用,避免写错 -
配置完成后,引脚图中PA0显示
LED1,即为配置成功。

步骤2:配置PA5为按键外部中断模式(核心!)
-
在芯片引脚图中找到
PA5,左键点击选择GPIO_EXTI5(外部中断模式,对应EXTI5中断线);

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

步骤3:开启NVIC中断控制器(中断能响应的关键)
仅配置引脚中断模式不够,必须开启NVIC,芯片才会响应中断请求!
- 左侧
System Core→NVIC,在中断列表中找到EXTI line[9:5] interrupts(PA5属于EXTI5,归为EXTI9-5中断组); - 勾选
Enabled开启该中断组,配置中断优先级(新手直接照搬,避免冲突):Preemption Priority:2(抢占优先级,数值越小优先级越高);Sub Priority:0(子优先级,同抢占优先级下数值越小优先级越高);

四、Hex文件生成配置+调试器配置
1. Hex文件自定义生成配置(精准找到烧录文件)
- 右键点击工程名
STM32F103RCT6_KEY_EXTI_LED→ 选择Properties,打开工程属性窗口; - 左侧找到
C/C++ Build→Settings→ 右侧Tool Settings→MCU Post build outputs; - 勾选核心选项(默认关闭,必须勾选):
Convert to Intel Hex file (-Oihex):生成通用Intel格式Hex烧录文件;Convert to binary file (-Obinary)(可选):生成bin文件,兼容更多烧录工具;
- 点击
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调试器(复制配置,快速修改)
- 点击顶部菜单栏
Run→Run Configurations...,打开运行配置窗口; - 切换到
Debugger选项卡,修改以下核心配置:Debug probe选择SEGGER J-Link;Interface仍选择SWD;Device name填写STM32F103RC(必须精准,否则无法识别芯片);
- 点击
Apply保存配置,完成双调试器配置,后续可通过播放图标下拉箭头无缝切换。

五、生成初始化代码+编写中断控制代码(新手直接复制)
步骤1:生成工程初始化代码
- 确认所有配置(引脚/中断/时钟/Hex/调试器)无误后,3. 点击右上角保存图标💾,进入代码编辑界面。

步骤2:编写外部中断回调函数(实现按键控制LED核心逻辑)
⚠️ 核心提醒:所有手写代码必须放在
/* USER CODE BEGIN X */和/* USER CODE END X */之间,否则重新生成配置时代码会被覆盖!
- 左侧工程栏,依次展开
Core→Src→ 双击打开main.c文件; - 向下滚动代码,找到
/* USER CODE BEGIN 4 */和/* USER CODE END 4 */区域(该区域为中断函数专属编写区); - 在该区域粘贴以下中断回调函数(新手直接复制,无需修改):
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 */
- 主循环
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:工程编译按钮与编译结果界面】
- 点击软件顶部工具栏锤子图标🔨(Build按钮),开始编译工程;
- 等待编译完成,查看下方
Console控制台输出,显示Build Finished. 0 errors, 0 warnings.即为编译成功; - 若出现红色报错,优先排查:① 工程名/路径含中文/空格;② 代码写在USER CODE区域外;③ 引脚/中断配置错误。
步骤2:选择调试器,下载程序到开发板
【对应截图13:调试器选择与程序下载界面】
- 将调试器(ST-Link/J-Link)通过SWD杜邦线与开发板连接,调试器插入电脑USB口,开发板电源指示灯亮起即为供电正常;
- 点击软件顶部工具栏绿色播放图标旁的下拉箭头 ,选择对应的调试器配置(
ST-Link_Config/J-Link_Config); - 点击绿色播放图标,软件自动识别调试器,将程序烧录到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_Port和LED1_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. 检查工程路径是否有写入权限,换默认路径重试 |
八、核心知识点总结(新手必记,夯实基础)
- GPIO外部中断核心 :STM32每个GPIO可映射到EXTI中断线,同组中断(如EXTI9-5)共享中断服务函数,通过回调函数
HAL_GPIO_EXTI_Callback区分引脚; - 中断触发方式 :按键常用下降沿触发(按下高→低),释放用上升沿触发,可根据需求选择;
- NVIC必配:所有外部中断都需在NVIC中开启并配置优先级,数值越小优先级越高,避免与系统中断冲突;
- 代码编写规范 :手写代码必须放在
USER CODE区域,防止被CubeIDE自动生成的代码覆盖; - 中断函数原则:中断回调函数要简洁高效,避免执行耗时操作(如长时间延时),复杂逻辑可放在主循环中。
原创不易,若本文对你有帮助,欢迎点赞👍、收藏⭐、关注➕,有任何问题可在评论区留言,我会一一回复!
下一篇预告: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相关学习资料包
