STM32定时器原理和使用

简介

STM32微控制器提供了一系列的定时器模块(TIM),不同型号的STM32有不同数目和类型的定时器。常见的有:

  1. 基本定时器(TIM6, TIM7等):
    • 主要用于定时和触发一些基础事件,如ADC转换启动。
    • 只具有基础的计数功能,没有外围的输入捕获或输出比较功能。
  2. 通用定时器(TIM2, TIM3, TIM4, TIM5等):
    • 功能比基本定时器更加丰富。
    • 具备外围事件的输入捕获、输出比较、PWM输出等。
    • 编码器接口功能,可用于读取旋转编码器信息。
  3. 高级定时器(TIM1, TIM8等):
    • 提供更为复杂的功能,如电机控制。
    • 支持更高分辨率的PWM输出。
    • 死区时间管理,防止电源瞬间短路。
    • 多重输入捕获和输出比较功能。

工作原理

  1. 核心原理: 当TIM被启用时,其中的计数器开始根据预分频器(Prescaler)和时钟源的配置定时增加或减少(向上或向下计数)。一旦计数器值达到设定的自动重装载寄存器(ARR)的值,根据定时器的设置,它可能会重置(溢出),并可能触发中断或其他事件,如DMA传输请求。
  2. 预分频器: 定时器的输入时钟(通常来自系统时钟或外部时钟源)首先会被预分频器降低频率。预分频器实际上是一个除法计数器,它的输出确定了TIM计数器的计数速率。
  3. 自动重装载寄存器(ARR): 定时器的上溢点由ARR决定。在自动重装载寄存器溢出后,计数器可以重置为0(向上计数器)或重置为ARR(向下计数器),这取决于定时器的配置。
  4. 计数方向: 计数器可以配置为向上计数或向下计数。这个选择通常取决于特定的应用需求,例如,PWM输出通常使用向上计数。
  5. 捕获/比较单元: 定时器的输入捕获功能允许它在外部事件(如引脚变化)发生时捕获计数器的值,这可以用来测量外部信号的频率或宽度。 输出比较单元允许定时器在计数器达到特定值时触发一个动作或事件,例如输出翻转或中断。
  6. PWM功能: 使用输出比较模式,定时器可以生成PWM波形。当计数器值等于输出比较寄存器(OCR)设置的比较值时,输出管脚的状态会改变,从而生成PWM信号。
  7. 中断和DMA交互: 定时器可以在ARR溢出或捕获/比较事件时触发中断;此外,它还可以配合DMA控制器进行内存交换,这有助于减轻CPU负担。

预分频器的作用是什么?

预分频器的作用是对定时器的输入时钟信号进行分频,以降低定时器计数器的计数速率。这允许定时器以更慢的速度对事件进行计时,扩展了定时器的计时范围,使其可以用于较长时间的计时。简单来说,它就像是一个缩小器,能够将高速的时钟信号缩减成定时器能够使用的更低频率的信号。这对于创建定时任务或者测量较长时间间隔非常有用。

定时器的ARR寄存器有什么作用?

定时器的ARR(Auto-Reload Register)寄存器的主要作用是确定定时器计数器的最大值。当计数器的值达到ARR设定的值后,会发生以下几件事:

  1. 计数器被重置:在向上计数模式下,计数器值会回到零;在向下计数模式下,计数器会重置为ARR的值。
  2. 更新事件:到达ARR值通常会产生一个更新事件(Update Event),这个事件可以用来触发中断,执行特定的服务例程。
  3. PWM周期:在使用定时器产生PWM信号时,ARR的值确定了PWM周期的长度。计数器从0计数到ARR,代表了PWM波形的一个完整周期。

所以,ARR寄存器是调整定时器时间基准的关键部分,它定义了定时器溢出的时间点,从而影响定时器中断生成的频率或PWM波形的频率。

代码示例

    // 使能对应的GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置GPIOA的第5脚作为输出模式GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);// 使能TIM2时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 定义并初始化TIM_TimeBaseInitTypeDef结构体变量TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 10000 - 1; // 自动重装载寄存器的值TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1; // 设置预分频TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 设置分频,这里没有分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数器计数模式,向上计数// 初始化定时器TIM2TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 使能或者清除TIM2更新中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 初始化NVIC中断控制器NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 启用定时器TIM2TIM_Cmd(TIM2, ENABLE);while(1) {// 主循环内容// 其他的应用逻辑代码可以放在这里}
}
// TIM2中断服务函数
void TIM2_IRQHandler(void) {// 检查TIM2更新中断发生与否if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {// 清除TIM2更新中断标志 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// 切换PA5端口状态GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5)));}
}

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

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

相关文章

《隐私计算简易速速上手小册》第8章:隐私计算对机器学习和 AI 的影响(2024 最新版)

文章目录 8.1 机器学习中的隐私问题8.1.1 基础知识8.1.2 主要案例:使用差分隐私的机器学习8.1.3 拓展案例 1:基于隐私的数据聚合8.1.4 拓展案例 2:保护隐私的推荐系统8.2 使用隐私计算加强 AI 安全8.2.1 基础知识8.2.2 主要案例:使用同态加密的数据分析8.2.3 拓展案例 1:安…

Rocky Linux安装部署Elasticsearch(ELK日志服务器)

一、Elasticsearch的简介 Elasticsearch是一个强大的开源搜索和分析引擎,可用于实时处理和查询大量数据。它具有高性能、可扩展性和分布式特性,支持全文搜索、聚合分析、地理空间搜索等功能,是构建实时应用和大规模数据分析平台的首选工具。 …

input css padding

这样控件会跑出外套控件在HTML JSP里面是经常出现的。但有些外国adobe的as控件不存在这种情况,这是因为内层控件定义的时候不能超出外层控件的范围。 修改下:去掉原来css padding,然后加上宽度和高度

Mycat核心教程--ZooKeeper集群搭建【三】

Mycat核心教程--ZooKeeper集群搭建 八、 ZooKeeper集群搭建8.1.ZooKeeper简介8.2.数据复制的好处8.3.Zookeeper设计目的8.4.zookeeper集群包括3种角色8.4.1.Leader角色8.4.2.Follower 角色8.4.3.Observer 角色 8.5.zookeeper集群工作流程8.6.zookeeper集群节点数量为奇数&#…

骑砍战团MOD开发(48)-多人联机模式开发环境搭建

一.多人联机模式网络拓扑图 <1.局域网网络拓扑图: <2.互联网网络拓扑图: 二.多人联机模式打开方式 #module.ini配置文件新增配置has_multiplayer 1 has_single_player 1 三.服务端创建(引擎内部有CDKey校验,故必须拥有CDKey才可联机) <1.专用服务器和普通服务器: …

代码随想录训练营第31天 | 理论基础、LeetCode 455.分发饼干、

目录 理论基础 视频讲解&#xff1a;手把手带你学会操作链表 | 贪心算法理论基础&#xff01;_哔哩哔哩_bilibili LeetCode 455.分发饼干 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;贪心算法&#xff0c;你想先喂哪个小孩&#xff1f;| Le…

【k8s配置与存储--持久化存储(PV、PVC、存储类)】

1、PV与PVC 介绍 持久卷&#xff08;PersistentVolume&#xff0c;PV&#xff09; 是集群中的一块存储&#xff0c;可以由管理员事先制备&#xff0c; 或者使用存储类&#xff08;Storage Class&#xff09;来动态制备。 持久卷是集群资源&#xff0c;就像节点也是集群资源一样…

Flutter开发进阶之Flutter Web加载速度优化

Flutter开发进阶之Flutter Web加载速度优化 通常使用Flutter开发的web加载速度会比较慢,原因是Flutter web需要加载的资源处于国外,以下是据此所做的相应优化。 一、FlutterWeb打包 flutter build web --web-renderer canvaskit使用新命令打包 flutter build web --web-…

459. 重复的子字符串(力扣LeetCode)

文章目录 459. 重复的子字符串题目描述暴力移动匹配KMP算法 459. 重复的子字符串 题目描述 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: …

高性能Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上&#xff0c;服务端server接收到IO请求后&#xff0c;是如何处理请求并最终进入业务流程的呢&#xff1f;这里不得不提到reactor反应堆模型。reactor反应堆模型来源于大师Doug Lea在 《Sacalable io …

Fabric V2.5 通用溯源系统——区块链部分设计

本节对Fabric V2.5 通用溯源系统的区块链部分做一个简单的介绍,包括目录结构、文件作用、设计思路。此节内容免费发布在TrueTechLabs Fabric学习交流QQ群。 购买专栏前请认真阅读:《Fabric项目学习笔记》专栏介绍 TrueTechLabs Fabric学习交流QQ群: 一、区块链部分文件目录简…

【北京迅为】《iTOP-3588开发板网络环境配置手册》第2章 电脑、开发板直连交换机或路由器

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…