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

stm32——定时器级联

    在STM32当中扩展定时范围:单个定时器的定时长度可能无法满足某些应用的需求。通过级联,可以实现更长时间的定时;提高定时精度:能够在长定时的基础上,通过合理配置,实现更精细的定时控制;处理复杂定时任务:适用于需要多个不同定时阶段或复杂定时顺序的应用场景,方便实现更复杂的定时逻辑。换句话说,在STM32当中,我们所应用到的定时器都是16位的定时器,那么怎么提高时钟的精度,改为32位的定时器,这个问题就出来了。举个例子,以频率计为例,我只用只用一个时钟源作为计数器,它顶到天了,也就只能计数到65535(2^16-1)。而你将两个计数器级联之后,我们就有了一个32位的计数器,当我们的主计数器计完数之后,发生中断的时候,从计数器计一个数。周而复始,依此类推。所得到的频率也就越广越精。经过试验,使用TIM2和TIM3作为主从计数器,能测到0.0167Hz~400kHz。而单用TIM3在1kHz以下误差就很差了。

       那怎么级联呢?大家可以通过参考手册里面有个详细的原理框图。如下图。

主从定时器级联原理框图

      在 STM32 中,主从计数器的运行原理主要是通过主定时器的事件来控制从定时器的操作。主定时器通常按照自身的配置进行计数和产生相关事件,比如更新事件。从定时器则可以设置为响应主定时器的特定事件,如在主定时器更新时开始计数、停止计数、复位计数等。这种主从配置的优势在于能够实现更复杂和精确的定时控制。例如,可以通过主定时器的长周期定时来触发从定时器的短周期操作,从而在不同的时间尺度上协同工作。具体来说,主定时器的计数模式、时钟源、预分频系数、自动重载值等决定了其定时周期和产生事件的时机。从定时器根据主定时器的事件以及自身的配置进行相应的动作。例如,将 TIM2 设为主定时器,TIM3 设为从定时器,并配置 TIM3 在 TIM2 产生更新事件时开始计数。这样,TIM2 的定时周期结束产生更新事件,触发 TIM3 开始计数,实现了主从协同工作。这种主从模式的配置为实现多样化的定时需求提供了灵活的手段,适用于各种需要复杂定时逻辑的应用场景。

配置定时器1为主模式,它可以在每一个更新事件UEV时输出一个周期性的触发信号。在 TIM1_CR2寄存器的MMS=’010’时,每当产生一个更新事件时在TRGO1上输出一个上升沿信号。连接定时器1TRGO1输出至定时器2,设置TIM2_SMCR寄存器的TS=’000’,配置定时器2 为使用ITR1作为内部触发的从模式。然后把从模式控制器置于外部时钟模式1(TIM2_SMCR寄存器的SMS=111);这样定时器2即可由定时器1周期性的上升沿(即定时器1的计数器溢出)信号驱动。最后,必须设置相应(TIMx_CR1寄存器)的CEN位分别启动两个定时器。这里在TRGO1和ITR1这两个参数是重要的地方,它们就像钥匙和门一样,钥匙是“TRGO1”,门是ITR1。只有两个都通了,时钟才能级联。程序就是下面这几句,这里我用的是TIM2作为主时钟,TIM3作为从时钟。

       那么完整的时钟配置程序会是什么样的呢?

          那么换其他的主从定时器怎么办呢?这就得继续调整参数TIM_TS_ITRx了,这里参考手册里面有个表格供大家参考。

        好了,今天的STM32就聊到这里,大家多练多消化。反正我就单纯换了个主从顺序就晕晕乎乎换了半天。我的天啊!

        欲知后事如何,且听下回分解。OVO......

相关文章:

  • 新火种AI|AI搜索挑战百度谷歌,重塑信息检索的市场?
  • React@16.x(44)路由v5.x(9)源码(1)- path-to-regexp
  • mysql查询父级树
  • 【机器学习】FFmpeg+Whisper:二阶段法视频理解(video-to-text)大模型实战
  • linux下mysql的定时备份
  • 自动化设备上位机设计 一
  • 音视频入门基础:H.264专题(8)——H.264官方文档的描述符
  • 安装 Mamba、Conv1d 时报错 “bare_metal_version“
  • MySQL数据恢复(适用于误删后马上发现)
  • 软件测试面试题:Redis的五种数据结构,以及使用的场景是什么?
  • 【操作系统期末速成】 EP01 | 学习笔记(基于五道口一只鸭)
  • 【leetcode78-81贪心算法、技巧96-100】
  • Rust 跨平台-Android 和鸿蒙 OS
  • 分布式计算、异构计算与算力共享
  • Jenkins 下使用 Node 和 Npm(借助 nvm-wrapper 插件)构建前端程序
  • [译]如何构建服务器端web组件,为何要构建?
  • CentOS从零开始部署Nodejs项目
  • Java方法详解
  • Java知识点总结(JavaIO-打印流)
  • nodejs:开发并发布一个nodejs包
  • PHP 小技巧
  • React 快速上手 - 07 前端路由 react-router
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue--数据传输
  • 百度小程序遇到的问题
  • 笨办法学C 练习34:动态数组
  • 编写高质量JavaScript代码之并发
  • 初识MongoDB分片
  • - 概述 - 《设计模式(极简c++版)》
  • 给新手的新浪微博 SDK 集成教程【一】
  • 坑!为什么View.startAnimation不起作用?
  • 使用parted解决大于2T的磁盘分区
  • 算法-图和图算法
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我的面试准备过程--容器(更新中)
  • scrapy中间件源码分析及常用中间件大全
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 交换综合实验一
  • ​第20课 在Android Native开发中加入新的C++类
  • # SpringBoot 如何让指定的Bean先加载
  • #07【面试问题整理】嵌入式软件工程师
  • #NOIP 2014# day.1 T2 联合权值
  • $.proxy和$.extend
  • (1) caustics\
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (原创)可支持最大高度的NestedScrollView
  • (转)大型网站的系统架构
  • (转)我也是一只IT小小鸟
  • ***检测工具之RKHunter AIDE
  • ../depcomp: line 571: exec: g++: not found