【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信号每次的上升沿计数

在这里插入图片描述

八、其他

遇到查询数据手册即可

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 编辑器扩展 一键替换指定物体下的所有材质球

先看效果 实现方案 1:创建几个用于测试的Cube 2:创建一个脚本 3:编写脚本内容 主要是这部分的逻辑 附上完整代码 using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class Tool {[MenuItem(…

20240607每日通信--------VUE3前端引入scoket-io,后端引入Netty-SocketIO,我成功了,希望一起交流沟通

无语 前置: VUE3 前端集成scoket-io socket.io-client Sringboot 3.0JDK17集成Netty-SocketIO Netty-SocketIO 失败原因一: 前期决定要写demo时候,单独了解了,后端引入Netty-SocketIO注意事项,详见我先头写的博客 前…

【因果推断python】24_倾向得分2

目录 倾向加权 倾向得分估计 倾向加权 好的,我们得到了倾向得分。怎么办?就像我说过的,我们需要做的就是以此为条件。例如,我们可以运行一个线性回归,它仅以倾向得分为条件,而不是所有的 X。现在&#xff…

什么是虚拟局域网?快解析有哪些的虚拟化应用功能?

什么是虚拟局域网?从字面上理解就是不是真实存在的局域网。虚拟局域网是将网络用户和设备集中在一起,从而可以对不同地域和商业的需要有一定的支持性。虚拟局域网有它的优点,在使用过程中可以为企业提供更安全、更稳定、更灵活的服务保障体系…

详细分析Mysql中的JSON_OBJECT() 基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于基本的命令行以及优化推荐阅读: 数据库中增删改常用语法语句(全)Mysql优化高级篇(全)命令行登录Mysql的详细讲解 1. 基本知识 JSON_OBJECT() 是 MySQL 中用于生成 JSON 对象…

React实现在线预览word报告/本地选择报告预览

标题使用的核心技术点是docx-preview,读取到文件的File对象,用File去做文件展示,这里是才用将文件转base64字符串存储到localStorage中 在线预览word报告且包含word样式 下载需要使用的min.js文件进项目的public目录中(上zip已包…

html--party网页制作

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>fo安方party</title><style>body {f…

【PythonCode】力扣Leetcode21~25题Python版

【PythonCode】力扣Leetcode21~25题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C…

【CS.CN】优化HTTP传输:揭示Transfer-Encoding: chunked的奥秘与应用

文章目录 0 序言0.1 由来0.2 使用场景 1 Transfer-Encoding: chunked的机制2 语法 && 通过设置Transfer-Encoding: chunked优化性能3 总结References 0 序言 0.1 由来 Transfer-Encoding头部字段在HTTP/1.1中被引入&#xff0c;用于指示数据传输过程中使用的编码方式…

OlSoul系统调校程序v2024.06.05

软件介绍 OlSoul是一款能够适配用于Win各个系统的系统调校软件&#xff0c;OlSoul内置有众多调校功能可以直接使用&#xff0c;如有启用无线网络功能、启用打印机功能、系统快速休眠与休眠开关、快捷方式小箭头去除功能等&#xff0c;具体的调校功能多达几十项&#xff0c;可自…

vsCode双击文件才能打开文件,单击文件只能预览?

解决&#xff1a; 1、打开设置 2、搜索workbench.editor.enablePreview 3、更改为不勾选状态 4、关闭设置 效果&#xff1a; 现在单击一个文件时&#xff0c;将会在编辑器中直接打开&#xff0c;而非是预览状态。

51单片机-实机演示(LED点阵)

目录 前言: 一.线位置 二.扩展 三.总结 前言: 这是一篇关于51单片机实机LED点阵的插线图和代码说明.另外还有一篇我写的仿真的连接在这:http://t.csdnimg.cn/ZNLCl,欢迎大家的点赞,评论,关注. 一.线位置 接线实机图. 引脚位置注意: 1. *-* P00->RE8 P01->RE7 …

多源最短路径算法–Floyd算法

多源最短路径算法–Floyd算法 Floyd算法是为了求出每一对顶点之间的最短路径 它使用了动态规划的思想&#xff0c;将问题的求解分为了多个阶段 先来个例子&#xff0c;这是个有向图 Floyd算法的运行需要两个矩阵 最短路径矩阵 从当前这个状态看各顶点间的最短路径长度 例…

网络编程: 高级IO与多路转接select,poll,epoll的使用与介绍

网络编程: 高级IO与多路转接select,poll,epoll的使用与介绍 前言一.五种IO模型1.IO的本质2.五种IO模型1.五种IO模型2.同步IO与异步IO3.IO效率 二.非阻塞IO1.系统调用介绍2.验证代码 三.select多路转接1.系统调用接口2.写代码 : 基于select的TCP服务器1.封装的Socket接口2.开始写…

攻防世界---misc---Hear-with-your-Eyes

1、题目描述&#xff0c;下载附件&#xff0c;是一个.gz后缀的文件&#xff0c;查找资料发现&#xff0c;这个后缀是Linux系统的压缩包后缀。这里题目提示了用眼睛听音频&#xff0c;说明会有个音频&#xff0c;并且信息就在音频&#xff0c;可以用眼睛看到 2、将文件放在linux…

读书笔记-《软件定义安全》之二:SDN/NFV环境中的安全问题

第2章 SDN/NFV环境中的安全问题 1.架构安全 SDN强调了控制平面的集中化&#xff0c;从架构上颠覆了原有的网络管理&#xff0c;所以SDN的架构安全就是首先要解决的问题。例如&#xff0c;SDN实现中网络控制器相关的安全问题。 1.1 SDN架构的安全综述 从网络安全的角度&…

C++面向对象程序设计 - 文件操作与文件流

在实际应用中&#xff0c;常以磁盘文件作为对象&#xff0c;即能从磁盘文件读取数据&#xff0c;也能将数据输出到磁盘文件&#xff0c;磁盘是计算机的外部存储器&#xff0c;能够长期保留信息&#xff0c;能读能写&#xff0c;可以刷新重写等等。 在C中&#xff0c;文件操作通…

【Java】Java18的新特性

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

第四篇红队笔记-百靶精讲之Prime-wfuzz-wpscan-openssl enc

靶机Prime渗透 主机发现 nmap扫描与分析 目录爆破与模糊测试 dirb 目录扫描 dev secret.txt wfuzz发现 file参数 根据secret.txt-location.txt 和 file参数结合 secrettier360 根据filelocation.txt得到的on some other php page&#xff08;改用之前扫到image.p…

mqtt-emqx:设置遗嘱消息

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>org.eclipse…