【嵌入式软件AI编程】22. STM32 基础实验:GPIO外部中断

欢迎关注 youcans@xidian【嵌入式软件AI编程】专栏

【嵌入式软件AI编程】15. VS Code 插件安装 Claude Code

【嵌入式软件AI编程】17. 第一个AI协同开发项目

【嵌入式软件AI编程】20. AI协同开发STM32程序的流程

【嵌入式软件AI编程】22. STM32 基础实验:GPIO外部中断

本专栏结合STM32项目实践,介绍嵌入式软件AI编程的实战路径。本专栏内容来自图书《嵌入式系统AI编程》,即将出版。

第04章 STM32基础外设实验

上一章以GPIO输出控制(LED闪烁)实验为例,带领读者完成第一个AI协同开发项目,并从实践中提炼出可复用的开发流程、提示词模板与项目规则。本章在此基础上进入STM32基础外设实验,各实验统一按照以下流程推进:目标定义→参数设计→CubeMX配置→初始编译→工程分析→任务拆分→代码编写与审阅→编译烧录→板级验证→资料整理。

本章实验涵盖GPIO输入与外部中断、定时器与PWM、ADC数据采集与DAC信号输出等常用外设功能,重点介绍CubeMX配置方法、HAL库接口调用以及外设运行机制。所有实验均以NUCLEO-G431RB开发板为硬件平台,经过编译、烧录与运行验证,确保实验过程完整、结果可以复现。

通过本章学习,读者将能够借助Claude Code分析外设配置与工程代码,完成常用外设功能的配置、程序编写与运行验证,并在真实硬件环境中进一步提升AI协同开发STM32程序的实践能力。

4.1 GPIO输入与外部中断

GPIO(General-Purpose Input/Output,通用输入输出)是STM32最基本的外设之一,可以用于读取按键等输入信号,也可以控制LED等外部器件。

上一章已经介绍了GPIO输出,本节将通过外部中断和按键轮询输入两个实验,介绍GPIO输入配置、按键状态读取以及中断回调处理方法。

4.1.1 GPIO外部中断

第3章通过LED闪烁项目,形成了可复用的AI协同开发流程、提示词模板和项目开发规则。本章实验继续应用这一套方法,将其迁移到新的STM32外设任务上。

本实验基于NUCLEO-G431RB开发板,将板载用户按键(PC13)配置为上升沿触发的外部中断。每次按下按键,程序进入中断回调并切换板载LED(PA5)状态。

1. CubeMX工程配置

在STM32CubeMX中基于NUCLEO-G431RB创建工程GPIO_EXTI。

NUCLEO-G431RB的用户按键B1电路带有外部下拉电阻,未按下时PC13为低电平,按下时为高电平。因此,将PC13配置为上升沿外部中断(GPIO_EXTI13),无上下拉,设置标签为USER_BTN,并在NVIC中使能EXTI line [15:10] interrupts。

将板载LED对应的PA5配置为GPIO_Output,初始输出低电平,设置标签为LD2。

选择CMake工具链和GCC编译器,生成工程代码。启动VS Code,切换到STM32配置环境,打开工程、执行CMake配置并选择Debug配置,然后编译初始工程。

2. 使用Claude Code 进行工程分析

将第3章编写的CLAUDE CODE.md复制到工程根目录,使Claude Code后续操作遵守统一的工程分析、任务执行、修改边界和代码验证规则。

bash 复制代码
# STM32项目开发规则

## 工程分析
-修改代码前,先读取.ioc文件、初始化代码和相关源文件,确认外设配置、已有接口、涉及文件和修改位置。
-工程分析应以.ioc文件和当前工程代码为依据,不依赖经验猜测,以工程实际配置为准。

## 任务执行
-根据工程分析结果制定任务清单。
-任务应按完整功能拆分,做到目标明确、可独立验证。
-按照任务清单逐项修改代码,每次只处理一项任务。
-完成每项任务后,记录任务目标、主要修改和验证结果。

## 修改边界
-应用代码写入CubeMX用户代码区。
-不修改.ioc文件和与当前任务无关的文件。
-不修改底层HAL和CMSIS库文件。

## 编码与验证
-保持工程原有的命名方式、缩进风格和文件组织方式。
-不添加与当前任务无关的功能和复杂结构。
-代码修改应通过差异视图审阅,确认后再写入工程。
-每项修改都应经过编译、烧录和运行验证。

在Claude Code中开启新对话,套用第3章整理的工程分析提示词模板。为便于读者理解和使用,本实验展示完整的提示词如下。后续实验中只需替换其中的功能目标和硬件信息。

bash 复制代码
【角色】
你是一名资深嵌入式软件工程师,熟悉STM32软件开发。
【背景】
本次需要实现的功能是:按下NUCLEO-G431RB开发板上的用户按键时触发外部中断,并切换板载LD2的状态。
当前工程基于NUCLEO-G431RB开发板和STM32G431RBT6 MCU,已由STM32CubeMX生成初始化代码。
【任务要求】
1.读取工程中的.ioc文件、初始化代码和相关源文件,分析实现该功能所需的工程条件。
2.本轮只分析工程,不编写代码,不修改任何文件。
【输出要求】
1.说明开发板和MCU型号。
2.说明相关外设、端口和引脚配置。
3.说明已有初始化函数、宏定义及所在文件。
4.说明实现功能需要使用的HAL函数。
5.说明需要修改的文件和代码位置。
6.说明是否需要新增变量、函数、文件或中断。
7.指出当前工程中可能影响功能实现的风险或注意事项。

Claude Code根据提示词要求,读取.ioc文件及初始化代码,生成工程分析报告。开发者核实无误后,可以输入如下指令将其保存到项目文档,供后续任务引用。

请将以上分析结果保存到 docs/analysis/overview.md。

3. 使用Claude Code 进行任务规划

工程分析完成后,继续在当前对话中套用任务规划提示词模板,只要引用工程分析文档,无需重复输入角色设定和功能目标。为便于读者理解和使用,完整展示任务规划提示词如下。

bash 复制代码
【背景】
工程分析文档路径为:@docs/analysis/overview.md
【任务要求】
1.根据工程分析结果,将功能目标拆分为需要新增或修改代码的实现任务。
2.任务应按完整功能划分,每项任务都应目标明确且可独立验证。
3.编译、烧录和运行验证作为相应代码任务的验证方式,不单独列为任务。
【输出要求】
请为每项任务说明:
1.任务目标。
2.涉及文件。
3.主要修改位置。
4.实施要点。
5.验证方式。
本轮只生成任务清单,不修改代码。

Claude Code首次生成了 3项任务:实现按键中断回调、添加按键去抖动处理,以及编译、烧录与运行验证。

开发者根据功能目标与任务划分原则进行审阅后,将中断回调与消抖处理合并为一项完整任务,并移除了编译烧录与运行验证任务,审阅结果如表4-1所示。确认后,将任务清单保存至规划文档 docs/planning/task_list.md。

表4-1 任务清单审阅结果

Claude Code初次生成的任务 开发者审阅结果

  1. 实现按键中断回调,切换LED状态:保留,作为主体功能
  2. 添加按键去抖动处理:不单独划分,并入回调实施要点
  3. 编译、烧录与运行验证:不作为代码修改任务,写入验证方式

这一过程表明,Claude Code可以协助分析并提出规划建议,但任务的合理划分仍需开发者进行判断。AI输出只有经过审阅和确认,才能成为后续代码修改的可靠依据。

4. 按任务修改并审阅代码

打开待修改的main.c文件,在VS Code内置终端中启动Claude Code CLI,套用代码修改提示词模板,填写当前任务目标和相关文档路径,并提出代码修改任务要求。为便于读者理解和使用,本实验完整展示填写后的代码修改提示词如下。

bash 复制代码
【角色】
你是一名资深嵌入式软件工程师,熟悉STM32软件开发。
【背景】
本次需要实现的功能是:任务1------实现按键中断回调(含去抖动),使按下用户按键时能够可靠地切换板载LD2状态。
工程分析文档路径为:@docs/analysis/overview.md
任务清单文档路径为:@docs/planning/task_list.md
【任务要求】
1.只完成当前指定任务,不处理任务清单中的其他任务。
2.根据工程分析结果,在相关文件中生成代码修改。
3.保持工程原有的命名、缩进和代码组织方式。
4.将应用代码写入CubeMX用户代码区。
5.不修改.ioc文件和与当前任务无关的文件。
【输出要求】
1.在VS Code编辑区打开代码差异视图,展示代码修改差异。
2.说明修改文件和主要修改位置。
3.简要说明修改内容和实现逻辑。
4.等待开发者审阅确认后再写入工程。

Claude Code根据分析结果与任务清单生成修改方案,并在编辑区展示代码修改的差异对比,如图4-1所示。

图4-1 Claude Code生成的代码修改差异对比视图

第一处修改位于USER CODE BEGIN PV用户代码区,增加去抖变量与宏:

c 复制代码
static uint32_t btn_debounce_tick = 0;      /* 记录上次有效触发的时间 */
#define DEBOUNCE_DELAY_MS  50U              /* 去抖间隔(毫秒) */

第二处修改位于USER CODE BEGIN 4用户代码区,实现外部中断回调函数:

c 复制代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == USER_BTN_Pin)
  {
    uint32_t now = HAL_GetTick();
    if ((now - btn_debounce_tick) < DEBOUNCE_DELAY_MS)
    {
      return;
    }
    btn_debounce_tick = now;
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
  }
}

所有修改均在 CubeMX 用户代码区内,重新生成工程时不会被覆盖。

开发者审阅确认后,接受修改代码。Claude Code写入后给出修改摘要,如图4-2所示。开发者可以要求将摘要保存为任务日志(如 docs/logs/task.md),用于记录每项任务的分析依据、代码变化与验证结果。

图4-2 Claude Code生成的代码修改摘要

5. 编译烧录与运行验证

单击VS Code状态栏中的生成(Build)按钮,编译工程。连接NUCLEO-G431RB开发板,烧录程序并启动运行。

  • 程序运行初始状态LD2熄灭;
  • 按下用户按键,LD2点亮;
  • 再次按下用户按键,LD2状态翻转一次;
  • 长按按键时,LD2仅在按下时翻转一次,不会重复触发,松开时状态不变。

实验现象与PC13上升沿外部中断的预期一致。

实验总结

本实验直接复用了第3章构建的AI协同开发流程、格式化提示词模板和项目开发规则,完成了GPIO外部中断的工程分析、任务规划、代码修改和运行验证。

实践表明,这套方法具备良好的外设任务迁移能力,其核心协作模式可归纳为:AI提议→开发者审阅→确认执行→文档归档。

在任务规划环节,Claude Code初始提出的任务划分存在不合理之处,经开发者审阅修改后才得以确认。这进一步说明,AI协同开发并非由AI自动完成所有工作------开发者需要承担明确目标、做出判断、审阅结果并完成最终验证的职责。

版权声明:

欢迎关注 youcans@xidian【嵌入式软件AI编程】专栏

转发必须注明原文链接:

【嵌入式软件AI编程】22. STM32 基础实验:GPIO外部中断

Copyright by ai4mcu@qq.com

Crated:2026-10

相关推荐
未来_攻城狮1 小时前
STM32F407VGT6 芯片详解:高性能 Cortex-M4 MCU 入门指南
stm32·单片机·嵌入式硬件
Flynt1 小时前
AI 写的页面一眼假?有人把"假指纹"写成 62 条规则,不用大模型就能跑
前端·ai编程·claude
xcLeigh1 小时前
FreeRTOS实战:用STM32+SEGGER打造工业级实时嵌入式系统
人工智能·stm32·单片机·嵌入式硬件·ai
硅基造物主1 小时前
STM32 从 0 到 1 做智能家居(十二):USART2 分时复用 —— ESP-12F + MQTT
网络·stm32·mqtt·智能家居·esp-12f
lazy熊1 小时前
Codex CLI 配置教程
ai编程
ServBay2 小时前
本地模型已经跑起来了,Copilot Fusion 为什么还要联网?
后端·ai编程·github copilot
路上有只喵2 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇1
单片机·嵌入式硬件
芯岭技术郦2 小时前
XL4460 FSK 无线透传模组
stm32·单片机·嵌入式硬件
半导体憨包2 小时前
共源共栅(Cascode)功率器件:让 SiC / GaN “兼容“你的硅栅驱动
嵌入式硬件·生成对抗网络·硬件工程·半导体·dc-dc·半导体芯片