STM32F1定时器TIM

news2024/11/29 11:43:41

目录

1.  TIM(Timer)定时器

2.  定时器类型

2.1  基本定时器框图

2.2  通用定时器框图

2.3  高级定时器框图

3.  定时器代码

3.1  恢复缺省配置

3.2  时基单元初始化

3.3  结构体变量附一个默认值

3.4  使能计数器

3.5  使能中断输出信号

3.6  选择内部时钟

3.7  选择ITRx其他定时器的时钟

3.8  选择TIx捕获通道的时钟

3.9  选择ETR通过外部时钟模式1输入的时钟

3.10  选择ETR通过外部时钟模式2输入的时钟

3.11  配置ETR引脚的预分频起,极性滤波器等

3.12  单独写预分频的值

3.13  改变计数器的计数模式

3.14  自动重装器预装功能配置

3.15  给计数器写入一个值

3.16  给自动重装器写入一个值

3.17  获取当前计数器的值

3.18  获取当前预分频器的值

4.  定时器配置

4.1  指定时钟分频,1分频

4.2  配置计数方式

4.3  全部配置如下


1.  TIM(Timer)定时器

        定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。

        16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。

计数器:用来执行计数定时的一个寄存器,每来一个时钟,计数器加1

预分频器:对计数器的时钟进行分频,让计数更加灵活

自动重装寄存器:计数的目标值,就是我们想要多少个时钟申请中断

16位寄存器(2^16=65536),假如预分频器和自动重装寄存器,设到最大,就是:

        72MHz/(2^16)/(2^16)=中断频率(f)

        取倒数得时间(T=1/f)

        可得最大定时59.65s

        不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。

        根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。

2.  定时器类型

STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4

2.1  基本定时器框图

2.2  通用定时器框图

2.3  高级定时器框图

第一遍暂时没看懂,插个眼:

[6-1] TIM定时中断_哔哩哔哩_bilibili

3.  定时器代码

大概了解一下

3.1  恢复缺省配置

void TIM_DeInit(TIM_TypeDef* TIMx);

3.2  时基单元初始化

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

TIM_TypeDef* TIMx:选择某个定时器

TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct:包含了一些配置时基单元的参数

3.3  结构体变量附一个默认值

void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

3.4  使能计数器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

TIM_TypeDef* TIMx:选择定时器

FunctionalState NewState:新的状态(使能还是失能)

3.5  使能中断输出信号

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

TIM_TypeDef* TIMx:选择定时器

uint16_t TIM_IT:选择要配置哪个中断

FunctionalState NewState:新的状态(使能还是失能)

3.6  选择内部时钟

void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

3.7  选择ITRx其他定时器的时钟

void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

TIM_TypeDef* TIMx:选择要配置的定时器

uint16_t TIM_InputTriggerSource:选择要接入哪个其他定时器

3.8  选择TIx捕获通道的时钟

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

TIM_TypeDef* TIMx:选择要配置的定时器

uint16_t TIM_TIxExternalCLKSource:选择TIx具体某个引脚

uint16_t TIM_ICPolarity, uint16_t ICFilter:选择极性和滤波器

3.9  选择ETR通过外部时钟模式1输入的时钟

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);

TIM_TypeDef* TIMx:选择要配置的定时器

uint16_t TIM_ExtTRGPrescaler:外部触发预分频起

uint16_t TIM_ExtTRGPolarity:极性

uint16_t ExtTRGFilter:滤波器

3.10  选择ETR通过外部时钟模式2输入的时钟

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

TIM_TypeDef* TIMx:选择要配置的定时器

uint16_t TIM_ExtTRGPrescaler:外部触发预分频起

uint16_t TIM_ExtTRGPolarity:极性

uint16_t ExtTRGFilter:滤波器

3.11  配置ETR引脚的预分频起,极性滤波器等

void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);

TIM_TypeDef* TIMx:选择要配置的定时器

uint16_t TIM_ExtTRGPrescaler:外部触发预分频起

uint16_t TIM_ExtTRGPolarity:极性

uint16_t ExtTRGFilter:滤波器

3.12  单独写预分频的值

void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);

TIM_TypeDef* TIMx:选择要配置的定时器

uint16_t Prescaler:写入预分频的值

uint16_t TIM_PSCReloadMode:写入的模式

3.13  改变计数器的计数模式

void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);

TIM_TypeDef* TIMx:选择要配置的定时器

uint16_t TIM_CounterMode:选择要计数的模式

3.14  自动重装器预装功能配置

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

TIM_TypeDef* TIMx:选择要配置的定时器

FunctionalState NewState:使能还是失能

3.15  给计数器写入一个值

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);

3.16  给自动重装器写入一个值

void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);

3.17  获取当前计数器的值

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

3.18  获取当前预分频器的值

uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

4.  定时器配置

4.1  指定时钟分频,1分频

  uint16_t TIM_ClockDivision;     /*!< Specifies the clock division.
                                      This parameter can be a value of @ref TIM_Clock_Division_CKD */

点击TIM_Clock_Division_CKD,按Ctrl+F搜索,可以看到

#define TIM_CKD_DIV1                       ((uint16_t)0x0000)
#define TIM_CKD_DIV2                       ((uint16_t)0x0100)
#define TIM_CKD_DIV4                       ((uint16_t)0x0200)
#define IS_TIM_CKD_DIV(DIV) (((DIV) == TIM_CKD_DIV1) || \
                             ((DIV) == TIM_CKD_DIV2) || \
                             ((DIV) == TIM_CKD_DIV4))

可以选择,1分频,2分频,4分频以及不分频,根据自己需求进行选择。

4.2  配置计数方式

#define TIM_CounterMode_Up                 ((uint16_t)0x0000)
#define TIM_CounterMode_Down               ((uint16_t)0x0010)
#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020)
#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040)
#define TIM_CounterMode_CenterAligned3     ((uint16_t)0x0060)
#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_CounterMode_Up) ||  \
                                   ((MODE) == TIM_CounterMode_Down) || \
                                   ((MODE) == TIM_CounterMode_CenterAligned1) || \
                                   ((MODE) == TIM_CounterMode_CenterAligned2) || \
                                   ((MODE) == TIM_CounterMode_CenterAligned3))
/**

向上计数,向下计数,三种中央对齐的模式

4.3  全部配置如下

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启始终APB1
	
	TIM_InternalClockConfig(TIM2);//选择时机单元的时钟,内部时钟
	//定时器上电默认内部时钟,可不写
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//结构体
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//指定时钟分频,1分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	
	//计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR-1)
	//对72M进行7200分频,得到10k的计数频率,在10k的频率下,记10000个数,1s
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//PSC,自动重装
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//ARR,预分频
	//预分频多,自动重装少,以比较低的频率记比较少的数
	//预分频少,自动重装多,以比较高的频率记比较多的数
	
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器,高级采用,这里不用给0
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);//手动把更新中断标志位清除一下,避免刚初始化完就进入中断的问题
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//更新中断到NVIC的通路
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组2
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2, ENABLE);//使能计数器
}

STM32F1中断NVIC-CSDN博客

STM32F1外部中断EXTI-CSDN博客

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

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

相关文章

138. 随机链表的复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

Hive数据库系列--Hive数据类型/Hive字段类型/Hive类型转换

文章目录 一、Hive数据类型1.1、数值类型1.2、字符类型1.3、日期时间类型1.4、其他类型1.5、集合数据类型1.5.1、Struct举例1.5.2、Array举例1.5.3、Map举例 二、数据类型转换2.1、隐式转换2.2、显示转换 本章主要讲解hive的数据类、字段类型。官网文档地址见https://cwiki.apa…

数据库系统概论复习资料

数据库系统概论考试需知 一、分值分布 1、判断题&#xff08;10分&#xff09; 1分一个 2、填空题&#xff08;20分&#xff09; 2分一个 3、选择题&#xff08;20分&#xff09; 2分一个 4、分析题&#xff08;30分&#xff09; 第一题10分&#xff0c;第二题…

ubuntu安装docker及docker常用命令

docker里有三个部分 daemon 镜像 和 容器 我们需要了解的概念 容器 镜像 数据卷 文章目录 docker命令docker镜像相关命令docker容器相关命令数据卷ubuntu安装docker docker命令 #启动&#xff0c;停止&#xff0c;重启docker systemctl start docker systemctl stop docker s…

2023字节跳动软件测试工程师面试题及答案分享

相信大家都有这样一个忧虑就是面试&#xff0c;不管我们要找什么工作&#xff0c;面试都会是必不可少的&#xff0c;下面是整理出来的面试题和我的一些见解觉得不对的在评论区留言&#xff01; 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&…

JVM 对象内存布局篇

对象的实例化 创建对象有哪些方式&#xff1f; 1、new对象 最常见的方式 变形1:X的静态方法 变形2:XxxBuilder/XxxFactory的静态方法 2、Class的newlnstance0:反射的方式&#xff0c;只能调用空参的构造器&#xff0c;权限必须是public 3、Constructor的newinstance(X):反射的…

MQTT源码分析

目录 MQTT源码分析 1. MQTT客户端功能 2. 客户端软件如何实现 3. 程序分层 4. 情景分析 4.1 连接服务器 4.2 创建线程 4.3 发布消息 4.4 最复杂&#xff1a;订阅消息 MQTT源码分析 分析源码&#xff1a;mqttclient\test\emqx\test.c 参考资料&#xff1a; kawaii-mqt…

解决vue3使用iconpark控制台预警提示问题

前言 最近在项目中使用 iconpark-icon 来管理图标&#xff0c;一切都很顺利&#xff0c;引入链接后&#xff0c;图标正常显示&#xff0c;没有报错。但是控制台却发出了预警信息。 [Vue warn]: Failed to resolve component: iconpark-icon If this is a native custom eleme…

istio为什么能代替传统的SpringCloud 服务网格Istio概述

服务网格Istio概述 什么是服务网格(Service Mesh)&#xff1f;istio简介边车模式&#xff08;Sidecar&#xff09;为什么istio能代替传统SpringCloud&#xff1f;整体架构 首先奉上 istio官网 什么是服务网格(Service Mesh)&#xff1f; 服务网格详解 服务网格&#xff08;Se…

ky10 x86 一键安装wvp gb28181 pro平台

下载代码 git clone https://gitcode.net/zengliguang/ky10_x86_wvp_record_offline_install.gitfinalshell mobaxterm 修改服务器ip 查看服务器ip ip a 在脚本文件中修改服务器ip 执行安装脚本 切换到root用户 sudo su cd ky10_x86_wvp_record_offline_install/ sourc…

HarmonyOS开发(十):通知

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知使用的的常见场景&#xff1a; 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

string类:`reserve()`,`resize()`详解

string类的重要接口说明(1)&#xff1a;reserve()&#xff0c;resize() 一、reserve() 和 resize() 注意不要把 reserve(储备) 和 reverse(逆向) 搞混了&#xff01; 1.1 reserve()&#xff1a;用于为字符串预留空间&#xff08;扩容&#xff09;&#xff0c;以便后续操作可以…

urllib爬虫 应用实例(三)

目录 一、 ajax的get请求豆瓣电影第一页 二、ajax的get请求豆瓣电影前十页 三、ajax的post请求肯德基官网 一、 ajax的get请求豆瓣电影第一页 目标&#xff1a;获取豆瓣电影第一页的数据&#xff0c;并保存为json文件 设置url&#xff0c;检查 --> 网络 --> 全部 -…

如何搭建外部网关,转发请求进行调用(送源码)

像阿里云能力中台一样&#xff0c;我们输入阿里云的地址&#xff0c;阿里云内部的程序帮助我们进行转发到相应的服务去。比如说阿里云的短信服务&#xff0c;他也是集成的若干个小服务&#xff0c;我们通过阿里云的地址进行访问时。阿里云再将具体的请求推送到具体的服务去。 …

Spring-Boot---日志文件

文章目录 日志的作用自定义日志打印获得日志对象使用日志对象打印日志日志格式说明 日志级别日志级别的作用日志级别的分类日志级别的设置 日志持久化更简单的使用日志 日志的作用 发现和定位问题记录用户登录日志&#xff0c;判断用户是正常登录还是恶意登录记录系统操作日志…

uniapp实战 —— 分类导航【详解】

效果预览 组件封装 src\pages\index\components\CategoryPanel.vue <script setup lang"ts"> import type { CategoryItem } from /types/index defineProps<{list: CategoryItem[] }>() </script><template><view class"category&…

数据可视化|jupyter notebook运行pyecharts,无法正常显示“可视化图形”,怎么解决?

前言 本文是该专栏的第39篇,后面会持续分享python数据分析的干货知识,记得关注。 相信有些同学在本地使用jupyter notebook运行pyecharts的时候,在代码没有任何异常的情况下,无论是html还是notebook区域,都无法显示“可视化图形”,界面区域只有空白一片。遇到这种情况,…

el-form-item表单根据后台返回的数据项展示校验错误信息

客户要求校验不通过时把失败原因一一对应显示在相关数据项下方 &#xff08;类似form表单提示必填的效果&#xff09; 本来想从自定义rules下手 顺路看了眼官网 发现有现成的&#xff01; 诶嘛 真香 在el-form-item上加error 该值会使表单验证状态变为error 红框高亮 并显示该…

SpringBoot读取properties文字乱码问题及相关问题

问题&#xff1a;在idea的编辑器中properties文件一般用UTF-8编码&#xff0c;SpringBoot2读取解码方式默认不是UTF-8&#xff0c;当值出现中文时SpringBoot读取时出现了乱码。 解决方式1&#xff1a;在SpringBoot框架层面解决&#xff0c;在配置类注解上添加encoding属性值为…

生成任意轴线方向的圆柱体

文章目录 测试效果1. 基本内容2. 生成任意轴线方向的圆柱体2. 代码实现3. 参考目标: 目标:根据拟合的圆柱体轴线和轴上点,可视化任意轴线方向的圆柱体测试效果 1. 基本内容 在实际检测拟合圆柱体后,我们可以根据拟合误差查看拟合的效果,但是,为了更直观的查看拟合效果,…