【STM32定时器 TIM小总结】

STM32 TIM详解

  • TIM介绍
  • 定时器类型
    • 基本定时器
    • 通用定时器
    • 高级定时器
    • 常用名词
    • 时序图
      • 预分频时序
      • 计数器时序图
  • 定时器中断配置图
      • 定时器定时
  • 代码调试

TIM介绍

定时器(Timer)是微控制器中的一个重要模块,用于生成定时和延时信号,以及处理定时事件。在STM32系列微控制器中,定时器通常用于以下几个方面:

  1. 定时器功能: 定时器可以生成精确的定时信号,用于定时器中断、PWM(脉冲宽度调制)、计时等应用。它可以产生周期性的计数器溢出事件,也可以产生比较匹配和捕获事件。

  2. PWM生成: 定时器可以用于产生PWM信号,用于控制电机速度、调光、音频产生等应用。

  3. 计时功能: 定时器可以用于测量时间间隔,计算时间延迟,或者用于定时测量外部事件的频率。

  4. 输入捕获和输出比较: 定时器可以用于捕获外部事件的时间戳,也可以用于与比较器进行比较,并产生相应的事件。

在STM32系列微控制器中,定时器模块非常灵活,通常包括多个独立的定时器单元,每个定时器单元都有自己的计数器、自动重载寄存器、预分频器、比较器等功能。此外,定时器模块通常还支持多种工作模式、计数模式和时钟源选择,可以满足各种不同的应用需求。

  • 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
  • 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时-钟下可以实现最大59.65s的定时(72MHZ/65535+1)*(65535+1)
    该公式后续会说明。
  • 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
  • 根据复杂度和应用场景分为了高级定时器通用定时器基本定时器三种类型

定时器类型

在这里插入图片描述

基本定时器

在这里插入图片描述

为何PSC+1?PSC为0则不分频即72MHz,为1 则分频率为36Mhz也即是72MHz/1+1 =36MHz,为2则分频为72Mhz/2+1=24MHz …最大值分频值为为65535 则72MHz/65535+1

默认情况下,定时器的输入时钟源(CK_INT)与定时器预分频器的输入时钟(CK_PSC)的时钟频率是相同的。

在STM32系列微控制器中,默认情况下,定时器的输入时钟源是微控制器的主时钟(一般是内部时钟源,比如HSI或者HSI16),而定时器预分频器的输入时钟则是来自于定时器输入时钟源。因此,如果没有对定时器的时钟源进行特别的配置,那么默认情况下,CK_INT和CK_PSC的时钟频率是相同的。

通用定时器

在这里插入图片描述

高级定时器

在这里插入图片描述

常用名词

CK_CNT_OV:时器计数器溢出频率,即定时器溢出的频率,通常以 Hz(赫兹)为单位。
CK_CNT: 定时器计数器时钟频率,即定时器计数器的输入时钟频率,通常以 Hz 为单位。
ARR : 自动重载寄存器的值,决定了定时器计数器溢出的周期。
CK_PSC: 定时器预分频器的输入时钟频率,通常也是定时器的输入时钟频率,在这里是72MHz,不需要我们处理。
PSC : 定时器预分频器的分频系数,决定了定时器计数器时钟频率。
这些参数的英文全称分别是:
- CK_CNT_OV: Timer Counter Overflow Frequency
- CK_CNT: Timer Counter Clock Frequency
- ARR: Auto-reload Register Value
- CK_PSC: Timer Prescaler Clock Frequency
- PSC: Prescaler Value
公式(重要 计算定时用):

输入时钟频率:CK_CNT = CK_PSC / (PSC + 1)
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)   
将CK_CNT= CK_PSC / (PSC + 1)带入得到下式= CK_PSC / (PSC + 1) / (ARR + 1)

时序图

预分频时序

在这里插入图片描述

计数器时序图

在这里插入图片描述

定时器中断配置图

在这里插入图片描述
需要一个一个配置,打通所在的线路配置即可。

定时器定时

计时1s如何设置计时?
1s=1/1Hz 即  t=1/f
f(频率)=计数器溢出频率;  t(时间)=1/f;  计时1s等于t=1/1(CK_CNT_OV) 故而f=CK_CNT_OV=1 ;此时CK_PSC / (PSC + 1) * (ARR + 1)=1   
又因为	CK_PSC 是预分频器的输入时钟频率,为72MHz,故而(PSC + 1) * (ARR + 1)=CK_PSC=72000000,凑PSC和ARR的值(但不要超过65535)使得式子成立即可。
这里PSC可以给7200-1  为什么-1?因为(PSC + 1) * (ARR + 1)式子PSC+1了,为了凑整数好计算取PSC=7200(注意:不要超过65535)。ARR+1=72000000/(PSC+1)=10000;

如此 1ms ,1 us的配置也就通过计算可以计算出了。

故而配置时基单元就可以这样写:

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//配置为向上计数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//这里随便配置个其中的参数TIM_TimeBaseInitStructure.TIM_Period=10000;//Auto-Reload,重装值 ARR 其值不得超过65536TIM_TimeBaseInitStructure.TIM_Prescaler=7200;//预分频系数  根据上方公式计算  PSC,其值不得超过65536TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//这个是高级定时器才会用到的,通用随便给个直接给0TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

在这里插入图片描述

代码调试

使用定时器,每1s进入一次定时器中断函数,完成Num++操作,并将它显示到OLED显示屏幕上。
Timer.c

#include "stm32f10x.h"                  // Device header
extern uint16_t Num; //Extern 声明变量在其他文件里(在main.c定义了),让编译器自己去找,这里引用的是main.c定义过的变量
void Timer_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2,通用计时器使能TIM_InternalClockConfig(TIM2);//配置为内部时钟模式TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//配置为向上计数//@72MHz  1sTIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//这里随便配置个其中的参数TIM_TimeBaseInitStructure.TIM_Period=10000;//Auto-Reload,重装值 ARR 其值不得超过65536TIM_TimeBaseInitStructure.TIM_Prescaler=7200;//预分频系数PSC,其值不得超过65536TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//这个是高级定时器才会用到的,通用随便给个直接给0TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能定时器中断//NVIC配置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组2NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//配置为TIM2NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能NVICNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级NVIC_Init(& NVIC_InitStructure);//一定记得启动定时器TIM_Cmd(TIM2,ENABLE);}void TIM2_IRQHandler(void)
{if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){Num++;Num%=100;//100重新计时TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清楚标志位}
}

main.c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"  
#include "Timer.h"
uint16_t Num;//定义Num,在Timer引用
int main()
{OLED_Init();Timer_Init();while(1){OLED_ShowNum(1,1,Num,4);}}

现象:每1s加一次。一直加到99,再加清零 继续从0开始
在这里插入图片描述

个人总结复习使用,如果对你也有帮助,那可真是小舞的荣幸。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔 安装对外服务Tomcat和JDK

一、安装Tomcat\JDK 切记1:如果选择下载节点失败,请到软件商城安装 。 切记2:提醒安装Nginx或Apache ,先点安装,进入再打叉关闭。因为Tomcat服务足够为我们搭建JavaWeb网站服务了。 切记3:Nginx占用80端口…

macOS 安装 NetLogo 6.4.0

netlogo 下载地址 NetLogo-6.4.0.dmg参考 netlogo 官网

17.搜索二维矩阵Ⅱ

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,2…

Windows 安装配置 RabbitMQ 详解

目录 1、安装前准备2、安装Erlang2.1 安装2.2 配置环境变量 3、安装RabbitMQ3.1 安装3.2 配置环境变量3.3 安装rabbitmq_management插件3.4 启动RabbitMQ服务 4、常用命令 本文将详说如何在Windows系统中安装RabbitMQ。 1、安装前准备 因为RabbitMQ服务器是用Erlang语言编写的…

0G联合创始人MICHAEL HEINRICH确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的不断发展和应用,全球开发者瞩目的Hack.Summit() 2024区块链开发者大会即将于2024年4月9日至10日在香港数码港盛大举行。此次大会由Hack VC主办,并得到AltLayer和Berachain的协办,同时汇聚了Solana、The Graph、Blockchain Ac…

论文阅读——Rein

Stronger, Fewer, & Superior: Harnessing Vision Foundation Models for Domain Generalized Semantic Segmentation 一、引言 是一个对Domain Generalized Semantic Segmentation (DGSS)任务的视觉大模型的微调方法,即Rein。 Rein 专为 DGSS 任务量身定制&a…

Segment Routing IPv6简介

定义 SRv6(Segment Routing IPv6,基于IPv6转发平面的段路由)是基于源路由理念而设计的在网络上转发IPv6数据包的一种协议。SRv6通过在IPv6报文中插入一个路由扩展头SRH(Segment Routing Header),在SRH中压…

Tomcat Session 集群 ---------会话保持

一、 负载均衡、反向代理 环境搭建: nginx服务器192.168.246.7 tomcat 1服务器192.168.246.8 tomcat 2服务器192.168.246.9 7-1 nginx服务器搭建 [rootzzcentos1 ~]#systemctl stop firewalld [rootzzcentos1 ~]#setenforce 0 [rootzzcentos1 ~]#yum install …

计算机网络——物理层(编码与调制)

计算机网络——编码与调制 基带信号和宽带信号编码与调制数字数据编码为数字信号非归零编码归零编码反向不归零编码曼彻斯特编码差分曼彻斯特编码4B/5B编码 数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号 我们之前讲了物理层的一些基础知识和两个准则&a…

4.MongoDB中16个常用CURD

基本的CURD 作为一个非专业的DBA,我们只需要会一些基本的curd就行,专业的内容还是需要专业的人去干的。CRUD 也就是增删改查,这是数据库最基本的功能,查询还支持全文检索,GEO 地理位置查询等。 01创建库 无需单独创…

以题为例浅谈文件包含

什么叫做文件包含 文件包含函数加载的参数没有经过过滤或严格定义,可以被用户控制, 包含其他恶意文件,导致了执行非预期代码。 文件包含漏洞(File Inclusion Vulnerability)是一种常见的网络安全漏洞,它允…

Linux中 vim 编辑器的使用

文章目录 前言一、vim编辑器模式二、简单的插入、保存和退出三、 命令模式下常用命令即其作用1. 命令模式 思维导图 前言 首先,了解一下 什么是vim 编辑器?在不同的系统中,文本的管理也会不同;windos系统就不多说了&#xff0c…

unity内存优化之AB包篇(微信小游戏)

1.搭建资源服务器使用(HFS软件(https://www.pianshen.com/article/54621708008/)) using System.Collections; using System.Collections.Generic; using UnityEngine;using System;public class Singleton<T> where T : class, new() {private static readonly Lazy<…

idea将非UTF-8的properties修改为UTF-8编码的文件

需求背景 由于项目初始化时&#xff0c;properties文件的编码格式为ASCII编码格式&#xff0c;此时用idea打开该文件会默认展示UTF-8的编码内容&#xff0c;其中汉字可以正常展示&#xff0c;但是使用notepad打开却依旧时ASCII编码格式 idea配置 打开idea-setting-editor-f…

力扣112、113、101--树

112. 路径总和 题目描述&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。 判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。 如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c…

hcia复习总结7

1&#xff0c;AR2发送2.0网段的信息给AR1&#xff0c;如果&#xff0c;AR1本身并不存在该网段的路由 信息&#xff0c;则将直接 刷新 到本地的路由表中。 Destination/Mask Proto Pre Cost Flags NextHop Interface 2.2.2.0/24 RIP 100…

多媒体会议系统的优势与核心组成

随着科技的发展&#xff0c;多媒体会议系统已经成为现代商务沟通的重要工具。这种集成了多种通信和信息技术的系统&#xff0c;旨在提高会议的效率和参与度&#xff0c;具有诸多优势。本文将对多媒体会议系统进行详细的介绍和分析&#xff0c;并探讨其对现代商务沟通的影响。 …

切面条-蓝桥杯?-Lua 中文代码解题第1题

切面条-蓝桥杯&#xff1f;-Lua 中文代码解题第1题 一根高筋拉面&#xff0c;中间切一刀&#xff0c;可以得到2根面条。 如果先对折1次&#xff0c;中间切一刀&#xff0c;可以得到3根面条。 如果连续对折2次&#xff0c;中间切一刀&#xff0c;可以得到5根面条。 那么&#xf…

【代码随想录】【回溯算法】补day24:组合问题以及组合的优化

回溯算法&#xff1a;递归函数里面嵌套着for循环 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 包含组合问题和组合问题的剪枝优化 class solution:def combine(se…

python入门(二)

python的安装很方便&#xff0c;我们这里就不再进行讲解&#xff0c;大家可以自己去搜索视频。下面分享一下Python的入门知识点。 执行命令的方式 在安装好python后&#xff0c;有两种方式可以执行命令&#xff1a; 命令行程序文件&#xff0c;后缀名为.py 对于命令行&…