【动手学STM32G4】(2)STM32G431之外部中断—按键控制

【动手学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支持多种触发方式:

  1. 上升沿触发
    信号从低电平跳变到高电平时触发,适用于按键释放检测;
  2. 下降沿触发
    信号从高电平跳变到低电平时触发,适用于按键按下检测;
  3. 双边沿触发
    上升沿和下降沿都触发,用于检测信号变化;
  4. 软件触发
    通过软件写入中断挂起寄存器触发。

本实验采用上升沿触发方式检测按键释放。

中断处理流程

本实验中的中断处理遵循以下流程:

bash 复制代码
按键物理动作
    ↓
PC13引脚电平变化(下降沿→低电平)
    ↓
EXTI13中断请求(如果配置为下降沿触发)
    ↓
NVIC(嵌套向量中断控制器)接收请求
    ↓
CPU暂停当前任务,保存现场
    ↓
跳转到EXTI15_10中断向量(EXTI10-15共享)
    ↓
执行中断服务程序(ISR)
    ↓
调用HAL_GPIO_EXTI_IRQHandler() → HAL_GPIO_EXTI_Callback()
    ↓
在回调函数中处理按键逻辑
    ↓
恢复现场,返回原程序

中断优先级管理

STM32G431采用嵌套向量中断控制器(NVIC),具有:

  • 抢占优先级:高优先级中断可以打断低优先级中断;
  • 子优先级:相同抢占优先级时,子优先级决定执行顺序;
  • 优先级分组:可配置抢占位数和子优先位数。

在本实验中,外部中断配置为默认优先级,确保按键能够及时响应。

1.4 实验条件

  1. 硬件平台: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引脚)
  1. 软件平台:
    STM32CubeMX
    STM32CubeIDE

2. STM32CubeMX工程配置

2.1 新建工程

  1. 启动 STM 32CubeMX并选择芯片
    (1)打开 STM32CubeMX。
    (2)选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。
    (3)选择 MCU 为 STM32G431RBT6(参考开发板的 MCU 型号选择)。
    (4)双击芯片图标或点击"Start Project",创建新工程。

2.2 基础配置

工程创建后,进入主配置界面,包含:

bash 复制代码
├── 左侧:Pinout视图(引脚配置)
├── 中间:芯片引脚图
├── 右侧:配置面板
└── 底部:消息窗口
  1. 系统配置:在引脚配置(Pinout & Configuration)中,选择 "System Core -- SYS" 。
    (1)设置调试器类型,将 Debug 模式设为 "Serial Wire"。
    (2)设置基础时钟源(Timebase Source),可以选择默认设置 "SysTick"。
  1. 时钟配置:在引脚配置(Pinout & Configuration)中,选择 "System Core -- RCC" 配置时钟模式。
    设置高速时钟为外部晶振,将 High Speed Clock (HSE) 设为 "Crystal/Ceramic Resonator"。
    Low Speed Clock (LSE) 设为 "Disable"(本实验不需要)。

2.3 GPIO 配置

  1. 将 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"(便于代码识别)
  1. 将用户按键(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 中断配置

  1. 使能 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. 配置系统时钟树
    (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. 工程管理配置。
    (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
  1. 生成代码。
    点击右上角"GENERATE CODE"按钮,等待生成初始代码。
    生成初始代码完成后,点击"Open Project"直接打开工程代码。

3. CubeIDE 编程与调试

实验目的:实现按键触发外部中断控制LED状态翻转,掌握STM32G4外部中断的基本配置和使用方法。

工作原理:

按键物理动作 → PC13电平变化 → EXTI13中断触发 → 中断服务程序执行 → 调用回调函数 → LED状态翻转

3.1 程序实现

  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
  }
}
  1. 中断回调函数实现
    在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 */
  1. 中断服务程序(在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. 程序编译。

    (1)启动STM32CubeIDE,打开工程后点击菜单栏的"Project" → "Build All"或直接按Ctrl+B进行完整编译。

    (2)观察控制台输出中没有错误信息出现。控制台最后显示 "Build Finished" 表明编译成功.在工程Debug目录下将生成STM32G431_EXTI01.elf文件。

  2. 程序下载。

    (1)使用USB Type-C数据线连接电脑和NUCLEO-G431RB开发板,连接后开发板红色电源指示灯亮起表示供电正常。

    (2)在STM32CubeIDE中点击"Run" → "Run" 或按F11开始下载程序,将编译后的程序从开发主机传输到目标MCU。

    下载过程中观察控制台输出,最后显示 "Download verified successfully" 表示下载成功。下载完成后程序会自动开始运行。

3.3 运行与测试

  1. 复位功能测试

    按下开发板上的黑色复位按键(B2),程序复位后自动开始运行。

    根据程序设定,复位后LED应该处于点亮状态。如果LED亮起,说明程序初始化正确。

  2. 按键响应测试

    短按蓝色用户按键(B1),观察LED状态是否翻转。

    如果当前LED亮,按下按键后应该熄灭;再次按下,LED应该重新点亮。反复测试几次,确认每次按键都能可靠地触发LED状态翻转。

  3. 按键消抖验证

    快速连续多次按下用户按键,观察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

相关推荐
Smart-佀2 小时前
FPGA入门:CAN总线原理与Verilog代码详解
单片机·嵌入式硬件·物联网·算法·fpga开发
与光同尘 大道至简2 小时前
ESP32 小智 AI 机器人入门教程从原理到实现(自己云端部署)
人工智能·python·单片机·机器人·github·人机交互·visual studio
老李的森林3 小时前
嵌入式开发--无刷电机FOC控制--用定时器事件驱动ADC采样
stm32·单片机·嵌入式硬件·foc·无刷电机
一路往蓝-Anbo3 小时前
【第42期】调试进阶(一):IDE中的Register与Memory窗口
c语言·开发语言·ide·stm32·单片机·嵌入式硬件
boneStudent3 小时前
STM32工业HMI控制系统
stm32·单片机·嵌入式硬件
广药门徒4 小时前
嵌入式存储芯片驱动解析:标准化接口与STM32 FMC配置指南
stm32·单片机·嵌入式硬件
清风6666664 小时前
基于单片机的汽车尾气智能检测与发动机异常燃烧报警系统
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
诺狞猫4 小时前
超声波测距装置课程设计报告
单片机·嵌入式硬件·课程设计
richxu202510014 小时前
嵌入式学习之路->stm32篇-->(8)I2C通讯(上)
stm32·嵌入式硬件·学习