【STM32定时器(一)内部时钟定时与外部时钟 TIM小总结】

STM32 TIM详解

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

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);

在这里插入图片描述

代码调试

代码案例1

使用定时器,每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);//使能定时器中断//下面这行程序后面还有中断使能开关,中断标志置1了,但后面的中断使能没开,也进不了中断,所以在使能开关前面清除就能达到目的TIM_ClearFlag( TIM2,TIM_FLAG_Update);//清除标志位,因为TIM_TimeBaseInit函数里有这样一句话/* Generate an update event to reload the Prescaler and the Repetition countervalues immediately->立即 */ //就会导致刚初始化就进入中断,导致下方Num不是从0开始,而是从1开始。// TIMx->EGR = TIM_PSCReloadMode_Immediate;    因此需要清除标志位。//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开始
在这里插入图片描述

代码案例2

对射式红外,遮挡一次cnt加1次,满十次cnt清零 ,同时Num+1。

因为使用的是ETR外部时钟模式2,故而接线图Do->PA0(PA0有复用TIM2_ETR功能)
在这里插入图片描述
Timer.c

#include "stm32f10x.h"                  // Device header
extern uint16_t Num; //Extern 声明变量在其他文件里(在main.c定义了),让编译器自己去找,这里引用的是main.c定义过的变量void Timer_Init(void)
{//TIM2通用定时器 时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2,通用计时器使能//GPIO时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//外部时钟模式2使能TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_Inverted,0xff);//外部时钟模式2,下降沿触发,滤波 //GPIO配置GPIO_InitTypeDef GPIO_InitStructure;//模式看手册的 GPIO章节的8.1.11 外设的GPIO配置中的TIM ETRGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入,手册给的浮空输入,但不建议,因为电平会跳个不停GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PA0端口,因为PA0有TIM2_ETR复用功能GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//时基单元配置TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//配置为向上计数TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//这里随便配置个其中的参数TIM_TimeBaseInitStructure.TIM_Period=10-1;//Auto-Reload,重装值 ARR 其值不得超过65536TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;//预分频系数PSC,其值不得超过65536TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//这个是高级定时器才会用到的,通用随便给个直接给0TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能定时器中断//这个程序后面还有中断使能开关,中断标志置1了,但后面的中断使能没开,也进不了中断,所以在使能开关前面清除就能达到目的TIM_ClearFlag( TIM2,TIM_FLAG_Update);//清除标志位,因为TIM_TimeBaseInit函数里有这样一句话/* Generate an update event to reload the Prescaler and the Repetition countervalues immediately->立即 */ //就会导致刚初始化就进入中断,导致下方Num不是从0开始,而是从1开始。// TIMx->EGR = TIM_PSCReloadMode_Immediate;    因此需要清除标志位。//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=2;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级NVIC_Init(& NVIC_InitStructure);//一定记得启动定时器TIM_Cmd(TIM2,ENABLE);}/*** @brief    得到TIM2的计数值* @param    无  * @retval   计数器的值*/
uint16_t Timer_GetCounter(void)
{return TIM_GetCounter(TIM2);
}//模板
/*
void TIM2_IRQHandler(void)
{if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清楚标志位}
}
*/解释一下Period与Prescaler的值的意义(以红外对射为例)上述情况:Period为10-1(重传值910时清零) ,Prescaler为1-1 不分频(频率),假如改为2-1,频率就会比1-1变慢2倍,此时红外遮挡两次CNT才增加一次。表示当红外对射遮挡一次,Timer_GetCounter加1当Timer_GetCounter到9时,再加1,就进入TIM更新事件中断,同时Timer_GetCounter清除为0拓展:Period为M-1 ,Prescaler为N-1表示当红外对射遮挡N次,Timer_GetCounter加1个人总结复习使用,如果对你也有帮助,那可真是小舞的荣幸。

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

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

相关文章

mybatis源码阅读系列(一)

源码下载 mybatis 初识mybatis MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的自动驾驶目标检测系统详解(深度学习+Python代码+PySide6界面+训练数据集)

摘要:开发自动驾驶目标检测系统对于提高车辆的安全性和智能化水平具有至关重要的作用。本篇博客详细介绍了如何运用深度学习构建一个自动驾驶目标检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLO…

相机与相机模型(针孔/鱼眼/全景相机)

本文旨在较为直观地介绍相机成像背后的数学模型,主要的章节组织如下: 第1章用最简单的针孔投影模型为例讲解一个三维点是如何映射到图像中的一个像素 第2章介绍除了针孔投影模型外其他一些经典投影模型,旨在让读者建立不同投影模型之间的建模…

RabbitMQ高级-高级特性

1.消息可靠性传递 在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ为我们提供了两种方式来控制消息的投递可靠性模式 1.confirm 确认模式 确认模式是由exchange决定的 2.return 退回模式 回退模式是由routing…

力扣热题100_矩阵_240_搜索二维矩阵 II

文章目录 题目链接解题思路解题代码 题目链接 240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入&#xf…

GAMES104-现代游戏引擎 1

主要学习重点还是面向就业,重点复习八股和算法 每天早上八点到九点用来学习这个课程 持续更新中... 第一节 游戏引擎导论 第二节 引擎架构分层

橡胶工厂5G智能制造数字孪生可视化平台,推进橡胶工业数字化转型

橡胶5G智能制造工厂数字孪生可视化平台,推进橡胶工业数字化转型。随着信息技术的迅猛发展和智能制造的不断推进,数字化转型已成为制造业转型升级的重要方向。橡胶工业作为传统制造业的重要领域,正面临着产业升级和转型的迫切需求。橡胶5G智能…

软考79-上午题-【面向对象技术3-设计模式】-结构型设计模式02

一、组合模式 1-1、意图 将对象组合成树型结构,以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组 合对象的使用具有一致性。 示例:对象:文件、文件夹 1-2、结构 Component 为组合中的对象声明接口;在适…

决策树 | 分类树回归树:算法逻辑

目录 一. 决策树(Decision Tree)1. 决策树的构建1.1 信息熵(Entropy)1.1.1 信息量&信息熵 定义1.1.2 高信息熵&低信息熵 定义1.1.3 信息熵 公式 1.2 信息增益(Information Gain)1.2.1 信息增益的计算1.2.2 小节 2. 小节2.1 算法分类2.2 决策树算法分割选择2.3 决策树算…

提升物流效率,快递平台实战总结与分享

随着电商行业的蓬勃发展,物流配送服务变得愈发重要。快递平台作为连接电商企业和消费者的桥梁,扮演着至关重要的角色。本篇博客将分享快递平台实战经验,总结关键要点,帮助物流从业者提升物流效率、优化服务质量。 ### 快递平台实…

汽车网络基础知识 要点

在以太网开发中,常常会听到一些专业名词,例如PHY,MAC,MII,switch,下面是解释 PHY PHY 是物理接口收发器,它实现物理层。包括 MII/GMII (介质独立接口) 子层、PCS (物理编码子层) 、PMA (物理介…

SQLiteC/C++接口详细介绍之sqlite3类(十四)

返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(十三) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十五) 43.sqlite3_preupdate_hook sqlite3_preup…

基于springboot的高校化学试剂仓储管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

VMware NSX Advanced Load Balancer (NSX ALB) 22.1.6 - 多云负载均衡平台

VMware NSX Advanced Load Balancer (NSX ALB) 22.1.6 - 多云负载均衡平台 应用交付:多云负载均衡、Web 应用防火墙和容器 Ingress 服务 请访问原文链接:https://sysin.org/blog/vmware-nsx-alb-22/,查看最新版。原创作品,转载请…

194 基于matlab的日历GUI制作

基于matlab的日历GUI制作,可实时显示当前的日期和时间,精确到秒。非常漂亮,也很基础,学习GUI的不错程序,程序已调通,可直接运行。 194 matlab 日历制作 GUI可视化 - 小红书 (xiaohongshu.com)

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码 上机代码: # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…

RTP 控制协议 (RTCP) 反馈用于拥塞控制

摘要 有效的 RTP 拥塞控制算法,需要比标准 RTP 控制协议(RTCP)发送方报告(SR)和接收方报告(RR)数据包提供的关于数据包丢失、定时和显式拥塞通知 (ECN) 标记的更细粒度的反馈。 本文档描述了 RTCP 反馈消息,旨在使用 RTP 对交互式实时流量启用拥塞控制…

JMeter 面试题及答案整理,最新面试题

JMeter中如何进行性能测试的规划和设计? 进行JMeter性能测试的规划和设计主要遵循以下几个步骤: 1、确定测试目标: 明确性能测试的目的和目标,比如确定要测试的系统性能指标(如响应时间、吞吐量、并发用户数等&#…

zookeeper快速入门一:zookeeper安装与启动

本文是zookeeper系列之快速入门中的第一篇,欢迎大家观看与指出不足。 写在前面: 不影响教程,笔者安装zookeeper用的是WSL(windows下的linux子系统),当然你想直接在windows上用zookeeper也是可以的。 如果你也想用ws…

怎么判断发票扫描OCR软件好用不好用?

发票扫描OCR(Optical Character Recognition)是一种将纸质发票上的文字、数字等信息转化为可编辑的文本格式的技术。在现代企业中,随着数字化转型的推进,发票扫描OCR技术变得越来越重要。然而,面对市场上众多的发票扫描…