1. 项目概述
作为一名嵌入式开发工程师,我经常遇到需要精确控制LED闪烁频率的需求。传统使用HAL_Delay()的方式虽然简单,但会占用CPU资源,影响系统整体性能。今天我要分享的是一个基于STM32的实用案例,通过TIM2定时器中断实现LED精确闪烁,同时结合外部中断实现按键控制LED的功能。
这个案例特别适合刚接触嵌入式开发的工程师,它能让你直观理解:
- 定时器中断与软件延时的本质区别
- 如何配置STM32的定时器产生精确中断
- 外部中断的基本使用方法
- 中断服务程序(ISR)的最佳实践
硬件平台采用常见的STM32F1系列MCU,开发环境为Keil MDK,使用标准HAL库进行开发。通过这个案例,你将掌握嵌入式系统中两种最基本的中断应用场景。
2. 核心需求解析
2.1 功能需求分解
本项目的核心需求可以分解为两个独立但相关的功能模块:
-
定时器控制LED闪烁
- 使用TIM2定时器产生500ms周期中断
- 每次中断触发LED状态翻转
- 形成1秒的完整亮灭周期(500ms亮+500ms灭)
-
外部中断控制LED
- 配置PD5引脚为外部中断输入,连接按键
- 按键按下时触发下降沿中断
- 中断服务程序控制PE5引脚LED状态翻转
2.2 硬件资源分配
根据需求,我们需要合理分配MCU的硬件资源:
| 硬件资源 | 功能分配 | 备注 |
|---|---|---|
| TIM2 | 定时器中断 | 产生500ms周期信号 |
| PE9 | LED10控制 | 定时器控制对象 |
| PD5 | KEY6输入 | 外部中断源 |
| PE5 | ARM_LED6 | 按键控制对象 |
2.3 系统架构设计
整个系统采用"中断+主循环"的经典架构:
- 中断层:快速响应硬件事件,仅做标志位设置
- 应用层:在主循环中处理业务逻辑
这种架构既保证了实时性,又避免了在中断中执行耗时操作。
3. 硬件定时器实现细节
3.1 TIM2定时器配置
定时器配置是本案的核心技术点。我们需要正确计算预分频值(Prescaler)和自动重装载值(Pe
