【动手学STM32G4】(1)STM32G431之创建项目
【动手学STM32G4】(2)STM32G431之外部中断
【动手学STM32G4】(3)STM32G431之定时器
【动手学STM32G4】(4)STM32G431之PWM
【动手学STM32G4】(5)STM32G431之ADC+DAC
【动手学STM32G4】(6)STM32G431之UART串口通信
【动手学STM32G4】(7)STM32G431之USB虚拟串口
【动手学STM32G4】(2)STM32G431之外部中断
-
- [1. 项目简介](#1. 项目简介)
-
- [1.1 实验目标](#1.1 实验目标)
- [1.2 GPIO简介](#1.2 GPIO简介)
- [1.3 外部中断简介](#1.3 外部中断简介)
- [1.4 实验条件](#1.4 实验条件)
- [2. STM32CubeMX工程配置](#2. STM32CubeMX工程配置)
-
- [2.1 新建工程](#2.1 新建工程)
- [2.2 基础配置](#2.2 基础配置)
- [2.3 GPIO 配置](#2.3 GPIO 配置)
- [2.4 中断配置](#2.4 中断配置)
- [2.5 时钟与项目配置](#2.5 时钟与项目配置)
- [3. CubeIDE 编程与调试](#3. CubeIDE 编程与调试)
-
- [3.1 程序实现](#3.1 程序实现)
- [3.2 编译与下载](#3.2 编译与下载)
- [3.3 运行与测试](#3.3 运行与测试)
1. 项目简介
1.1 实验目标
本实验旨在通过STM32G431微控制器的外部中断功能,实现对用户按键的响应,从而灵活控制板载LED灯的工作状态,掌握STM32G4系列的外部中断编程技术。
实验一:按键控制
复位后初始化:开发板复位后,LD2用户LED自动点亮
按键响应:按下用户按键(PC13),立即触发外部中断,实现LED状态的即时翻转(亮/灭切换)
学习重点:外部中断的基本配置、中断服务程序的编写、GPIO状态控制
1.2 GPIO简介
基本概念
GPIO(General Purpose Input/Output,通用输入输出)是微控制器最基本、最常用的外设接口。在STM32G431中,每个GPIO引脚都可以通过软件配置为以下模式:
-
输入模式:读取外部信号状态
- 浮空输入
- 上拉输入
- 下拉输入
-
输出模式:驱动外部设备
- 推挽输出
- 开漏输出
-
复用功能:用于特定的外设功能(如USART、SPI、I2C等)
-
模拟模式:用于ADC、DAC等模拟功能
本实验涉及的GPIO引脚
本实验使用 NUCLEO-STM32G431RB 开发板,涉及两个关键的GPIO引脚:
-
PA5引脚:
连接至板载 LD2(绿色LED)
低电平有效(输出低电平时LED亮)
配置为推挽输出模式
最大输出电流:20mA
驱动能力:可直连LED,无需外部驱动电路
-
PC13引脚:
连接至蓝色用户按键 B1
按键按下时,PC13引脚接地(低电平)
按键释放时,通过板载上拉电阻恢复高电平
配置为外部中断输入模式
内置可配置的上拉/下拉电阻
EXTI可以监测指定 GPIO 的电平信号,当电平变化时,EXTI 向 NVIC 发出中断申请,支持上升沿、下降沿、双边沿、软件触发。如果发生 EXTI 外部中断,可以发生中断响应或者事件响应,中断响应就是执行中断程序,事件响应就是操作外设而不触发中断。
STM32G431 的 GPIO支持多种输出速度:低速:2MHz,中速:25MHz,高速:50MHz,超高速:150MHz。对于LED控制,选择低速或中速即可满足要求,有助于降低功耗和电磁干扰。
1.3 外部中断简介
中断基本概念
中断是微控制器响应外部或内部事件的机制,它允许CPU在执行正常程序的过程中,暂停当前任务,转而处理紧急事件,处理完成后返回原程序继续执行。
使用中断可以实时响应,提高效率,实现多任务处理。
外部中断(EXTI)系统
STM32G431的外部中断控制器(EXTI)支持:
- 中断线(Interrupt Line):EXTI0至EXTI21
- 事件线(Event Line):EXTI0至EXTI15可用于产生中断和事件
- 多路复用:每个中断线可通过SYSCFG配置连接到不同的GPIO引脚
外部中断触发方式
STM32 的 EXTI支持多种触发方式:
- 上升沿触发
信号从低电平跳变到高电平时触发,适用于按键释放检测; - 下降沿触发
信号从高电平跳变到低电平时触发,适用于按键按下检测; - 双边沿触发
上升沿和下降沿都触发,用于检测信号变化; - 软件触发
通过软件写入中断挂起寄存器触发。
本实验采用上升沿触发方式检测按键释放。
中断处理流程
本实验中的中断处理遵循以下流程:
bash
按键物理动作
↓
PC13引脚电平变化(下降沿→低电平)
↓
EXTI13中断请求(如果配置为下降沿触发)
↓
NVIC(嵌套向量中断控制器)接收请求
↓
CPU暂停当前任务,保存现场
↓
跳转到EXTI15_10中断向量(EXTI10-15共享)
↓
执行中断服务程序(ISR)
↓
调用HAL_GPIO_EXTI_IRQHandler() → HAL_GPIO_EXTI_Callback()
↓
在回调函数中处理按键逻辑
↓
恢复现场,返回原程序
中断优先级管理
STM32G431采用嵌套向量中断控制器(NVIC),具有:
- 抢占优先级:高优先级中断可以打断低优先级中断;
- 子优先级:相同抢占优先级时,子优先级决定执行顺序;
- 优先级分组:可配置抢占位数和子优先位数。
在本实验中,外部中断配置为默认优先级,确保按键能够及时响应。
1.4 实验条件
- 硬件平台:NUCLEO-G431RB 开发板
STM32G431RB 32位微控制器基于Arm® Cortex®-M4内核,内核工作频率为170 MHz,采用LQFP64封装,配128 Kb的闪存和32 Kb的SRAM
NUCLEO-G431RB 控制板集成了STLINK-V3E调试器和编程器,提供了全面的免费软件库和例程,可从STM32Cube MCU软件包获得。
- LD2用户LED(PA5引脚)
- 蓝色用户按键B1(PC13引脚)

- 软件平台:
STM32CubeMX
STM32CubeIDE
2. STM32CubeMX工程配置
2.1 新建工程
- 启动 STM 32CubeMX并选择芯片
(1)打开 STM32CubeMX。
(2)选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。
(3)选择 MCU 为 STM32G431RBT6(参考开发板的 MCU 型号选择)。
(4)双击芯片图标或点击"Start Project",创建新工程。
2.2 基础配置
工程创建后,进入主配置界面,包含:
bash
├── 左侧:Pinout视图(引脚配置)
├── 中间:芯片引脚图
├── 右侧:配置面板
└── 底部:消息窗口
- 系统配置:在引脚配置(Pinout & Configuration)中,选择 "System Core -- SYS" 。
(1)设置调试器类型,将 Debug 模式设为 "Serial Wire"。
(2)设置基础时钟源(Timebase Source),可以选择默认设置 "SysTick"。

- 时钟配置:在引脚配置(Pinout & Configuration)中,选择 "System Core -- RCC" 配置时钟模式。
设置高速时钟为外部晶振,将 High Speed Clock (HSE) 设为 "Crystal/Ceramic Resonator"。
Low Speed Clock (LSE) 设为 "Disable"(本实验不需要)。

2.3 GPIO 配置
- 将 LD2(PA5)配置为输出模式:
(1)在芯片引脚图中找到 PA5,将其配置为 "GPIO_Output"。
(2)详细参数配置如下:
bash
Pin: PA5
GPIO output level: Low (LED点亮初始状态)
GPIO mode: Output Push Pull
GPIO Pull-up/Pull-down: No pull-up and no pull-down
Maximum output speed: Low (对于LED控制,低速足够)
User Label: "LD2"(便于代码识别)

- 将用户按键(PC13)配置为外部中断
(1)在芯片引脚图中找到 PC13,将其配置为 "GPIO_EXTI13"。
(2)详细参数配置如下:
bash
Pin: PC13
GPIO mode: External Interrupt Mode with Rising edge trigger detection
GPIO Pull-up/Pull-down: No pull-up and no pull-down
User Label: "UserBTN"

2.4 中断配置
- 使能 EXTI 中断线。
(1)选择 "System Core -- NVIC" 进入 NVIC 配置;
(2)找到"EXTI line[15:10] interrupts",勾选 "Enabled" 使能中断。
(3)可选地,设置中等优先级:Preemption Priority: 5 。
注意:EXTI10-15共享同一个中断向量。
注:优先级配置策略
| 中断类型 | 推荐优先级 | 理由 |
|---|---|---|
| SysTick定时器 | 0(最高) | 系统时基,需要最高响应 |
| 紧急故障处理 | 1-2 硬错误、内存管理错误等 | |
| 高速通信接口 | 3-4 | USB、CAN等需要及时响应 |
| 用户按键EXTI | 5-7 | 中等优先级,避免被低优先级中断阻塞 |
| 普通外设中断 | 8-10 | UART、I2C等 |
| 后台任务 | 11-15 | 非实时性任务 |
2.5 时钟与项目配置
- 配置系统时钟树
(1)点击顶部 "Clock Configuration" 选项卡,进入时钟树配置。
(2)设置输入频率 Input frequency=24 MHz,SysCLK frequency=160 MHz。
bash
Input frequency: 24 MHz (HSE)
SysCLK frequency: 160 MHz (HSE)
System Clock Mux: PLLCLK
AHB Prescaler: 1 (不分频)
APB1 Prescaler: 1
APB2 Prescaler: 1
配置完成后,System Clock 显示为160MHz,HCLK、PCLK1、PCLK2 均为160MHz。
- 工程管理配置。
(1)点击 "Project Manager"→ "Project",设置项目名称为 "Project Name: STM32G431_EXTI01"。
(2)点击 "Project Manager"→ "Code Generator",设置如下。
bash
Project:
- Project Name: STM32G431_EXTI01
- Toolchain/IDE: STM32CubeIDE
Code Generator:
√ Generate peripheral initialization as a pair of '.c/.h'
√ Keep User Code when re-generating
√ Backup previously generated files

- 生成代码。
点击右上角"GENERATE CODE"按钮,等待生成初始代码。
生成初始代码完成后,点击"Open Project"直接打开工程代码。

3. CubeIDE 编程与调试
实验目的:实现按键触发外部中断控制LED状态翻转,掌握STM32G4外部中断的基本配置和使用方法。
工作原理:
按键物理动作 → PC13电平变化 → EXTI13中断触发 → 中断服务程序执行 → 调用回调函数 → LED状态翻转
3.1 程序实现
- 主函数实现
在 main.c 文件 添加以下代码:
c
/* 实验1: 基础按键中断控制LED翻转 */
int main(void)
{
/* MCU初始化 */
HAL_Init();
/* 系统时钟配置 */
SystemClock_Config();
/* 外设初始化 */
MX_GPIO_Init();
MX_NVIC_Init();
/* 复位后LED亮(初始化状态) */
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
/* 用户提示信息(可通过串口输出) */
// printf("实验1: 基础按键中断控制\n");
// printf("复位: LED亮\n");
// printf("按下用户按键: LED状态翻转\n");
/* 主循环 */
while (1)
{
/* 此处可添加其他后台任务 */
// HAL_Delay(100); // 延时 100ms
}
}
- 中断回调函数实现
在main.c文件末尾的/* USER CODE BEGIN 4 */和/* USER CODE END 4 */之间添加中断回调函数:
c
/* USER CODE BEGIN 4 */
/**
* @brief 外部中断回调函数
* @param GPIO_Pin: 触发中断的引脚号
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* 检查是否是用户按键触发的引脚 */
if (GPIO_Pin == UserBTN_Pin)
{
/* 简单的按键消抖处理 */
static uint32_t last_press_time = 0;
uint32_t current_time = HAL_GetTick();
/* 消抖时间:50ms */
if ((current_time - last_press_time) > 50)
{
/* LED状态翻转 */
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
/* 可选:添加调试信息 */
// if (HAL_GPIO_ReadPin(LD2_GPIO_Port, LD2_Pin) == GPIO_PIN_SET)
// printf("LED状态: 亮\n");
// else
// printf("LED状态: 灭\n");
last_press_time = current_time;
}
}
}
/* USER CODE END 4 */
- 中断服务程序(在stm32g4xx_it.c中查看中断处理函数)
在STM32CubeMX生成的代码框架中,中断服务程序位于Core/Src/stm32g4xx_it.c文件中。这个文件包含了所有中断处理函数的框架。
打开stm32g4xx_it.c文件,找到EXTI15_10的中断处理函数:
c
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
// 用户可以在这里添加中断进入时的处理代码
// 例如:记录中断时间、设置标志位等
/* USER CODE END EXTI15_10_IRQn 0 */
/* 调用HAL库的中断处理函数 */
HAL_GPIO_EXTI_IRQHandler(UserBTN_Pin);
}
HAL_GPIO_EXTI_IRQHandler() 函数执行流程如下:
bash
1. EXTI15_10_IRQHandler() 被CPU调用
2. 调用 HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_Pin)
3. HAL库清除中断标志位(重要!避免重复中断)
4. 调用用户自定义的 HAL_GPIO_EXTI_Callback() 函数
5. 返回到主程序

3.2 编译与下载
-
程序编译。
(1)启动STM32CubeIDE,打开工程后点击菜单栏的"Project" → "Build All"或直接按Ctrl+B进行完整编译。
(2)观察控制台输出中没有错误信息出现。控制台最后显示 "Build Finished" 表明编译成功.在工程Debug目录下将生成STM32G431_EXTI01.elf文件。
-
程序下载。
(1)使用USB Type-C数据线连接电脑和NUCLEO-G431RB开发板,连接后开发板红色电源指示灯亮起表示供电正常。
(2)在STM32CubeIDE中点击"Run" → "Run" 或按F11开始下载程序,将编译后的程序从开发主机传输到目标MCU。
下载过程中观察控制台输出,最后显示 "Download verified successfully" 表示下载成功。下载完成后程序会自动开始运行。
3.3 运行与测试
-
复位功能测试
按下开发板上的黑色复位按键(B2),程序复位后自动开始运行。
根据程序设定,复位后LED应该处于点亮状态。如果LED亮起,说明程序初始化正确。
-
按键响应测试
短按蓝色用户按键(B1),观察LED状态是否翻转。
如果当前LED亮,按下按键后应该熄灭;再次按下,LED应该重新点亮。反复测试几次,确认每次按键都能可靠地触发LED状态翻转。
-
按键消抖验证
快速连续多次按下用户按键,观察LED的响应。
如果消抖功能正常,LED应该每次只翻转一次状态,不会因为按键抖动而产生多次翻转。
4. 小结
通过本章实验,我们成功掌握了STM32G4外部中断的基本配置方法。实现了按键触发中断控制LED状态翻转的功能,验证了从GPIO配置、中断使能到回调函数处理的完整流程。
外部中断的工作原理是:"按键物理动作 → PC13电平变化 → EXTI13中断触发 → 中断服务程序执行 → 调用回调函数 → LED状态翻转"。
版权声明:
【动手学电机驱动】是 youcans@qq 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/157097217)
Copyright@youcans 2026
Crated:2026-01