单片机-STM32部分:9、定时器

飞书文档https://x509p6c8to.feishu.cn/wiki/A749wx8T0ioqfgkzZKlc9poknUf

SMT32F1系列共有8个定时器:

  • 基本定时器(TIM6TIM7
  • 通用定时器(TIM2TIM3TIM4TIM5
  • 高级定时器(TIM1TIM8

高级定时器(TIM1TIM8)的主要功能:

通用定时器(TIM2~TIM5)的主要功能:

基本定时器功能(TIM6TIM7):

功能对比

定时器种类位数计数器模式捕获/比较通道互补输出特殊应用场景
高级定时器16向上,向下,中心对齐4定时计数,DAC/ADC时钟、PWM输出,输入捕获,输出比较,带可编程死区的互补输出
通用定时器16向上,向下,中心对齐4定时计数,DAC/ADC时钟、PWM输出,输入捕获,输出比较
基本定时器16向上0定时计数,DAC时钟

基本定时器框图说明

基础定时器只有定时功能,使用基础定时器进行定时的工作流程如下:
1、控制器除了控制定时器复位、使能、计数等功能之外,还可以用于触发DAC转换。
2、内部时钟信号CK_INT经过控制器后成为CK_PSC进入预分频器,CK_INT和CK_PSC在频率上相等
3、预分频器对CK_PSC时钟信号进行分频,输出 CK_CNT是分频后的时钟
4、计数器对时钟信号CK_CNT从0开始计数,自动重装载寄存器存储一个值。当计数器的值达到改值时就产生U事件,然后计数器归零又重新开始计数。
5、开启定时器全局中断和U事件中断后,在发生计数溢出时产生U事件中断,利用中断进行定时处理。

定时器配置的一些参数

虽然有3类定时器但,不管怎样,只要是配置作为定时器,那么便总是与基本定时器是类似的。

在下文配置的时候要注意:我们配置的是进入定时器中断的频率,然后要定的时间要跟据这个频率来定时的。

Prescaler(PSC): 定时器预分频设置,16位,设置 0~65535 以达到 1 至 65536 的分频。

Counter Mode : 定时器的计数方式,基本定时器只能向上(UP)计数

定时器有如下3种计数模式:

  • 递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
  • 递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
  • 中心对齐模式:也叫 向上向下计数,计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。

Counter Period : 定时器周期,16位,设置 0~65535 以达到 1 至 65536 的周期。每当定时器达到 设定值时,置位。

InternalCLock Division(CKD): 内部时钟分频因子,指设置定时器时钟频率与数字滤波器使用的采样频率之间的分频比例的(与输入捕获相关)。

Auto-reload preload :自动重载。一般每次触发以后需要重新填充。

Disable:自动重装载寄存器写入新值后,计数器立即产生计数溢出,然后开始新的计数周期
Enable:自动重装载寄存器写入新值后,计数器完成当前旧的计数后,再开始新的计数周期

Trigger Output Parameters : 触发输出 (TRGO) ,当定时器的定时时间到达的时候输出一个信号(如:定时器更新产生TRGO信号来触发ADC的同步转换)

Repetition Counter:重复计数器(RCR -8 bits),属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出 PWM 的个数。

Master/Slave Mode(MSM bit) :主从模式

定时器一般是通过软件设置而启动,STM32的每个定时器也可以通过外部信号触发而启动,还可以通过另外一个定时器的某一个条件被触发而启动。这里所谓某一个条件可以是定时到时间、定时器超时、比较成功等许多条件。

这种通过一个定时器触发另一个定时器的工作方式称为定时器的同步,发出触发信号的定时器工作于主模式,接受触发信号而启动的定时器工作于从模式。

定时器的四种主从机模式:外部触发模式1IRC重置模式、门控模式、触发模式。

基本定时器的使用:

创建工程,设置SWD调试,HSE时钟,系统时钟为72MHz

然后打开Timers配置TIM6,设置为Activated激活定时器

Activated:
激活TIM6,把前面的方框选中局表示激活了TIM6

One Pulse Mode
只会计数到预设的值时产生一个脉冲输出信号,而不是周期性的信号输出。产生一个脉冲信号后,然后计数器会停止计数。这种模式通常用于需要生成单个脉冲信号的应用场景,例如PWM控制、测量脉冲宽度等。在STM32F103系列中,定时器的One Pulse Mode可以通过设置TIM_CR1寄存器中的OPM位来实现。


 

然后如何设置定时器的定时时间呢?首先我们要知道定时器的时钟来自哪里?

从芯片手册的时钟树中可以知道,STM32F103定时器的时钟源:

TIM1、TIM8:来自APB2总线上的TIMxCLK

TIM2到TIM7:来自APB1总线上的TIMxCLK

所以TIM6的APB1时钟是72MHz。

Counter Setting:计数设置
Prescaler(PSC -16 bits value):预分频器
简写PSC,16位,可设置的值范围是0--65535。在STM32F103中,计数器的时钟源可以是内部时钟源或外部时钟源。当使用内部时钟源时,PSC可以将时钟信号频率除以一个固定的分频系数,以降低计数器的时钟频率,从而扩大计数器的计时范围。
例如,如果使用内部时钟源,并将PSC设置为7199,
则定时器的时钟频率将为72 MHz / (7199 + 1) = 10 kHz。
这意味着计数器每计数10次,就会过去1毫秒。如果需要更长的计时范围,可以将PSC设置为更大的值。

Counter Mode计数模式
基本定时器TIM6只能向上计数(UP)。

Counter Period(Auto Reload Register - 16 bit value):计数周期
Auto Reload寄存器用于设置定时器的计数周期。当定时器的计数器达到ARR的值时,定时器会自动重新加载ARR的值并继续计数。这样可以实现定时器的周期性计数,从而实现定时和计时的功能。

Auto-Reload Preload:自动重载预装载使能。
自动重载预装载功能是用来控制定时器计数器的自动重装载和预装载的。

Trigger Output(TRGO)Parameter:触发器输出参数
当一个定时器的计数器计数到预设值时,就会产生一个触发输出,可以将该输出信号连接到其他定时器或外设的启动输入端,以实现多个定时器或外设同步工作(如:定时器更新产生TRGO信号来触发ADC的同步转换)。

TIM_TRGO_RESET-复位 – 使用TIMx_EGR寄存器的UG位作为触发输出(TRGO)。例如:溢出时会设置UG为1,计数器重新从0开始计数。
TIM_TRGO_ENABLE-使能 – 计数器使能信号CNT_EN被用作为触发输出(TRGO)。例如:可用于在同一时刻启动多个定时器,或控制使能从定时器的时机。
TIM_TRGO_UPDATE-更新 – 更新事件被用作为触发输出(TRGO),例如:事件用于触发ADC的同步转换。

如果想要使其50ms触发一次定时中断,可以把72MHz通过7200分频后,使其速度降为10KHz,也就意味着每计数10次需要1ms,那么50ms就需要计数500次。因为是从0为第一位开始计数,所以参数都需要减一。

72000000Hz/7200 = 10000Hz = 10KHz = 1s 10000次 = 1ms 10次

也可以通过公式计算
Tout= ((PSC+1)*(Period+1))/Tclk
Tclk:TIM的输入时钟频率(单位为hz)。
Tout:TIM的溢出时间(单位为s)。
PSC: 分频 7199
Period:计数周期 499
50ms=0.05s=((7200)*(500))/72000000Hz

然后设置定时器中断

关于中断优先级,在实际工程项目中,根据具体业务需要,当中断过多时,才需要设置中断优先级,测试工程无需设置。

同时,为了方便查看效果,添加LPA6为LED1

点击生成代码

main.c
void MX_TIM6_Init(void)
{TIM_MasterConfigTypeDef sMasterConfig = {0};htim6.Instance = TIM6;htim6.Init.Prescaler = 7200-1;htim6.Init.CounterMode = TIM_COUNTERMODE_UP;htim6.Init.Period = 500-1;htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;if (HAL_TIM_Base_Init(&htim6) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK){Error_Handler();}
}stm32f1xx_it.c
/*** @brief This function handles TIM6 global interrupt.*/
void TIM6_IRQHandler(void)
{HAL_TIM_IRQHandler(&htim6);
}进入HAL_TIM_IRQHandler(&htim6)函数,这里面的代码很长,就是不同的中断类型,进入不同的中断回调函数,这里找到HAL_TIM_PeriodElapsedCallback(htim);
进入这个回调函数,我们看到是个虚函数,需要我们重写,在main.c中添加。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){  if(htim == &htim6)  //判断中断是否来自于定时器6{//do something//例如:HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);  //翻转LED灯的状态//可以把500-1改为5000-1设置500ms的定时中断}
}最后,需要启动定时器,需要在main函数里使能中断/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim6);/* USER CODE END 2 */

同理,其它定时器的定时器中断可以通过同样的方式设置

记得设置完参数后,打开中断哦,否则将不会产生中断。

基本定时器

高级定时器

然后代码中也要手动启动定时器

  main.c/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim6)/* USER CODE END 2 */

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

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

相关文章

uniapp-商城-51-后台 商家信息(logo处理)

前面对页面基本进行了梳理和说明,特别是对验证规则进行了阐述,并对自定义规则的兼容性进行了特别补充,应该说是干货满满。不知道有没有小伙伴已经消化了。 下面我们继续前进,说说页面上的logo上传组件,主要就是uni-fil…

ideal创建Springboot项目(Maven,yml)

以下是使用 IntelliJ IDEA 创建基于 Maven 的 Spring Boot 项目并使用 YAML 配置文件的详细步骤: 一、创建 Spring Boot 项目 启动项目创建向导 打开 IntelliJ IDEA,点击“File”->“New”->“Project”。 在弹出的“New Project”窗口中&#…

MATLAB中矩阵和数组的区别

文章目录 前言环境配置1. 数据结构本质2. 运算规则(1)基本运算(2)特殊运算 3. 函数与操作4. 高维支持5. 创建方式 前言 在 MATLAB 中,矩阵(Matrix) 和 数组(Array) 的概…

iTwin 数据报表(只是简单的原型不代表实现)

大概想法是 前端从schema和class中选中感兴趣的property内容生成ecsql语句传递给后端后端解析ecsql并提供公开接口给各个分析工具,如excel,poewerBI等(Odata或者直接选择来自网站)再由分析工具做进一步的处 还未想好的点 如何存…

Spring AI 系列——使用大模型对文本内容分类归纳并标签化输出

原理概述 利用大语言模型(LLM)实现文本分类,核心思想是通过预训练模型理解输入文本的语义,并将其映射到预先定义好的分类标签。在这个过程中,我们借助 Spring AI Alibaba 提供的能力,使用阿里云 DashScope…

LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?

文章目录 摘要描述题解答案题解代码分析编码方法解码方法 示例测试及结果时间复杂度空间复杂度总结 摘要 在分布式系统中,数据的序列化与反序列化是常见的需求,尤其是在网络传输、数据存储等场景中。LeetCode 第 271 题“字符串的编码与解码”要求我们设…

GitHub打开缓慢甚至失败的解决办法

在C:\Windows\System32\drivers\etc的hosts中增加如下内容: 20.205.243.166 github.com 199.59.149.236 github.global.ssl.fastly.net185.199.109.153 http://assets-cdn.github.com 185.199.108.153 http://assets-cdn.github.com 185.199.110.153 http://asset…

重生之我在2024学Fine-tuning

一、Fine-tuning(微调)概述 Fine-tuning(微调)是机器学习和深度学习中的一个重要概念,特别是在预训练模型的应用上。它指的是在模型已经通过大量数据训练得到一个通用的预训练模型后,再针对特定的任务或数据…

计算机网络 4-2-1 网络层(IPv4)

2 IPv4分组 各协议之间的关系 IP协议(Internet Protocol, 网际协议)是互联网的核心&#xff01; ARP协议用于查询同一网络中的<主机IP地址&#xff0c;MAC地址>之间的映射关系 ICMP协议用于网络层实体之间相互通知“异常事件” IGMP协议用于实现IP组播 2.1 结构<首…

Docker中运行的Chrome崩溃问题解决

问题 各位看官是否在 Docker 容器中的 Linux 桌面环境&#xff08;如Xfce&#xff09;上启动Chrome &#xff0c;遇到了令人沮丧的频繁崩溃问题&#xff1f;尤其是在打开包含图片、视频的网页&#xff0c;或者进行一些稍复杂的操作时&#xff0c;窗口突然消失&#xff1f;如果…

K8S cgroups详解

以下是 Kubernetes 中 cgroups&#xff08;Control Groups&#xff09; 的详细解析&#xff0c;涵盖其核心原理、在 Kubernetes 中的具体应用及实践操作&#xff1a; 一、cgroups 基础概念 1. 是什么&#xff1f; cgroups 是 Linux 内核提供的 资源隔离与控制机制&#xff0c…

javaer快速从idea转战vscode

插件安装列表 在插市场安装下面插件 Extension Pack for JavaSpring Boot Tools 配置文件提示Database Client Database/No-SQL管理工具httpYac - Rest Client .http文件编辑、API测试工具 https://httpyac.github.io/guide/request.htmlGit Graph 图形化Git工具XML by Red H…

[项目总结] 抽奖系统项目技术应用总结

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【赵渝强老师】TiDB SQL层的工作机制

TiDB节点的SQL层&#xff0c;即TiDB Server&#xff0c;它负责将SQL翻译成Key-Value操作&#xff0c;将其转发给共用的分布式Key-Value存储层TiKV&#xff0c;然后组装TiKV返回的结果&#xff0c;最终将查询结果返回给客户端。这一层的节点都是无状态的&#xff0c;节点本身并不…

性能远超SAM系模型,苏黎世大学等开发通用3D血管分割基础模型

如果把人的身体比作一座庞大的城市&#xff0c;那么血管无疑就是这座城市的「道路」&#xff0c;动脉、静脉以及毛细血管对应着高速公路、城市道路以及乡间小道&#xff0c;它们相互协作&#xff0c;通过血液将营养物质、氧气等输送到身体各处&#xff0c;从而维持着这座「城市…

git高效杀器——cz-customizable 搭配 commitlint

What is cz-customizable and commitlint? cz-customizable 一款可定制化的Commitizen插件(也可作为独立工具),旨在帮助创建如约定式提交规范的一致性提交消息。commitlint commitlint 是一个用于检查 Git 提交信息的工具,它可以帮助开发者保持提交信息的规范性和一致性。…

Spark 中RDD、Job,stage,task的关系

目录 1. 概念定义1.1 Job1.2 Stage1.3 Task 2. 关系总结3. 示例分析代码示例执行过程 4. Spark中的运行流程5. 关键点5.1 宽依赖和窄依赖5.2 并行度5.3 性能优化 **6. 总结****1. RDD的核心作用****1.1 什么是RDD&#xff1f;****1.2 RDD与Job、Stage、Task的关系** **2. Job、…

Kubernetes基础(三十二):Worker节点启动全解析

Worker节点是Kubernetes集群的"肌肉"&#xff0c;负责实际运行业务负载。本文将深入剖析Worker节点的完整启动流程&#xff0c;并揭秘生产环境中的关键优化点。 一、启动流程全景图 二、核心启动阶段详解 1. 系统初始化&#xff08;0-30秒&#xff09; 关键任务&a…

matlab实现模型预测控制

考虑扩展状态空间形式 缩写为 对于未来的预测&#xff0c;这里要注意&#xff0c;默认了最小预测时域为1&#xff0c;如果不为1&#xff0c;从k1到k最小预测时域的x的预测为0 模型预测控制matlab运行代码&#xff0c;可实现模型预测控制。 StateMPC是按照钱积新版《预测控制》…

Python_day22

DAY 22 复习日 复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 一、Kaggle 基础使用步骤 注册与登录…