一、实验目的
- 掌握 STM32 HAL 库中 GPIO 外设的配置与输出控制方法。
- 理解 STM32 外部中断 EXTI 的工作原理,掌握 HAL 库下外部中断的配置与回调函数编写方法。
- 实现通过按键外部中断控制流水灯的暂停与恢复,掌握中断事件与主循环任务的配合逻辑。
- 理解中断 “快进快出” 的设计原则,掌握标志位法在中断程序中的应用。
二、实验环境
2.1 硬件环境
- STM32F103C8T6 最小系统核心板
- 红 / 绿 / 蓝 LED 灯共 3 只
- 轻触按键 1 只
- 1kΩ 限流电阻 3 只、10kΩ 下拉电阻 1 只
- 面包板与杜邦线若干
- USB-TTL 下载器
2.2 软件环境
- Keil uVision5 集成开发环境
- STM32CubeMX 代码生成工具
- STM32F1xx HAL 库驱动包
三、实验原理
3.1 GPIO 输出驱动 LED 原理
STM32 的 GPIO 引脚配置为推挽输出模式时,可输出高、低两种电平。引脚输出高电平时,LED 导通点亮;输出低电平时,LED 截止熄灭。本实验使用 PA0、PA5、PB1 三个 GPIO 引脚分别驱动三路 LED。
3.2 外部中断 EXTI 工作原理
STM32F1 系列共有 19 条外部中断线,每个 GPIO 引脚都可映射到对应的 EXTI 中断线,支持上升沿、下降沿、双边沿三种触发方式。
- 本实验中 PC14 引脚对应EXTI14 中断线,属于 EXTI10~EXTI15 共用的中断通道。
- 按键按下时引脚电平从低变高,配置为上升沿触发,按键按下时硬件自动触发中断,CPU 暂停主循环程序,跳转执行中断服务函数。
3.3 按键中断控制逻辑
定义全局暂停标志位is_paused,主循环中根据该标志位判断是否执行流水灯逻辑:
- 标志位为 0 时,流水灯正常轮流点亮;
- 按键按下触发中断,在中断回调函数中翻转标志位为 1,流水灯停止运行;
- 再次按下按键,标志位翻转为 0,流水灯从当前位置恢复运行。
中断中仅做标志位翻转,不执行延时等耗时操作,符合中断处理 “快进快出” 的设计原则。
四、实验内容与步骤
4.1 硬件电路连接
- LED 电路:PA0、PA5、PB1 引脚分别串联 1kΩ 限流电阻,连接对应 LED 的正极;所有 LED 负极统一接 GND。
- 按键电路:PC14 引脚连接轻触按键的一端,按键另一端接 3.3V;PC14 引脚同时外接 10kΩ 下拉电阻至 GND,保证未按下时引脚为稳定低电平。
4.2 HAL 库工程创建与配置
- 打开 STM32CubeMX,选择芯片
STM32F103C8T6,创建工程。 - 系统配置:
- RCC:HSE 配置为外部高速时钟,系统时钟倍频至 72MHz;
- SYS:Debug 选择 Serial Wire。
- GPIO 配置:
- PA0、PA5、PB1:设置为
GPIO_Output,输出默认低电平,推挽模式,无上下拉,低速; - PC14:设置为
GPIO_EXTI14,触发方式为上升沿,无上下拉。
- PA0、PA5、PB1:设置为
- NVIC 配置:开启
EXTI line[15:10] interrupts中断通道,设置中断优先级。 - 生成 Keil MDK 工程。
4.3 功能代码编写
在生成的工程中,在main.c的用户代码段内编写全局标志位、中断回调函数与流水灯主逻辑。
4.4 程序编译与下载
- Keil 中点击编译,检查无错误后生成.hex 文件。
- 通过下载器将程序烧录到 STM32 最小系统板。
- 上电观察实验现象,测试按键暂停 / 恢复功能。