【STM32HAL库学习】定时器功能、时钟以及各种模式理解

一、文章目的

记录自己从学习了定时器理论->代码实现使用定时->查询数据手册,加深了对定时器的理解以及该过程遇到了的一些不清楚的知识。

请添加图片描述

  • 上图为参考手册里通用定时器框图,关于定时器各种情况的工作都在上面了,在理论学习和实际应用后再来看这张图会觉得豁然开朗。

  • 定时器基本的单元为16位自动装载寄存器ARR,16位预分频器PSC,计数器CNT,另外有4个独立通道,在我看来只有两种大功能:
    输入捕获 (如测输入信号频率、占空比、编码器)
    输出比较 (如输出PWM波控制电机、舵机)
    根据这两种功能可以将定时器配置为不同模式,比如输出pwm的PWM模式、读取编码器的Encoder模式。

二、定时器时钟来源选择(极为重要)

内部时钟(CK_INT)
内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器
外部时钟模式1:外部输入脚(TIx) ,4个独立通道的输入
外部时钟模式2:外部触发输入(ETR) ,模式1和模式2看上去非常相似
在这里插入图片描述

清楚定时器的时钟来源,后续才能理解定时器的各种模式

三、 理解最基本的定时

在时钟的驱动下,计数器CNT递增+1(默认向上计数),当到达自动重装载寄存器ARR中的目标值时,溢出清零,产生中断,循环这个过程。

HAL库实现基本定时

  • 1、打开并设置基本定时器
      1. 选择为内部时钟,即内部时钟模式
      1. 设置以下参数:定时器的时钟频率 fc=f /(PSC+1)/(ARR+1),f为单片机时钟来源。
    • 预分频器Prescaler    PSC
      
    • 自动重装寄存器CouterPeriod   ARR
      
    • 输入滤波器的频率分频InternalClockDivision(一般不需要)
      

在这里插入图片描述

  • 2、打开中断
    在这里插入图片描述
  • 3、main函数中初始化TIM2
HAL_TIM_Base_Start_IT(&htim2);

4、驱动函数中找回调函数然后在main.c中重写

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); //原型
//重写
uint16_t hhRetCount=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim==&htim2){hhRetCount+=1;}
}

四 、输出比较

此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。

定时器的每个输出通道能够独立的产生一路PWM信号(由ARR寄存器确定频率、由CCR寄存器确定占空比的信号。)

HAL库实现生成PWM(驱动舵机、电机、呼吸灯)

  • 1、设置TIM2定时器相关参数

    • 生成1000HZ,占空比为20的PWM波形
      在这里插入图片描述

    HAL库实现编码器读取

  • 2、main函数中启动生成PWM

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,Speed); //设置CCR值控制占空比

五 、输入捕获

输入捕获模式下,当通道输入引脚出现指定电平跳变时(类似于中断),当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。

可配置为PWMI模式(不清楚没关系),同时测量频率和占空比;也可配合主从触发模式`(下文中从模式的复位模式),实现硬件全自动测量(触发输入实现定时器的自动清零)。

对于同一个定时器,输入捕获和输出比较只能同时用一个。
输入捕获:将CNT的值写到CCR
输出比较:根据CNTCCR的比较后输出

输入捕获测频率、测占空比

在这里插入图片描述

从模式-复位模式下,上升沿触发,因此上升沿来临时,计数器CNT的值存进了CCR1中然后自动清零;下降沿来临时,CNT的值存进了CCR2中,并未清零。然后可以计算频率(用CCR1)和占空比(用CCR1和CCR2)。

在这里插入图片描述

HAL库实现输入测频率、占空比

  • 1、TIM2生成PWM待测信号、启动
  • 2、设置TIM3定时器相关参数
    • 通道1用于测频率
      1. 设置TI1FP1ResetMode,即清空计数
      1. 使用内部时钟
      1. 通道1设置为输入捕获模式
      1. 设置预分频器为72
      1. 自动重装寄存器为65535
      1. 输入捕获上升沿
    • 通道2用于测占空比
      1. 打开通道2为交叉模式、设置下降沿触发

通道1

通道2
在这里插入图片描述

  • 3、打开TIM3的全局中断、main中开启TIM3
    在这里插入图片描述
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);

3、找到输入捕获回调函数并重写

uint32_t capture;
int32_t freq;
uint32_t DutyResult;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM3) {if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {// 上升沿触发的中断capture =HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)+1;uint32_t aa=HAL_RCC_GetPCLK1Freq();uint32_t bb=(htim->Instance->PSC+1);uint32_t cc=HAL_RCC_GetPCLK1Freq()/(htim->Instance->PSC+1);freq=1000000/capture;} else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {// 下降沿触发的中断uint32_t capture2 =HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2)+1;DutyResult=capture2 *100 / capture;}}
}

可动态修改TIM2的频率和占空比

__HAL_TIM_SET_PRESCALER(&htim2,72-1);//10000HZ
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 83);//83%

HAL库实现读取旋转编码器

每个高级定时器和通用定时器都拥有一个编码器接口,借用输入捕获IC的通道1和通道2。

在这里插入图片描述

当定时器设置为编码器接口时,定时器的计数器就不会由内外部时钟控制,而是由两个正交编码器信
号控制。另外,还可以根据选择的计数方式(TI1、TI2计数还是都计数)以及信号上下沿、电平高低的判断确定方向。
在这里插入图片描述
利用CUBMX配置编码器模式非常简单:

  • 1、设置相关参数
      1. 打开编码器模式(使用CH1、CH2两个通道)
      1. 设置定时器的相关参数。由于是检测速度,所以这里就不分频,尽可能让定时器快点。计数器 设置最大,防止输入信号频率太高溢出。
      1. 设置计数模式,TI1计数和TI2计数
      1. 设置信号不反向
        在这里插入图片描述
  • 2、main函数中打开定时器编码器模式
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
  • 3、显示计数值
    计数器CNT返回的是一个无符号的 uint32_t 数,因此如果希望反转能够显示负数,还需要将CNT值转换为有符号的 int16_t 数。
//得到计数值
int16_t CNT=__HAL_TIM_GET_COUNTER(&htim3);
  • 4、计算速度
    如果还希望计算编码器速度,那就秒钟读取一次定时器的计数值(编码器的脉冲)并清空,得到的数字就是当前的速度,单位是Plus/S
int16_t hhGetEncoderSpeedCountAndReset(){int16_t Speed;Speed=__HAL_TIM_GET_COUNTER(&htim3);__HAL_TIM_SET_COUNTER(&htim3,0);return Speed;
}

六、主从模式

请添加图片描述

根据定时器的时钟来源(或者说是否受到从模式控制器的控制),可以将定时器的工作状态分为主模式和从模式
首先,触发信号分两大类:触发输入信号TRGI,简单地讲就是从外部引入到本定时器的信号;另一类就是触发输出信号,即TRGO信号,它是定时器输出给其它定时器或外设的触发信号。

从数目上有讲一般可以多达8个,大致分为三类:
在这里插入图片描述

第一类来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作。 (TI1FP1 、 TI2FP2、TI1F_ED

第二类来自于外部触发脚ETR脚经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器 (ETRF

第三类来自其它定时器的触发输出信号TRGO,通过内部线路连接到本定时器的触发输入控制器而连接到从模式控制器。(ITR0、ITR1、ITR2、ITR3)

这3类信号有个共同特点:都要经过触发输入选择器而连接到从模式控制器,从而使得计数器的工作受到从模式控制器的控制或影响,基于这一点,定时器工作在从模式。而主模式:定时器内部信号映射到TRGO引脚用于触发别的外设。

七、定时器的4种从模式

  • 复位模式
  • 门控模式
  • 触发模式
  • 外部时钟模式2+触发模式
    在我看来从模式其实就是在正常使用定时器外再添加一个控制功能,根据实际的需要再配置即可。

复位模式

在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果TIMx_CR1寄存器的URS位为低,还会产生一个更新事件UEV;然后所有的预装载寄存器(TIMx_ARR,TIMx_CCRx)都会被更新。

例如TI1输入端的上升沿导致向上计数器被清零:计数器开始依据内部时钟计数,然后正常运转直到TI1出现一个上升沿;此时,计数器被清零然后从0重新开始计数。同时,触发标志(TIMx_SR寄存器中的TIF位)被设置,根据TIMx_DIER寄存器中TIE(中断使能)位和TDE(DMA使能)位的设置,产生一个中断请求或一个DMA请求。

门控模式

按照选中的输入端电平使能计数器。
例如下图,计数器只在TI1输入电平为低时计数+1
在这里插入图片描述

触发模式

按照输入端上选中的事件使能计数器。
例如下图,计数器在TI2输入的上升沿开始向上计数

在这里插入图片描述

外部时钟模式2+触发模式

外部时钟模式2可以与另一种从模式(外部时钟模式1和编码器模式除外)一起使用。
外部时钟模式2,ETR信号被用作外部时钟的输入,在复位模式、门控模式或触发模式时可以选择另一个输入作为触发输入。

例如下图,TI1输入上升沿使能计数器,然后在ETR信号每次的上升沿计数

在这里插入图片描述

八、其他

遇到查询数据手册即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/346807.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

针对AlGaN/GaN高电子迁移率晶体管的显式表面电势计算和紧凑电流模型

来源:An Explicit Surface Potential Calculation and Compact Current Model for AlGaN/GaN HEMTs(EDL 15年) 摘要 在本文中,我们提出了一种新的紧凑模型,用于基于费米能级和表面电位的显式解来描述AlGaN/GaN高电子迁移率晶体管。该模型计算…

函数计时的方法

1. console 对象 可以调⽤ console 对象的 time 和 timeEnd ⽅法来对⼀段程序进⾏时间计算。例如: function fib(n) {if (n 0) return;let a arguments[1] || 1;let b arguments[2] || 1;[a, b] [b, a b];fib(--n, a, b); } console.time(); // 记时开始 fib…

人工智能与能源约束的矛盾能否化解

以下文章来源:澎湃新闻 人工智能技术在台前展示的是比特世界的算力、算法和数据,但其“轻盈的灵魂”背后则是土地、能源和水等物理世界“沉重的肉身”。根据本文三种情境的模拟测算,未来人工智能发展需要可持续的巨量能源支撑,能源…

公用nacos,实现只调用本机相应服务,不出现负载均衡到别人机器上

当我们有两个研发同时在调试一个微服务模块时,你和对方本地都会启动服务,这就导致在nacos会同时注册两个实例。默认情况下请求这个服务,具体处理请求的程序会在你和对方之间来回轮询,即一下你的服务一下对方的服务。 其结果就导…

wordpress里面嵌入哔哩哔哩视频的方法

我们正常如果从blibli获取视频分享链接然后在wordpress里面视频URL插入,发现是播放不了的 而视频嵌入代码直接粘贴呢窗口又非常的小 非常的难受,就需要更改一下代码。你可以在在allowfullscreen"true"的后面,留1个空格&#xff…

直线度测量仪发展历程!

直线度测量仪的发展历程可以概括为以下几个关键阶段: 拉钢丝法: 早期直线度测量的简单直观方法,利用钢丝受重力自然下垂的原理来测量直线度误差。 随着机械设备的大型化和测量精度要求的提高,该方法逐渐无法满足要求,正…

yg校园易购电商系统(Go+Vue)

校园易购二手平台系统 GitHub项目地址:https://github.com/xzhHas/yg 文章目录 校园易购二手平台系统一、技术栈简介二、快速开始1、安装本系统使用到的插件,这里推荐使用docker安装,此操作皆在ubuntu系统下操作,如果是其他系统只…

回首二篇旧博客再看一篇新博客

交流 旧博客 https://www.zhihu.com/question/390894125 从2050回顾2020,职业规划与技术路径(节选) 行业发展好,与我能在这个行业找到工作是两回事; 同理,行业发展好,与我能在这个行业赚到钱…

从数据采集到部署,手把手带你训练一个高质量的图像分类模型

本文来自社区投稿,作者李剑锋 MMPreTrain 是一款基于 PyTorch 的开源深度学习预训练工具箱,本文将从数据采集到部署,手把手带大家使用 MMPreTrain 算法库训练一个高质量的图像分类模型。 MMPreTrain 项目链接: https://github.co…

易保全网络赋强公证系统,“公证赋强+科技赋能”双重增信

网络赋强公证系统是一种创新的法律服务模式,旨在通过线上方式赋予债权文书强制执行效力。具体来说,该系统结合了互联网技术与公证业务,允许公证机构根据当事人的申请,利用互联网公证技术手段对互联网上的债权文书进行公证&#xf…

移动端浏览器的扫描二维码实现(vue-qrcode-reader与jsQR方式)

1. 实现功能 类似扫一扫的功能,自动识别到画面中的二维码并进行识别,也可以选择从相册中上传。 2. 涉及到的一些插件介绍 vue-qrcode-reader 一组用于检测和解码二维码的Vue.js组件 jsQR 一个纯粹的javascript二维码阅读库,该库接收原始…

Activity->Activity中动态添加Fragment->add和replace方式添加的区别

XML文件 Activity布局文件R.layout.activity_main <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/root_ll"android:orientation"v…

操作系统期末复习(大题)

1. 进程调度 周转时间作业完成时刻-作业到达时刻 带权周转时间周转时间/服务时间 平均周转时间各个作业周转时间之和/作业个数 操作系统&#xff1a;周转时间和其他时间_系统为作业提供的时间-CSDN博客 2. 进程调度 3. 调度算法 4. 临界区互斥访问问题 即证明是否满足互斥&a…

mac环境基于llama3和metaGPT自动开发2048游戏

1.准备虚拟环境 conda create -n metagpt python3.9 && conda activate metagpt 2.安装metagpt pip install --upgrade metagpt 3.初始化配置文件 metagpt --init-config 4. 安装llama3 5. 修改配置文件 6.让metegpt自动开发2048游戏 7.经过多轮迭代&#xff0c;最终…

抖音 根据sec uid获取个人详细信息(性别、年龄、属地、关注数、粉丝数、简介等)

本文带来用户的secuid获取用户信息以及其他基本信息&#xff1a; 话不多说看效果&#xff1a; 第一步输入用户sec_uid 根据secuid获取到用户基本信息&#xff1a; 可以支持接口批量转换&#xff0c;欢迎咨询

国内著名的四个“大模型”

关于您提到的国内四大模型&#xff0c;这里为您详细介绍&#xff1a; 文心大模型&#xff1a;文心大模型是百度自主研发的产业级知识增强大模型。它以创新性的知识增强技术为核心&#xff0c;从单模态大模型发展到跨模态&#xff0c;从通用基础大模型到跨领域、跨行业&#xff…

05 Linux 内核启动流程

1、阅读 Linux 内核源码 学习 Linux 有两种路线&#xff1a; 1&#xff09;按照 Linux 启动流程&#xff0c;梳理每个子系统。 2&#xff09;把 Linux 所有用到的子系统学会&#xff0c;再组合起来。 博主选择第一种方式&#xff0c;可以快速上手&#xff0c;知道自己在学什…

5.mongodb 备份与恢复

mongodb备份工具介绍&#xff1a; 1.mongoexport(备份)/mongoimport(恢复) mongoexport是MongoDB提供的一个工具&#xff0c;用于将数据从MongoDB实例导出到JSON或CSV格式的文件中&#xff0c;这个工具对于数据迁移、数据备份或者在不同的数据库之间同步数据非常有用 2.mongodu…

鱼泡-伙伴匹配系统

第一次直播 项目介绍 帮助找到志同道合的伙伴 需求分析 标签分类 主动搜索 组队 创建队伍加入队伍根据标签查询队伍 前端项目初始化 项目初始化文件夹中一定不要带空格&#xff01; 使用npm&#xff08;node包管理器&#xff09;来安装 Vite 脚手架&#xff1a; vue cl…

USB (5)

USB是一个poll的总线。并且数据传输是对齐到time-line的。 对于比如鼠标这样的设备&#xff0c;主机会最快125us poll一次&#xff0c;看是否有输入。这也就是interrupt transfer类型。 对于isochronous transfer类型&#xff0c;数据是在固定的时隙传输的&#xff0c;但不保证…