1. 环境准备与硬件连接在开始之前我们需要准备好开发环境和硬件设备。我使用的是正点原子精英开发板主控芯片是STM32F103ZET6。这个芯片有丰富的定时器资源特别适合用来学习定时器中断。如果你手头有其他型号的开发板也没关系只要芯片支持TIM3定时器就行。硬件连接非常简单只需要两个LED灯。我习惯用PB5和PE5这两个GPIO口分别连接LED0和LED1。记得给LED串联限流电阻通常220欧姆就够用了。开发板的原理图上一般都会标注LED的连接方式如果你不确定可以查查原理图确认一下。软件方面需要安装STM32CubeMX和Keil MDK。CubeMX是ST官方提供的图形化配置工具可以大大简化初始化代码的编写。我推荐使用最新版本因为ST会不断修复bug和添加新功能。安装过程没什么特别的一路next就行但记得勾选安装HAL库。2. 使用CubeMX配置TIM3定时器打开CubeMX新建工程选择你的芯片型号。第一步要配置时钟树这个很关键。我建议先用默认配置生成一次代码看看能不能正常运行然后再慢慢调整。找到TIM3定时器启用它并选择内部时钟源。这里有几个重要参数需要设置Prescaler预分频器这个值决定了定时器的计数频率。系统时钟是72MHz如果我们设置预分频为7199那么计数频率就是72MHz/(71991)10kHz。Counter Mode计数模式选择向上计数。Period自动重装载值设置为4999这样定时器每500ms产生一次中断(10kHz/(49991)2Hz)。别忘了在NVIC设置中勾选TIM3全局中断。这个步骤经常被新手忽略导致中断无法触发。我刚开始学习时就犯过这个错误调试了半天才发现问题。3. GPIO配置与工程生成接下来配置GPIO口。找到连接LED的两个引脚设置为输出模式。我建议给这两个引脚起个有意义的名称比如LED0和LED1这样后面写代码时会方便很多。在Project Manager选项卡中设置好工程名称和存储路径。Toolchain选择MDK-ARM然后点击Generate Code生成工程。第一次生成代码可能会比较慢因为CubeMX要下载相关的库文件。生成完成后用Keil打开工程。先编译一下确保没有错误。如果出现头文件找不到的问题可能是路径设置不对检查一下Include Paths是否包含了HAL库的路径。4. 编写中断回调函数在main.c文件中我们需要启动定时器中断。在/* USER CODE BEGIN 2/和/USER CODE END 2 */之间添加以下代码HAL_TIM_Base_Start_IT(htim3);真正的魔法发生在stm32f1xx_it.c文件中。我们需要重写HAL_TIM_PeriodElapsedCallback函数。这个函数会在定时器溢出时自动调用。我习惯在tim.c文件中添加这个函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static uint8_t count 0; if(htim-Instance TIM3) { if(count 5) // 100ms * 5 500ms { count 0; HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); } } }这里我加了一个count变量来实现更精确的时间控制。定时器中断每100ms触发一次当计数达到5次时切换LED状态这样就实现了500ms的闪烁周期。5. 调试与优化下载程序到开发板后如果LED没有按预期闪烁可以按照以下步骤排查检查硬件连接确认LED极性正确用示波器或逻辑分析仪测量GPIO引脚看是否有信号输出在中断回调函数中设置断点看是否能进入中断检查定时器配置参数特别是预分频和自动重装载值为了提高代码质量我建议添加一些错误处理。比如在启动定时器前检查句柄是否有效if(HAL_TIM_Base_Start_IT(htim3) ! HAL_OK) { Error_Handler(); }还可以使用宏定义来代替魔术数字这样代码可读性更好#define LED_TOGGLE_PERIOD 56. 进阶应用与扩展思路掌握了基本的定时器中断后可以尝试更复杂的应用。比如使用PWM模式实现LED呼吸灯效果多个定时器协同工作实现复杂的时间序列控制结合输入捕获功能测量脉冲宽度使用定时器触发ADC采样实现精确的定时采集定时器是STM32最强大的外设之一几乎所有的实时控制应用都会用到它。我建议多花时间研究参考手册中的定时器章节理解各种工作模式和特性。在实际项目中我经常使用定时器来做电机控制的PWM生成传感器数据的定时采集通信协议的时间基准系统运行时间的测量7. 常见问题与解决方案在开发过程中我遇到过不少问题这里分享几个典型的问题1中断无法触发 解决方法检查NVIC配置是否启用中断确认中断优先级设置合理确保定时器已启动。问题2LED闪烁频率不对 解决方法仔细检查定时器配置参数特别是时钟源频率和分频系数。可以用示波器测量实际波形。问题3程序运行一段时间后卡死 解决方法可能是中断处理时间过长导致系统异常。优化中断服务函数尽量减少其中的操作。问题4同时使用多个定时器时相互干扰 解决方法合理分配定时器资源注意中断优先级设置避免资源冲突。8. 性能优化技巧经过多次项目实践我总结出一些优化定时器使用的技巧尽量使用硬件定时器而不是软件延时提高系统响应速度对于简单的时间控制可以使用SysTick定时器节省资源合理设置中断优先级确保关键任务及时响应在中断服务函数中避免调用耗时长的库函数使用DMA配合定时器实现高效的数据传输对于周期性任务可以考虑使用定时器的自动重装载功能记住定时器资源是有限的在复杂项目中要合理规划各个定时器的用途。我习惯在项目开始时就做好定时器资源分配表避免后期出现冲突。