【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、打开并设置基本定时器
-
- 选择为内部时钟,即内部时钟模式
-
- 设置以下参数:定时器的时钟频率
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(驱动舵机、电机、呼吸灯)
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,Speed); //设置CCR值控制占空比
五 、输入捕获
输入捕获模式下,当通道输入引脚出现指定电平跳变时(类似于中断),当前CNT
的值将被锁存到CCR
中,可用于测量PWM
波形的频率、占空比、脉冲间隔、电平持续时间等参数。
可配置为PWMI
模式(不清楚没关系),同时测量频率和占空比;也可配合主从触发模式`(下文中从模式的复位模式),实现硬件全自动测量(触发输入实现定时器的自动清零)。
对于同一个定时器,输入捕获和输出比较只能同时用一个。
输入捕获
:将CNT的
值写到CCR
输出比较
:根据CNT
和CCR
的比较后输出
输入捕获测频率、测占空比
从模式-复位模式下,上升沿触发,因此上升沿来临时,计数器CNT
的值存进了CCR1
中然后自动清零;下降沿来临时,CNT
的值存进了CCR2
中,并未清零。然后可以计算频率(用CCR1
)和占空比(用CCR1和CCR2
)。
HAL库实现输入测频率、占空比
- 1、TIM2生成PWM待测信号、启动
- 2、设置TIM3定时器相关参数
通道1
用于测频率-
- 设置
TI1FP1
为ResetMode
,即清空计数
- 设置
-
- 使用内部时钟
-
- 通道1设置为输入捕获模式
-
- 设置预分频器为72
-
- 自动重装寄存器为65535
-
- 输入捕获上升沿
通道2
用于测占空比-
- 打开通道2为
交叉模式
、设置下降沿触发
- 打开通道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、设置相关参数
-
- 打开编码器模式(使用
CH1、CH2
两个通道)
- 打开编码器模式(使用
-
- 设置定时器的相关参数。由于是检测速度,所以这里就不分频,尽可能让定时器快点。计数器 设置最大,防止输入信号频率太高溢出。
-
- 设置计数模式,
TI1
计数和TI2
计数
- 设置计数模式,
-
- 设置信号不反向
- 设置信号不反向
-
- 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
信号每次的上升沿计数
八、其他
遇到查询数据手册即可
相关文章:
【STM32HAL库学习】定时器功能、时钟以及各种模式理解
一、文章目的 记录自己从学习了定时器理论->代码实现使用定时->查询数据手册,加深了对定时器的理解以及该过程遇到了的一些不清楚的知识。 上图为参考手册里通用定时器框图,关于定时器各种情况的工作都在上面了,在理论学习和实际应用后…...
3588麒麟系统硬解码实战
目录 安装rockchip-mpp deb 查找头文件 .pro文件添加 检查库是否已安装 error: stdlib.h: No such file or directory ffmpeg 查找ffmpeg路径: 查找FFmpeg库和头文件的位置 使用pkg-config工具查找FFmpeg路径 ok的ffmpeg配置: ffmpeg查看是否支持libx264 ffmpeg …...
十二 nginx中location重写和匹配规则
十二 location匹配规则 ^~ ~ ~* !~ !~* /a / 内部服务跳转 十三 nginx地址重写rewrite if rewrite set return 13.1 if 应用环境 server location -x 文件是否可执行 $args $document_rot $host $limit_rate $remote_addr $server_name $document_uri if …...
python的视频处理FFmpeg库使用
FFmpeg 是一个强大的多媒体处理工具,用于录制、转换和流式传输音频和视频。它支持几乎所有的音频和视频格式,并且可以在各种平台上运行。FFmpeg 在 Python 中的使用可以通过调用其命令行工具或使用专门的库如 ffmpeg-python。以下是详细介绍如何在 Python 中使用 FFmpeg,包括…...
接口测试时, 数据Mock为何如此重要?
一、为什么要mock 工作中遇到以下问题,我们可以使用mock解决: 1、无法控制第三方系统某接口的返回,返回的数据不满足要求 2、某依赖系统还未开发完成,就需要对被测系统进行测试 3、有些系统不支持重复请求,或有访问…...
未授权与绕过漏洞
1、Laravel Framework 11 - Credential Leakage(CVE-2024-29291)认证泄漏 导航这个路径storage/logs/laravel.log搜索以下信息: PDO->__construct(mysql:host 2、 Flowise 1.6.5 - Authentication Bypass(CVE-2024-31621&am…...
云原生周刊:Kubernetes 十周年 | 2024.6.11
开源项目推荐 Kubernetes Goat Kubernetes Goat 是一个故意设计成有漏洞的 Kubernetes 集群环境,旨在通过交互式实践场地来学习并练习 Kubernetes 安全性。 kube-state-metrics (KSM) kube-state-metrics 是一个用于收集 Kubernetes 集群状态信息的开源项目&…...
ClickHouse内幕(1)数据存储与过滤机制
本文主要讲述ClickHouse中的数据存储结构,包括文件组织结构和索引结构,以及建立在其基础上的数据过滤机制,从Part裁剪到Mark裁剪,最后到基于SIMD的行过滤机制。 数据过滤机制实质上是构建在数据存储格式之上的算法,所…...
1.Mongodb 介绍及部署
MongoDB 是一个开源的文档导向数据库,采用NoSQL(非关系型数据库)的设计理念。MongoDB是一个基于分布式文件存储的数据库。 分布式文件存储是一种将文件数据分布式的存储在多台计算机上。MongoDB是一款强大的文档导向数据库,适合处…...
Java 技巧:如何获取字符串中最后一个英文逗号后面的内容
在日常的Java编程中,处理字符串是非常常见的任务之一。有时我们需要从一个字符串中截取特定部分,例如获取最后一个英文逗号后的内容。这篇文章将详细介绍如何使用Java来实现这一需求,并提供一个示例代码来演示其实现过程。 需求分析 假设我们…...
玩转微服务-GateWay
目录 一. 背景二. API网关1. 概念2. API网关定义3. API网关的四大职能4. API网关分类5. 开源API网关介绍6. 开源网关的选择 三. Spring Cloud Gateway1. 文档地址2. 三个核心概念3. 工作流程4. 运行原理4.1 路由原理4.2 RouteLocator 5. Predicate 断言6. 过滤器 Filter6.1. 过…...
Amortized bootstrapping via Automorphisms
参考文献: [MS18] Micciancio D, Sorrell J. Ring packing and amortized FHEW bootstrapping. ICALP 2018: 100:1-100:14.[GPV23] Guimares A, Pereira H V L, Van Leeuwen B. Amortized bootstrapping revisited: Simpler, asymptotically-faster, implemented. …...
【人工智能】ChatGPT基本工作原理
ChatGPT 是由 OpenAI 开发的一种基于深度学习技术的自然语言处理模型,它使用了名为 GPT(Generative Pre-trained Transformer)的架构。GPT 模型是一种基于 Transformer 架构的预训练语言模型,它通过大量的文本数据进行预训练&…...
The First项目报告:Stargate Finance重塑跨链金融的未来
Stargate Finance是一个基于LayerZero协议的去中心化金融平台,自2022年3月由LayerZero Labs创建以来,一直致力于为不同区块链之间的资产转移提供高效、低成本的解决方案。凭借其独特的跨链技术和丰富的DeFi服务,Stargate Finance已成为连接不…...
Python魔法之旅-魔法方法(22)
目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…...
公司面试题总结(三)
13.说说你对 BOM 的理解,常见的 BOM 对象你了解哪些? BOM (Browser Object Model),浏览器对象模型, ⚫ 提供了独立于内容与浏览器窗口进行交互的对象 ⚫ 其作用就是跟浏览器做一些交互效果 ⚫ 比如如何进行页面的后退&…...
PLSQL 报错 could not locate oci.dll
0、确保PLSQL已激活。 1、在PLSQL安装包内搜索oci.dll,如果没有搜到需要下载 链接:https://pan.baidu.com/s/1HOfKAEFfuAGYACjfcwqJ1g 提取码:6evh 2、打开PLSQL,设置oci.dll的路径 ps:PLSQL安装包 链接ÿ…...
【方案+源码】智慧园区建设方案
智慧园区一体化运营管理平台建设方案旨在通过集成先进的信息技术,实现园区的智能化、高效化、绿色化管理。该平台整合了物联网、大数据、云计算等技术,为园区提供全方位、一体化的运营服务。 方案包括智能监控、能源管理、安防系统、停车管理、物业管理等…...
Java操作数据库 —— JDBC ① 基础篇
我走我的路,有人拦也走,没人陪也走 —— 24.6.7 JDBC JDBC就是使用Java语言操作关系型数据库的一套API 一、JDBC简介 JDBC 概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称:(Java DataBase Connectivity)意为Java 数据库连接 JDBC 本质: ①…...
webpack和vite区别
一、Webpack 1. 概述 Webpack 是一个模块打包工具,它会递归地构建依赖关系图,并将所有模块打包成一个或多个bundle(包)。 2. 特点 配置灵活:Webpack提供了高度可定制的配置文件,可以根据项目需求进行各…...
FL Studio21永久免费破解中文版下载,让我这个音乐制作爱好者如获至宝!
FL Studio21永久免费破解中文版下载,让我这个音乐制作爱好者如获至宝!🎶 这款软件功能强大,操作简单易上手。我可以轻松地创作出各种风格的音乐作品。无论是流行、摇滚还是电子音乐,都能轻松驾驭。🎧 使用F…...
vue3 监听器,组合式API的watch用法
watch函数 在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数 watch(ref,callback(newValue,oldValue),option:{}) ref:被监听的响应式量,可以是一个 ref (包括计算属性)、一个响应式…...
苹果WWDC开幕发布AI大模型,股价却跌近2%
KlipC报道:北京时间6月11日凌晨,苹果一年一度的“全球开发者大会”(WWDC)开幕。会上,先后介绍了iOS 18、iPadOS 18、watchOS 11等系统的更新,同时还展示了多个AI功能。宣布与OpenAI构建合作伙伴关系。然而&…...
C++ 11 【可变参数模板】【lambda】
💓博主CSDN主页:麻辣韭菜💓 ⏩专栏分类:C修炼之路⏪ 🚚代码仓库:C高阶🚚 🌹关注我🫵带你学习更多C知识 🔝🔝 目录 前言 一、新的类功能 1.1默认成员函数—…...
c 宏应用举例
1.概要 #include <iostream> //变量可以直接使用 #define fun() a 100; //用变量计算可以 #define fun2(a) a*2; //用变量替换可以 #define fun3(a) d[a] a; //##链接的作用,一般用于链接变量名 #define fun4(type,name) type name##_s 4; //#的作用是转换…...
微信公众号(公众平台) 和 微信开放平台的scope的差异
微信公众号(公众平台) 和 微信开放平台 是两码事。 公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知;后者是需要用户确认同意的。…...
基于pytorch实现的DenseUnet医学图像分割(腹部多脏器)
1、前言 本章将介绍将densenet的主干网络引入unet中 官方实现的代码:kits19-challenge/network at master nitsaick/kits19-challenge (github.com) 本章实现的项目目录如下: 主要代码有train、evaluate、predict脚本 2、代码介绍 数据预处理脚本 数据…...
富格林:正规策划实现安全做单
富格林悉知,在投资理财的过程中,最重要的是控制风险实现安全做单避免损失。但是市场客观因素带来的风险并不能完全避免,因此投资者需要采取一些正规技能来减低风险投资风险实现安全做单。接下来就由富格林给大家分享一些实现安全做单的正规方…...
02. 异常捕捉和处理
检索特定内容的邮件,当检索失败,就会在终端输出“获取不了值” try: #代码块A except: #代码B 试一下运行代码A,当代码A报错时,执行代码B 这是main_exe.py文件中的内容 略过 #今天 for job_name,end_time in zip(bji.job_inf…...
Oracle和mysql中插入时间字段
例如有id 和 times两个字段 Oracle insert into xxx values|(1,sysdate) mysql insert into xxx values(1,now()) 在 MySQL 中,SYSDATE() 函数也是可用的,它与 NOW() 类似,但略有不同: NOW…...
河南省工程建设信息网官网入口/开封网站快速排名优化
地址:http://poj.org/problem?id2486 题意:有一颗苹果树,每个节点上面有很多苹果,从一个节点到另外一个可以到达的节点花费1步,求k步最多能吃到多少苹果。 mark:这是典型的回溯型树状dp。dp[i][j][0]代表以…...
做seo网站 公司/淘宝运营主要做些什么
今天编写C程序在使用头文件#include<cstring>中的strcpy()和strcat()函数时出现了一个错误:error C4996: strcpy: This function or variable may be unsafe. Consider using strcpy_s instead.在网上搜了一下大概知道怎么解决了,并且知道为什么出…...
wordpress 媒体管理/中国seo排行榜
目录 0函数对象 实际应用介绍 函数对象超出了普通函数概念,内部可以保持状态 函数对象作为参数传递 1谓词 一元谓词举例: 二元谓词举例: 2内建函数 0函数对象 重载函数调用操作符的类,其对象常被称为函数对象(…...
国家电力安全网站两学一做/微信小程序平台官网
一、数据仓库分为几层?负责什么职责?为什么要分层?1、数据仓库分为4层: ODS层 (原始数据层) DWD层 (明细数据层) DWS层 (服务数据层)ADS层 (数据应…...
做家具有那个网站好/外链网盘
GBase 8c 数据库支持版本升级。 语法如下: pg_upgrade -b oldbindir -B newbindir -d olddatadir -D newdatadir [option...] 描述: pg_upgrade允许存储在GBase 8c数据文件中的数据被升级到一个较新的版本。 GBase 8c发行通常会加入新的特性&#x…...
如何选择wordpress主机/强强seo博客
2019独角兽企业重金招聘Python工程师标准>>> 什么是Shell脚本? Shell脚本(英语Shellscript)是一种电脑程序与文本文件内容由一连串的shell命令组成经由UnixShell直译其内容后运作被当成是一种脚本语言来设计其运作方式与直译语言相…...