STM32保姆级入门教程|第6章:定时器中断原理 + 精准LED闪烁(1s_2s_3s)实战(功能超详细+CubeIDE手把手)

张开发
2026/5/3 4:11:48 15 分钟阅读
STM32保姆级入门教程|第6章:定时器中断原理 + 精准LED闪烁(1s_2s_3s)实战(功能超详细+CubeIDE手把手)
原创 ✍️文章标签#stm32 #stm32cubeide #定时器中断 #TIM2 #led精准闪烁 #嵌入式入门 #单片机实战 #中断回调函数系列前置博客必看否则跟不上哦STM32保姆级入门教程第1章零基础必看从认知到实战全解析STM32保姆级入门教程第2章STM32CubeIDE 使用STM32F103RCT6 J-Link 实现 PA0 引脚 LED 点亮STM32保姆级入门教程第3章从新建工程到LED闪烁点灯Hex生成ST-Link/J-Link切换全攻略STM32保姆级入门教程第4章GPIO输入外部中断 实现按键控制LED手把手全流程STM32保姆级入门教程第5章GPIO内部结构 8种模式 功能详解 本章目录点击可跳转懒人福音✨前言为什么要学定时器中断本章核心功能目标学完能搞定啥定时器是什么核心功能讲透通俗不烧脑定时器中断完整工作原理一步一步拆明白实战目标LED精准亮灭1s2s/3sCubeIDE手把手配置一步一截图零踩坑代码功能详解逐行拆解新手也能懂下载验证见证奇迹的时刻2秒3秒亮灭修改教你灵活变通关键功能总结新手必背避免踩坑常见问题排查遇到问题不用慌下篇预告 资料包 前言大家好我是BackCatK Chen前面我们用HAL_Delay()实现了LED闪烁但我敢说90%的新手都踩过这个坑——HAL_Delay会“霸占”CPU单片机啥也干不了只能傻傻等时间到而且精度还一般项目里根本用不了今天咱们就学STM32的“核心技能”——定时器中断它就像单片机的“专属闹钟”后台默默计时时间到了自动提醒CPU干活不阻塞、精度高、稳定性拉满是工业项目、电子产品的“标配”本章我把定时器功能、中断原理、分频计算、回调函数、实战配置全部讲到最细全程用“大白话表情包一步一截图”新手看完不仅能学会还能彻底吃透再也不用死记硬背 本章核心功能目标清晰明确学完不迷茫搞懂 ✅STM32定时器的本质和核心功能再也不被“PSC、ARR”搞懵掌握 ✅定时时间计算公式精准到秒再也不会算错学会 ✅CubeIDE配置TIM2定时器全截图一步都不落下掌握 ✅定时器中断启动方法一行代码搞定学会 ✅中断回调函数编写逐行解释知道每句代码干啥实现 ✅ LED 1秒亮 → 1秒灭精准无漂移LED 2秒亮 → 2秒灭灵活修改参数LED 3秒亮 → 3秒灭举一反三理解 ✅为什么定时器比HAL_Delay更强大、更专业项目开发必懂⏰ 定时器是什么核心功能讲透最通俗不烧脑2.1 定时器本质一句话讲懂定时器 单片机内部一个“独立运行的精准电子秒表”它最牛的地方在于不需要CPU盯着自己在后台默默计数时间到了就主动“拍一下”CPU让CPU去处理定时任务CPU平时该干嘛干嘛互不干扰2.2 定时器4大核心功能新手重点记前2个精准计时从微秒级到秒级精度极高不会漂移比HAL_Delay强10倍自动触发中断时间一到自动通知CPU不用CPU一直查询不阻塞程序CPU可以同时运行其他代码比如一边计时一边检测按键拓展功能PWM输出、输入捕获、编码器计数后续章节慢慢学先搞定基础本章我们只聚焦前两个核心功能精准计时 中断触发 → 控制LED亮灭把基础打牢2.3 定时器 vs HAL_Delay功能大比拼一眼看清差距实现方式功能特点是否阻塞CPU精度项目使用建议HAL_Delay()干等CPU卡住不动是 ❌坑一般有误差调试临时用项目不推荐定时器中断后台计时自动提醒否 ✅推荐极高无漂移必须用工业级标准 结论只要是项目开发必用定时器中断HAL_Delay只能用来临时调试别当真 定时器中断完整工作原理功能流程拆明白新手也能懂3.1 先搞懂中断是什么通俗比喻中断就像你家里的闹钟⏰你在看书CPU运行主程序闹钟响了定时器中断触发你立刻停下看书去关闹钟CPU暂停主程序执行中断回调函数关完闹钟继续看书CPU回到主程序正常运行简单说中断 优先级最高的“紧急任务”时间到了必须优先处理3.2 定时器中断工作全流程逐步骤功能解释必看结合STM32F103芯片我们一步步拆解每一步都讲清功能系统时钟供给STM32F103默认系统时钟是72MHz高频时钟太快了定时器用不了⚙️预分频器PSC把72MHz的高频时钟“减速”变成我们需要的低频时钟比如10kHz计数器CNT从0开始每来一个时钟脉冲就自动加1相当于秒表“滴答”一下自动重装载值ARR设定一个“目标值”计数器数到这个值就“溢出”相当于秒表到点了中断触发计数器溢出后立刻向CPU发送“中断信号”提醒CPU处理任务执行回调函数CPU收到信号暂停主程序执行我们写的“翻转LED”代码自动重启计数器自动清0重新开始计数循环往复实现LED持续闪烁3.3最核心公式精准定时必须背背会直接封神定时时间的计算就靠这一个公式再也不用瞎猜参数定时时间秒 (PSC 1) × (ARR 1) / 定时器时钟⚠️ 重点提醒STM32F103 定时器时钟 72MHz 72000000Hz固定值不用改PSC和ARR都是“从0开始计数”所以要加1新手最容易漏加导致时间算错举个例子想实现1秒定时代入公式就能算出PSC和ARR后面实战会详细算不用担心 实战目标LED精准亮灭1s/2s/3s沿用前面章节的硬件配置不新增任何硬件只改软件配置实现3种精准闪烁效果✅ 效果1LED 1秒亮 → 1秒灭循环精准无漂移✅ 效果2LED 2秒亮 → 2秒灭循环修改参数即可✅ 效果3LED 3秒亮 → 3秒灭循环举一反三硬件基础PA0引脚 → LED推挽输出和第5章完全一致不用重新接线️ CubeIDE手把手配置一步一截图零踩坑新手直接照搬全程用我们第5章的工程不用新建直接继承GPIO配置节省时间步骤1打开第5章工程继承PA0 LED配置打开之前保存的工程工程中已包含PA0LED 推挽输出不用改PA5按键上拉输入本章用不到不管它 小提醒如果忘记保存工程重新打开第5章的工程即可不用重新配置GPIO步骤2开启TIM2内部时钟定时器“供电”操作步骤点击左侧Timers文件夹展开后选择TIM2STM32F103的TIM2是16位定时器够用了2. 在右侧Clock Source下拉菜单中选择Internal Clock内部时钟 功能解释让TIM2使用单片机内部的72MHz时钟运行这是定时器工作的基础必须选对步骤3配置PSC和ARR实现1秒精准定时核心步骤切换到Parameter Settings界面配置以下3个参数直接照搬不用自己算后面会讲计算过程Prescaler (PSC)7199预分频器减速用Counter Period (ARR)9999自动重装载值定时目标值Auto-reload PreloadEnable自动重装载循环计时 功能详解PSC预分频器把72MHz时钟分成7200份每份就是10kHz72MHz ÷ 7200 10kHzARR自动重装载值计数器从0数到9999刚好是10000个脉冲Auto-reload Preload开启后计数器溢出后会自动清0重新开始计数实现循环定时 计算过程1秒定时手把手算新手也能会(或者考虑我之前的博客有更详细的说明STM32定时 计算公式)定时时间 (71991) × (99991) / 72000000 7200 × 10000 / 72000000 72000000 / 72000000 1 秒完美刚好是1秒精准无误差步骤4开启NVIC中断打开“闹钟开关”操作步骤切换到NVIC Settings界面找到TIM2 global interrupt勾选Enable开启TIM2中断总开关优先级Priority默认即可新手不用改后续再讲中断优先级 功能解释这一步相当于“打开闹钟的声音”如果不开启定时器就算时间到了也不会通知CPU中断就没用了步骤5生成代码CubeIDE自动写底层懒人福利点击右上角保存图标弹出提示点击Yes等待代码生成完成后进入代码编辑界面。 小提醒生成代码后会自动打开工程不用手动打开直接开始编写代码即可 代码功能详解 实战编写逐行拆解新手也能懂生成代码后我们只需要添加2部分代码启动定时器中断让“闹钟”开始工作编写中断回调函数“闹钟响了”要做的事——翻转LED6.1 启动定时器中断必须写一行代码搞定操作步骤打开main.c文件左侧Project窗口展开Src文件夹找到main.c在while(1)循环的上方添加以下代码// 启动TIM2定时器中断核心代码一行都不能少HAL_TIM_Base_Start_IT(htim2); 逐行功能解释HAL_TIM_Base_Start启动定时器的基础功能相当于“打开秒表”_IT表示“开启中断模式”相当于“打开闹钟声音”htim2指定我们要启动的是TIM2定时器不能写成TIM1、TIM3否则报错6.2 编写中断回调函数核心中的核心中断回调函数的作用定时器时间到了自动执行这个函数里的代码我们要做的就是“翻转LED”。操作步骤打开工程Core→Src→main.c文件在/* USER CODE BEGIN Includes */下方添加宏定义封装引脚和电平/* USER CODE BEGIN Includes */// 封装LED引脚和电平逻辑后期修改仅需改此处#defineLED1_PORTGPIOA#defineLED1_PINGPIO_PIN_0#defineLED1_ONGPIO_PIN_RESET// 低电平点亮#defineLED1_OFFGPIO_PIN_SET// 高电平熄灭/* USER CODE END Includes */在main.c文件的最下方main函数结束之后添加以下代码// 定时器中断回调函数重中之重// 功能当定时器溢出时间到时自动调用此函数voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){// 判断是不是TIM2定时器触发的中断防止其他定时器干扰if(htim-InstanceTIM2){// 核心功能翻转PA0引脚电平LED亮 ↔ 灭HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);}} 逐行功能拆解新手必看搞懂每一句HAL_TIM_PeriodElapsedCallbackSTM32 HAL库的“定时器溢出回调函数”名字固定不能改改了就不会自动执行TIM_HandleTypeDef *htim参数用来判断是哪个定时器触发的中断比如TIM2、TIM3if(htim-Instance TIM2)判断当前中断是不是TIM2触发的避免其他定时器比如TIM3干扰新手一定要加否则可能出问题HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin)翻转LED电平——原来亮就变灭原来灭就变亮LED_GPIO_Port和LED_Pin是第5章定义的不用改 小技巧回调函数不用手动调用定时器时间到了会自动触发执行是不是很方便✨ 下载验证见证奇迹的时刻代码编写完成后就可以下载到单片机看看LED是不是精准1秒闪烁操作步骤连接J-LinkST-Link到单片机和电脑点击CubeIDE右上角的“下载”按钮图标是一个向下的箭头下载完成后单片机自动运行程序精准LED闪烁✅ 预期现象LED 精准1秒亮 → 1秒灭循环往复无漂移、不卡顿此时CPU还能同时处理其他任务比如检测按键比HAL_Delay强太多 恭喜你已经学会了定时器中断的核心用法离项目开发又近了一步 修改为2秒/3秒亮灭教你灵活变通举一反三学会了1秒闪烁2秒、3秒就很简单了只需要修改PSC和ARR的值代入公式重新计算即可不用改代码8.1 实现2秒亮灭精准无误差参数配置直接照搬PSC 7199不变还是把72MHz分成7200份ARR 19999计算过程时间 (71991) × (199991) / 72000000 7200 × 20000 / 72000000 2 秒8.2 实现3秒亮灭精准无误差参数配置直接照搬PSC 7199不变ARR 29999计算过程时间 (71991) × (299991) / 72000000 7200 × 30000 / 72000000 3 秒 小技巧PSC可以不变只改ARR的值就能调整定时时间ARR越大定时时间越长新手可以自己试试调整ARR看看LED闪烁速度的变化 关键功能总结新手必背避免踩坑⚙️PSC 预分频器功能是“减速”把72MHz高频时钟变成低频时钟数值越大时钟越慢ARR 自动重装载值功能是“设定定时目标”数值越大定时时间越长中断功能是“时间到提醒CPU”必须开启NVIC中断否则无效回调函数功能是“存放定时任务”比如翻转LED名字固定不能改核心公式定时时间 (PSC1)×(ARR1)/72000000记牢不会算错启动函数HAL_TIM_Base_Start_IT(htim2)一行都不能少否则定时器不工作。❌ 常见问题排查遇到问题不用慌对照排查新手最容易踩的4个坑全部整理好了遇到问题直接对照 LED不闪烁 → 原因忘记添加HAL_TIM_Base_Start_IT(amp;htim2)定时器没启动⏱️ 时间不准 → 原因PSCARR计算错误漏加1或未开启Auto-reload Preload 中断不触发 → 原因NVIC中断未开启步骤4没做或回调函数名字写错 灯不亮 → 原因PA0引脚未配置为推挽输出回到第5章检查GPIO配置。 下篇预告精彩不容错过STM32保姆级入门教程第7章串口通信USART收发数据 printf重定向打印调试手把手教你配置串口、实现printf打印、串口收发数据、上位机通信学会串口调试再也不用瞎猜程序有没有运行原创不易若本文对你有帮助欢迎点赞、收藏⭐、关注➕有任何问题可在评论区留言我会一一回复本文所使用的工程文件已上传至配套资源中如有需要可自行下载。也可关注博主后留言获取。欢迎关注公众号获取更多技术干货博主准备到这份资料包涵盖了从硬件电路设计到STM32单片机开发再到Linux系统学习的全链路内容适合不同阶段的学习者硬件基础包含硬件电路合集、硬件设计开发工具包帮你打牢底层基础。STM32专项从环境搭建、开发工具、传感器模块到项目实战还有书籍和芯片手册一站式搞定STM32学习。C语言进阶C语言学习资料包助你掌握嵌入式开发的核心语言。面试求职嵌入式面试题合集提前备战技术面试。Linux拓展Linux相关学习资料包拓宽技术视野。资料包目录00-STM32单片机环境搭建01-硬件电路合集02-硬件设计开发工具包03-C语言学习资料包04-STM32单片机开发工具包05-STM32传感器模块合集06-STM32项目合集07-STM32单片机书籍芯片手册08-Linux相关学习资料包

更多文章