STM32F103 外部中断控制LED灯
STM32F103C8T6 最小系统开发板使用 HAL 库通过 PC12 按键外部中断控制 PC13 LED
1. 项目概述
在本项目中,我们将使用 STM32F103C8T6 最小系统开发板,通过 HAL(Hardware Abstraction Layer)库 实现 PC12 按键外部中断控制 PC13 LED 的亮灭。
2. 硬件设计
1. 硬件需求
- STM32F103C8T6 最小系统开发板
- STLink-V2 下载器(用于烧录程序)
- 杜邦线
- LED(若开发板无板载 LED)
- 220Ω 电阻(若使用外部 LED)
- 按键(若开发板无板载按键)
- 10kΩ 上拉电阻(若使用外部按键)
2. 硬件连接
- PC13 → LED 正极
- LED 负极 → 220Ω 电阻 → GND
- PC12 → 按键
- 按键另一端 → GND
- PC12 上拉 10kΩ 电阻 → VCC
3. 软件设计
1. STM32 HAL 库简介
HAL 库是 ST 官方提供的 硬件抽象库,封装了底层寄存器操作,使开发更加简单。
2. 工程创建步骤(基于 STM32CubeMX)
- 打开 STM32CubeMX,创建新工程,选择 STM32F103C8T6。
- 配置 PC13 作为 GPIO 输出模式
- 找到 "PC13",设置为 GPIO_Output。
- 配置 PC12 作为外部中断模式
- 找到 "PC12",设置为 GPIO_EXTI12。
- 触发方式选择 下降沿触发(Falling Edge)。
- 在 NVIC(中断控制器)中,启用 EXTI 12 中断。
- 配置时钟(默认 72MHz,无需修改)。
- 生成代码,选择 IDE 为 STM32CubeIDE 或 Keil。
4. 代码实现
1. main.c 代码
#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init(); // 初始化 HAL 库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化 GPIO
while (1)
{
// 主循环,无需轮询按键状态,响应由中断处理
}
}
/**
* @brief GPIO 初始化
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE(); // 使能 GPIOC 时钟
// 配置 PC13 为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 默认关闭 LED
// 配置 PC12 为外部中断输入
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 使能 EXTI 中断
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
/**
* @brief 外部中断回调函数
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_12) // 判断是否为 PC12 触发
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 切换 LED 状态
}
}
/**
* @brief EXTI15_10 中断处理函数
*/
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
2. 代码解析
HAL_GPIO_EXTI_Callback()
:外部中断回调函数,当按键按下时触发 LED 亮灭。HAL_NVIC_SetPriority()
和HAL_NVIC_EnableIRQ()
:配置 PC12 外部中断的优先级和使能。HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12)
:调用 HAL 库处理 PC12 中断。
5. 烧录与测试
1. 烧录步骤(使用 STLink-V2)
- 连接 STLink-V2
- STLink-V2 SWDIO → STM32 SWDIO
- STLink-V2 SWCLK → STM32 SWCLK
- STLink-V2 GND → STM32 GND
- STLink-V2 3.3V → STM32 3.3V
- 使用 STM32CubeProgrammer 或 Keil 进行烧录。
- 烧录完成后,按下 RESET 运行程序。
6. 总结
本教程介绍了 STM32F103C8T6 最小系统开发板 通过 PC12 按键外部中断控制 PC13 LED 亮灭 的详细过程,包括 硬件设计、软件配置、代码编写、烧录步骤,适用于 STM32 HAL 库 开发。希望能帮助你快速入门 STM32 按键外部中断的开发!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具