STM:TIM定时器——定时中断
文章目录
- 1、TIM定时器
- 1.1定时器类型
- 1.2定时中断的基本结构
- 2 定时器初始化
- 2.2 初始化定时器的步骤
- 2.3 TIM库函数
- 2.4 配置TIM
- 2.4.1 Timer.c
- 2.4.2 Timer.c
- 2.4.3 main.c
1、TIM定时器
定时器的功能可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。
- 他包含16位计数器(CNT)、预分频器(PSC)、自动重装寄存器(ARR)的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。
- 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。
- 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。
计数器(CNT):用来执行计数定时的一个寄存器,每来一个时钟,计数器加1;
预分频器(PSC):对计数器的时钟进行分频,使奇数更加灵活;
自动重装寄存器(RCC):使计数值的目标值,也就是想要多少个时钟申请中断。
1.1定时器类型

- STM32F103C8T6定时器资源有:TIM1、TIM2、TIM3、TIM4
基本定时器从基准时钟,到预分频器,再到计数器,计数器计数自增,同时不断地与自动重装寄存器进行比较;他们相等时,即计时时间到,这时会产生一个更新中断和中断事件,CPU响应更新中断,最后完成定时中断的任务。基本定时器仅支持向上计数这一模式。
通用定时器和高级定时器不仅支持向上计数模式,还支持向下计数模式和中央对齐模式。
STM32定时器的一大特色,就是主从触发模式DAC的功能,他能让硬件在不受程序的控制下实现自动运行。如果运用得当,在某些情景下可以极大的减轻CPU的负担。
1.2定时中断的基本结构
定时中断和内外时钟源选择所涉及的结构如下图所示:

PSC、CNT和ARR三个部分构成了时基单元;下面是运行控制,控制寄存器的一些位,比如启动停止、向上或向下计数等等,操作这些寄存器就能控制时基单元的运行了。
左边是为时基单元提供时钟的部分;右边是计时时间到,产生新更新中断后的信号去向。如果是高级定时器,在右边部分还会多一个重复计数器。
2 定时器初始化
我们通过定时中断的整个框架结构图,将图中的每个模块都打通,就能让定时器工作了。

2.2 初始化定时器的步骤
这里以初始化TIM2定时器为例:
1.RCC开启时钟,TM2是APB1总线的外设,所以要使用APB1的开启时钟函数;
2.选择时基单元的时钟源,对于定时中断,我们就选择内部时钟源;
3.配置时基单元,包括其中的PSC、ARR、CNT等等;
4.配置输出中断控制,允许更新中断输出到NVIC;
5.配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级;
6.运行控制,整个模块配置完成后,需要使能一下计数器;当定时器使能后,计数器就会开始计数,当计数器更新时,触发中断;最后写一个定时器的中断函数,这样这个中断函数每隔一段时间就能自动执行一次了。
2.3 TIM库函数
下面我们来介绍一部分与TIM有关的库函数:

1.TIM_DeInit,恢复缺省配置。
2.TIM_TimeBaseInit,时基单元初始化,有两个参数,第一个TIMx选择某个定时器,第二个是结构体,包含了配置时基单元的一些参数。
3.TIM_TimeBaseStructInit,可以把结构体赋一个默认值。
4.TIM_Cmd,使能计数器,2个参数,第一个TIMx选择定时器;第二个NewState新的状态,也就是选择使能或者失能。
5.TIM_ITConfig,用来使能输出信号,3个参数,第一个TIMx,选择定时器;第二个TIM_IT,选择配置哪个中断输出;第三个NewState,新的状态选择使能还是失能。

6.TIM_InternalClockConfig,选择内部时钟。
7.TIM_ITRxExternalClockConfig,选择TIMx其他定时器的时钟,第一个参数选择要配置的定时器;第二个参数选择要接入哪个其他的定时器。
8.TIM_TIxExternalClockConfig,选择TIx捕获通道的时钟,4个参数,第一个参数TIMx;第二个参数选择TIx的某个引脚;第三个参数,选择输入的极性;第四个参数,选择滤波器。
9.TIM_ETRClockMode1Config,选择ETR通过外部时钟模式1输入的时钟,4个参数,第一个参数TIMx;第二个参数外部触发预分频器,这里可以对ETR的外部时钟再提前做一个分频;第三、四个参数分别是选择极性和滤波器。
10.TIM_ETRClockMode2Config,选择ETR通过外部时钟模式2输入的时钟,参数与上面一样。
11.TIM_ETRConfig,单独用来配置ETR引脚的预分频器、极性、滤波器等参数。
总结:
1、第6-11个函数,总共6个函数,对应的是时基单元的时钟选择部分,可选择RCC内部时钟、ETR外部时钟、ITRx其他定时器、ITx捕获通道等。
2、第9-10个函数,总共2个函数,对于ETR外部时钟而言,这两个函数是等效的,参数也是一样的;若不需要触发输入的功能,那么这两个函数原则上是可以互换的。

12.TIM_PrescalerConfig,单独写预分频的值,第二个参数就是要写入预分频的值;第三个参数是选择写入的模式。预分频器有一个缓冲器,写入的值是在更新事件发生后才有效的,所以这里有个写入模式,可以选择听从安排在更新事件生效;或是在写入后,手动产生一个更新事件,让这个值立刻生效。
13.TIM_CounterModeConfig,用来改变计数器的计数模式,第二个参数用来选择新的计数器模式。
14.TIM_ARRPreloadConfig,自动重装器预装功能配置。

15.TIM_SetCounter,给计数器写入一个值。
16.TIM_SetAutoreload,给自动重装器写入一个值。

17.uint16_t TIM_GetCounter,获取当前计数器的值,他的返回值就是当前计数器的值。
18.uint16_t TIM_GetPrescaler,获取当前预分频器的值。

19.FlagStatus TIM_GetFlagStatus
20.TIM_ClearFlag,主要用于清除定时器的中断标志位。
21.ITStatus TIM_GetITStatus
22.TIM_ClearITPendingBit,主要用于清除中断线路的中断挂起位。
这4个函数是用来获取标志位和清除标志位。
2.4 配置TIM
我们定一个时间,让定时器每隔一个时间产生中断,来实现每隔一个固定时间执行一段程序,如下:
2.4.1 Timer.c
#include "stm32f10x.h" void Timer_Init(void)
{
//1.开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//2.选择时基单元的时钟(定时器上电后默认就是使用内部时钟,若不调用这个函数,那也是使用的内部时钟) TIM_InternalClockConfig(TIM2);//选择内部时钟
//3.配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//选择1分频TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//选择向上计数模式//若想定时1s,定时频率=72M/(PSC+1)/(ARR+1),预分频器和计数器都有1个数的偏差,所以要-1TIM_TimeBaseInitStructure.TIM_Period=10000-1;//ARR自动重装的值TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器,是高级定时器才有的TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动把更新中断标志位清除一下,避免刚初始化完就进入中断//4.使能更新中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//5.配置NVIC NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//选择定时器TIM2在NVIC里的通道NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级NVIC_Init(&NVIC_InitStructure);
//6.启动定时器TIM_Cmd(TIM2,ENABLE);
}
2.4.2 Timer.c
#ifndef __TIMER_H_
#define __TIMER_H_void Timer_Init(void);#endif
2.4.3 main.c
#include "stm32f10x.h" // Device header
#include "TIMER.H"uint16_t Num;
int main(void)
{OLED_Init();Timer_Init();OLED_ShowString(1,1,"Num:");while(1){OLED_ShowNum(1,5,Num,5);}
}void TIM2_IRQHandler(void)//定时器2的中断函数
{if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//检查中断标志位{Num++;TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位}
}相关文章:
STM:TIM定时器——定时中断
文章目录 1、TIM定时器1.1定时器类型1.2定时中断的基本结构 2 定时器初始化2.2 初始化定时器的步骤2.3 TIM库函数2.4 配置TIM2.4.1 Timer.c2.4.2 Timer.c2.4.3 main.c 1、TIM定时器 定时器的功能可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。 他包含…...
jetson tx2 nx实现在ros1中yolov5实现
亲测用以下链接实现功能。 安装ros。Ubuntu18.04安装ROS Melodic(详细,亲测安装完成,有清晰的截图步骤)_ubuntu 18 ros melodic-CSDN博客文章浏览阅读10w次,点赞835次,收藏3.8k次。这也是我在ubuntu里面安…...
【SpringBoot笔记43】SpringBoot应用程序集成spring-boot-admin监控工具
这篇文章,主要介绍SpringBoot应用程序如何集成spring-boot-admin监控工具。 目录 一、spring-boot-admin监控工具 1.1、创建admin-client客户端 (1)引入依赖...
与队列和栈相关的【OJ题】
✨✨✨专栏:数据结构 🧑🎓个人主页:SWsunlight 目录 一、用队列实现栈: 1、2个队列的关联起来怎么由先进先出转变为先进后出:(核心) 2、认识各个函数干嘛用的: …...
Unity编辑器扩展
Unity编辑器扩展是指为Unity引擎开发者提供的一种扩展功能,可以增强Unity编辑器的功能和效能。这些扩展可以帮助开发者提高工作效率,简化工作流程,并提供更好的用户体验。本文将介绍Unity编辑器扩展的基本概念、开发流程以及一些常见的应用示…...
【kettle】kettle访问数据库系列文章及视频地址(更新中)
1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.这里整理了kettle访问数据库系列文章及视频地址整体链接,并及时补充、更新相关…...
共赴科技盛会“2024南京智博会”11月在南京国际博览中心召开
2024年,南京这座历史悠久的文化名城迎来了一场科技与智慧交织的盛会——南京智博会|南京国际智慧城市、物联网、大数据。本次博览会以智慧城市、人工智能、消费电子、物联网、大数据为主题,汇聚了全球各地的智能科技精英,共同探讨智慧城市建设…...
刷代码随想录有感(62):修建二叉搜索树
题干: 代码: class Solution { public:TreeNode* traversal(TreeNode* root, int low, int high){if(root NULL)return NULL;if(root->val < low)return traversal(root->right, low, high);if(root->val > high)return traversal(ro…...
AVL树的旋转
目录 1.平衡因子 2.旋转 a.节点定义 b.插入 插入 平衡因子更新 旋转 左单旋 右单旋 右左双旋 左右双旋 3.AVL树的验证 1.平衡因子 我们知道搜索二叉树有缺陷,就是不平衡,比如下面的树 什么是搜索树的平衡?就是每个节点的左右子树的…...
C++(动态规划之拆分整数)
其实我交上去都有点似懂非懂 题目:(343. 整数拆分 - 力扣(LeetCode)) 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 …...
unix C之环境变量
什么是环境变量 每个进程都有自己的一张环境变量表,表中的每个条目都是形如 keyvalue 的键值对形式的环境变量。 进程可以通过环境变量访问计算机资源。 在终端下输入env命令,可以查看环境变量列表。 通过echo $name 可以查看某个环境变量的值。 环…...
Flutter实战记录-协作开发遇到的问题
一.前言 Android项目使用了混合架构,部分模块使用Flutter进行开发。在电脑A上开发的项目提交到git仓库,电脑B拉取后进行操作,遇到两个问题,特此做一下记录; 二.问题A Settings file ‘D:\xxx\settings.gradle’ line…...
Linux 安装JDK和Idea
安装JDK 下载安装包 下载地址: Java Downloads | Oracle (1) 使用xshell 上传JDK到虚拟机 (2) 移动JDK 包到/opt/environment cd ~ cd /opt sudo mkdir environment # 在 /opt下创建一个environment文件夹 ls# 复制JDK包dao /opt/environment下 cd 下载 ls jd…...
c#绘制渐变色的Led
项目场景: c#绘制渐变色的button using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using static System.Windows.Forms.AxHost;namespace WindowsFormsApp2 {public class Gradie…...
LifeCycle之ProcessLifeCycleOwner
问题:想要知道应用程序当前处在前台、后台、或从后台回到前台,想要知道应用的状态, LifeCycle提供了ProcessLifeCycleOwner的类,方便我们知道整个应用程序的生命周期情况 ProcessLifeCycleOwner 使用方法 1.首先添加依赖 imple…...
C++ | Leetcode C++题解之第79题单词搜索
题目: 题解: class Solution { public:bool exist(vector<vector<char>>& board, string word) {rows board.size();cols board[0].size();for(int i 0; i < rows; i) {for(int j 0; j < cols; j) {if (dfs(board, word, i, …...
如何通过PHP语言实现远程控制空调
如何通过PHP语言实现远程控制空调呢? 本文描述了使用PHP语言调用HTTP接口,实现控制空调,通过不同规格的通断器,来控制不同功率的空调的电源。 可选用产品:可根据实际场景需求,选择对应的规格 序号设备名称…...
【AI+换脸换装】从OpenAI 探索色情露骨内容领域浅聊AI换脸换装
5月9日消息,据外电报道,OpenAI 周三发布了文档草案,阐述了它希望 ChatGPT 及其其他人工智能技术如何运作。冗长的Model Spec 文件的一部分透露,该公司正在探索进军色情和其他露骨内容领域。 看完这个,心里有点惊讶&am…...
Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗
Flutter笔记 Widgets Easier组件库(13)使用底部弹窗 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …...
RobbitMQ基本消息队列的消息发送过程
RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ官网 SpringAmqp的官方地址:Spring AMQP 代码示例:对着代码看应该能看明白 publisher:消息发送者的代码示例 package cn.itcast.mq.helloworld;import com.rabbitmq.client.Channel; import com.rabb…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
