当前位置: 首页 > article >正文

彻底搞懂STM32定时器:PSC、ARR、CNT详解,附精确延时代码---STM32 HAL库专栏

渡水无言个人主页渡水无言❄专栏传送门《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》❄专栏传送门《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》❄专栏传送门《产品测评专栏》⭐️流水不争先争的是滔滔不绝博主简介第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生在这里主要分享自己学习的linux嵌入式领域知识有分享错误或者不足的地方欢迎大佬指导也欢迎各位大佬互相三连​目录前言一、定时器简介1.1、定时器内部结构1.2、定时器分类1.3时基单元1.3.1、时钟来源1.3.2、预分频器1.3.3、计数器CNT1.3.4、重复计数器高级定时器才有1.3.5、自动重装系统ARR1.3.6、寄存器预加载机制二、用定时器实现延时函数2.1、启动定时器hal库函数2.2、定时器中断回调函数2.3、正式代码总结前言上一期博客我们介绍了STM32的中断知识并完成了相关实验。本期博客我们开始介绍STM32的定时器知识。一、定时器简介TIMTimer定时器 定时器可以对输入的时钟进行计数并在计数值达到设定值时触发中断。1.1、定时器内部结构定时器的内部结构框图1.2、定时器分类STM32F103C8T6定时器资源TIM1、TIM2、TIM3、TIM41.3时基单元就是定时器内部专门用来产生 “时间基准” 的那一套核心电路。时基单元 定时器的 “时钟来源 计数器 分频 周期控制” 模块是所有定时、中断、PWM 的时间基础。1.3.1、时钟来源定时器的 “脉搏”时基单元的时钟有三种来源RCC 时钟来自系统时钟树最常用本文重点TRIG 触发时钟外部触发信号或其他定时器触发ETRF 外部时钟直接从外部引脚输入的时钟我们本次只需要了解来自RCC的时钟来源,如下图所示APB的分频系数等于1 那么倍频系数就是1若1倍频系数就是2。举例如下图1.3.2、预分频器因为时钟来源部分输入的时钟频率会比较高所以需要一个 预分频器来降低输入时钟的频率预分频器的分频系数 PSC 1。PSC∈065535例如假设PSC为7。1.3.3、计数器CNT对左侧输入的脉冲进行计数。CNT可1/-1CNT∈065535CNT到底1还是-1取决于我们所选择的计数方向。计数方向如下计数方向可配置为向上计数、向下计数、中央对齐计数向上计数从 0 开始一直加到 ARR溢出后重置为 0向下计数从 ARR 开始一直减到 0溢出后重置为 ARR中央对齐先向上加到 ARR再向下减到 01.3.4、重复计数器高级定时器才有作用是设置重复计数的次数重复计数的次数 RCR1。RCR∈065535。1.3.5、自动重装系统ARR定时器模块中的自动重装载寄存器。这个功能主要用于定时器的自动重装载操作使得定时器在达到设定值后能够自动重新开始计数而不需要手动干预。以手表计数5圈响铃一次为例展示全流程如下图所示例子设置1ms触发一次开启了定时器的更新中断那么每隔 1ms 就会触发一次中断服务程序。所以可以理解为“1ms中断一次”。1.3.6、寄存器预加载机制之前时基单元里有阴影的部分就是有这个预加载机制。预加载就是一种缓存机制。当我们向寄存器写值的时候这个值首先会进入影子寄存器等到某个事件发生的时候影子寄存器里面的值才会进入活动寄存器。这个时候我们写入的值才会生效。预加载是为了安全防止定时器跑飞。自动重装寄存器ARR)、预分频器PSC、重复计数器RCR有预加载。其中PSC和RCR的预加载是强制开启的关不掉。ARR的预加载是可以手动开关的而且默认是关闭状态通常需要手动使能ARR的预加载。二、用定时器实现延时函数先要在cubmax里按下边这个图来设置参数。2.1、启动定时器hal库函数HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);函数功能以中断方式启动时基单元。调用该函数后定时器开始计数当计数溢出更新事件时会触发中断进入相应的回调函数。htim定时器句柄指针例如htim1表示定时器1htim2表示定时器2。HAL_OK启动成功HAL_ERROR启动失败2.2、定时器中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim htim1) // 判断是哪个定时器触发的中断 { currentMiliSeconds; // 毫秒计数加1 // 此处可添加定时器1的其他处理逻辑 } // 还可以添加其他定时器的判断分支 }当任意定时器产生周期溢出事件时都会自动调用此函数。2.3、正式代码static volatile uint32_t currentMiliSeconds 0; // 获取当前时间 static uint32_t MyGetTick(void) { return currentMiliSeconds; } // 延时函数 static void MyDelay(uint32_t Delay) { uint32_t expireTime MyGetTick() Delay; while(expireTime MyGetTick()){}; } // 定时器中断回调 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim htim1) { currentMiliSeconds; // 每1ms加1 } } // 主函数 void main(void) { // ★★★ 关键启动定时器中断 ★★★ HAL_TIM_Base_Start_IT(htim1); // 以中断方式启动定时器1 while(1) { // 主循环代码 MyDelay(1000); // 延时1秒 // 其他操作... } }HAL_TIM_Base_Start_IT(htim1) 启动定时器1定时器硬件每 1ms 产生一次更新事件溢出硬件触发中断HAL库自动调用 HAL_TIM_PeriodElapsedCallback判断是定时器1触发执行 currentMiliSecondscurrentMiliSeconds 每 1ms 增加 1相当于一个毫秒计数器可以这么看定时器中断 秒表的滴答声每1ms响一次currentMiliSeconds 秒表上的数字每响一次加1MyGetTick() 你看秒表读数的动作MyDelay(5) 你盯着秒表等它走5个滴答5ms总结本期博客从定时器的基础结构讲起逐步深入到实际代码实现帮助读者建立起完整的定时器应用知识体系为后续学习PWM、输入捕获等高级功能打下坚实基础。

相关文章:

彻底搞懂STM32定时器:PSC、ARR、CNT详解,附精确延时代码---STM32 HAL库专栏

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏》 ❄专栏传送门:《产品测评专栏》…...

Windows操作系统核心知识与安全基础全解析

摘要:在数字世界的每一天,我们几乎都在与操作系统打交道,尤其是微软的Windows。它不仅是电脑的“大管家”,也是连接我们与硬件的桥梁。本文将带你从零开始,系统性地理解Windows的核心构成、运作方式以及至关重要的安全…...

Delta并联机器人:轨迹规划与工作空间求解的正逆解

Delta并联机器人轨迹规划工作空间求解正逆解今天咱们来聊聊Delta并联机器人的轨迹规划和工作空间求解,顺便撸点代码,看看怎么搞正逆解。先说说Delta机器人,这家伙在工业上用得挺多,尤其是高速抓取和装配的场景。它的结构简单&…...

SAP Joule:嵌入 SAP Fiori Launchpad 的生成式 AI 数字助手

在过去很多年里,企业用户对 数字助手 的期待一直很朴素:能回答问题、能帮我找入口、最好还能少点培训成本。可一旦系统规模进入 SAP S/4HANA、SuccessFactors、Ariba、SAP Build Work Zone 这类跨产品协同的现实世界,传统助手往往就会遇到天花板。它也许能理解一段对话,却未…...

刷题笔记:力扣第73、74题(二维矩阵)

力扣第73题-矩阵置零1.拿到题目后,第一时间想到应该先遍历一遍矩阵,分别使用一个行标记数组和一个列标记数组来标记哪里有0,然后进行置零操作,但题目要求使用原地算法,即不开辟新的数组、直接在原矩阵上进行操作。2.那…...

矩转换矩阵

格子玻尔兹曼方法(LBM)MRT作用力模型格子玻尔兹曼方法搞流动模拟的老司机都知道,MRT(多松弛时间)模型可比单松弛时间模型(BGK)香多了。这玩意儿最大的特点就是数值稳定性强,边界条件…...

SpringAI大语言模型调用优化:性能提升技巧

在前面的内容中,我们了解了SpringAI与大语言模型集成的相关基础信息。而在实际使用SpringAI调用大语言模型时,往往会遇到响应慢、资源消耗大等问题。这就需要我们掌握SpringAI调用大语言模型的性能优化方法,从而提升调用的性能。接下来&#…...

SpringAI集成OpenAI:从配置到调用实战

在当今的人工智能领域,大语言模型展现出了强大的能力。SpringAI作为一个优秀的框架,能够很好地与大语言模型集成,为开发者提供便捷的开发体验。而OpenAI作为大语言模型领域的佼佼者,其模型如GPT系列在自然语言处理等方面有着卓越的…...

用C语言程序解决两个简单问题

1.编写程序从键盘输入华氏温度,将其转化为摄氏温度后输出,要求保留2位小数。2. 从键盘输入一整型分钟数,将其换算成用小时和分钟表示,然后进行输出。...

SpringAI大语言模型应用案例:智能问答系统开发

在当今数字化时代,智能问答系统已经成为了许多企业和应用的核心功能之一。它能够快速、准确地回答用户的问题,提供高效的服务。而SpringAI与大语言模型的结合,为开发智能问答系统提供了强大的工具和方法。在这一小节中,我们将通过…...

ssm+java2026年毕设社区医院综合管理信息系统【源码+论文】

本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容进度安排:2023年8月23日-2023年9月18日 与指导老师进行沟通,确认选题并提交题目进行审核2023年9月19日-2023年10月…...

MedGemma-X快速入门:无需代码,轻松实现X光片智能解读

MedGemma-X快速入门:无需代码,轻松实现X光片智能解读 1. 为什么选择MedGemma-X? 在医疗影像诊断领域,传统的人工阅片方式面临着效率低下、工作强度大、经验依赖性强等问题。而大多数AI辅助诊断工具又需要复杂的部署流程和技术背…...

Typora+Local AI MusicGen:Markdown文档智能配乐系统

TyporaLocal AI MusicGen:Markdown文档智能配乐系统 1. 项目背景与价值 你有没有遇到过这样的情况:写技术文档时总觉得少了点什么,文字虽然清晰但阅读体验单调乏味?或者深夜写代码文档时,希望有点背景音乐来提升工作…...

Cosmos-Reason1-7B大模型部署:从零开始的完整指南

Cosmos-Reason1-7B大模型部署:从零开始的完整指南 本文面向初学者,手把手教你如何从零开始部署Cosmos-Reason1-7B大模型,无需深厚的技术背景,跟着步骤走就能搞定。 1. 环境准备:打好基础很重要 部署大模型前&#xff…...

Git 版本管理实践:如何管理你的 Flux Sea Studio 提示词与参数库

Git 版本管理实践:如何管理你的 Flux Sea Studio 提示词与参数库 你是不是也遇到过这种情况?在 Flux Sea Studio 里尝试了无数个提示词和参数组合,终于生成了一张满意的作品。几天后想复现或者微调一下,却完全想不起来当时到底用…...

Qwen人脸生成图像进阶技巧:提示词怎么写效果更好?

Qwen人脸生成图像进阶技巧:提示词怎么写效果更好? 1. 理解提示词的核心作用 1.1 提示词如何影响生成效果 提示词是您与Qwen人脸生成模型沟通的唯一桥梁。就像给一位画家下达创作指令一样,您提供的描述越精准,生成的结果就越符合…...

Windows 11 WSL默认存储位置修改全攻略:从新手到高手

Windows 11 WSL默认存储位置修改全攻略:从新手到高手 对于许多开发者而言,Windows Subsystem for Linux(WSL)已经成为日常开发不可或缺的工具。然而,随着使用时间的增长,C盘空间告急的问题逐渐显现——特别…...

WSL2+Ubuntu18.04远程桌面终极指南:从VNC配置到内网穿透全流程

WSL2Ubuntu18.04远程桌面终极指南:从VNC配置到内网穿透全流程 在开发者和系统管理员的日常工作中,能够随时随地访问开发环境已成为刚需。微软推出的WSL2(Windows Subsystem for Linux 2)让Linux环境与Windows无缝集成,…...

Altium Designer实战:10分钟搞定光耦原理图符号绘制(附详细步骤图)

Altium Designer光耦符号绘制实战:从零到专业的全流程解析 在电子设计领域,光耦(光电耦合器)作为信号隔离的关键元件,其原理图符号的规范绘制直接影响设计效率和团队协作。对于使用Altium Designer的工程师而言&#x…...

Youtu-Parsing模型Docker容器化部署与Kubernetes运维指南

Youtu-Parsing模型Docker容器化部署与Kubernetes运维指南 最近在搞一个图像解析的项目,用到了Youtu-Parsing这个模型,效果确实不错。但问题来了,怎么把它从开发环境搬到生产环境,让它能稳定、高效地跑起来,还能扛得住…...

伺服电机控制四台丝杆升降机联动的3种方案对比(附真实案例)

伺服电机控制四台丝杆升降机联动的3种方案对比(附真实案例) 在工业自动化领域,多轴同步控制一直是精密制造的核心挑战之一。想象一下汽车生产线上的车身焊接工位,或是造船厂里数十吨重的分段组装平台,四台丝杆升降机需…...

2026 政府工作报告全文解读:GDP 增长 4.5%-5%,赤字率首破 4%!

导读:2026 年是"十五五"开局之年,政府工作报告释放了哪些重磅信号?4% 赤字率意味着什么?一文带你读懂!📊 一、2025 年成绩单:很不平凡的一年经济发展主要成就2025 年是很不平凡的一年…...

从原理到实战:一文读懂随机森林的核心机制与行业落地

1. 随机森林的团队智慧:为什么一群树比一棵树更聪明? 想象你正在参加一场百万富翁的电视问答节目,遇到一个特别难的问题。这时候你有两个选择:要么自己猜答案,要么使用"求助观众"功能让现场500人投票。显然&…...

CARLA与Autoware联合仿真的数据桥梁:话题转发与TF树配置实战

1. 为什么需要CARLA与Autoware联合仿真 自动驾驶系统的开发离不开仿真测试。CARLA作为开源的自动驾驶仿真平台,提供了高度逼真的虚拟环境和丰富的传感器模型;而Autoware则是目前最成熟的开源自动驾驶软件栈。将两者结合,可以快速验证算法在实…...

M2LOrder WebUI保姆级教程:从启动脚本到批量情感预测详细步骤

M2LOrder WebUI保姆级教程:从启动脚本到批量情感预测详细步骤 1. 前言:为什么你需要这个情绪识别工具? 想象一下,你正在运营一个社交媒体账号,每天有成百上千条用户评论涌来。你想知道用户对你的产品是喜欢还是讨厌&…...

#第七届立创电赛# 基于N32G430C8L7与INA199的USB功率计设计与实现

手把手教你做一个USB功率计:基于N32G430C8L7与INA199 最近在捣鼓一些USB设备,总想知道它们到底吃了多少电,是5V 1A还是能触发快充?市面上现成的USB功率计要么太贵,要么功能单一。正好,借着立创电赛的机会&a…...

RePKG:Wallpaper Engine资源处理的高效工具与创新方案

RePKG:Wallpaper Engine资源处理的高效工具与创新方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在数字内容创作领域,创作者常常面临资源处理效率低下、…...

OpenFOAM粘弹性流体模拟实战:rheoTool求解器从安装到案例解析

OpenFOAM粘弹性流体模拟实战:rheoTool求解器从安装到案例解析 在计算流体力学领域,粘弹性流体的数值模拟一直是极具挑战性的课题。这类流体同时表现出粘性和弹性特性,使得传统牛顿流体模拟方法难以准确捕捉其复杂行为。rheoTool作为OpenFOAM生…...

Qt Designer实战:3步搞定QScrollArea滚动条不显示的坑(附布局技巧)

Qt Designer实战:3步解决QScrollArea滚动条消失的终极指南 第一次在Qt Designer里拖入QScrollArea组件时,那种"明明放了按钮却看不到滚动条"的困惑,相信每个Qt新手都经历过。作为Qt官方推荐的可视化界面设计工具,Qt Des…...

3步提升科研效率:给学术工作者的投稿管理工具指南

3步提升科研效率:给学术工作者的投稿管理工具指南 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 科研工作者每天需花费大量时间管理论文投稿流程,从频繁登录系统查询状态到手动记录审稿时间…...