STM32(七)———TIM定时器(基本and通用)
文章目录
- 前言
- 一、通用定时器TIM简介
- 1.STM32F10X系列总共最多有八个定时器:
- 2.三种STM32定时器的区别:
- 3.STM32 的通用定时器功能:
- 4.计数器模式
- 二、基本定时器
- 1.基本定时器的结构框图
- 2.定时时间的计算
- 3.定时器的结构体和库函数
- 总结
前言
一个学习STM32的小白~ 有错误评论区或私信指出
一、通用定时器TIM简介
1.STM32F10X系列总共最多有八个定时器:
2.三种STM32定时器的区别:
3.STM32 的通用定时器功能:
- 16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下自动装载计数器
(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式 - 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~ 65535 之间的任意数值
- 4 个独立通道(TIMx_CH14,TIM9TIM14 最多 2 个通道),这些通道可以用来作为:
- 输入捕获
- 输出比较
- PWM 生成(边缘或中间对齐模式) ,注意:TIM9~TIM14 不支持中间对齐模式
- 单脉冲模式输出
- 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
- 如下事件发生时产生中断/DMA(TIM9~TIM14 不支持 DMA):
- 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
- 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
- 输入捕获
- 输出比较
- 支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不支持)
- 触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持)
4.计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式
- 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件
- 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件
- 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数
二、基本定时器
1.基本定时器的结构框图
- 时钟源
- 控制器
- 时基单元
时钟源
- 时钟源来自RCC的TIMx_CLK(属于内部的CK_INIT)
控制器 - 控制器用于控制定时器:复位、使能、计数、触发ADC
涉及到的寄存器:CR1/2,DIER,EGR,SR
时基(定时器的心脏) - 定时器最重要的就是时基部分:包括预分频器、计数器、自动重装载寄存器
- 预分频器:16位预分频器(1~65536)PSC对内部时钟CK_PSC进行分频之后,得到计数器时钟CK_INT=CK_PSC/(PSC+1)
- CNT在计数器时钟的驱动下开始计数,计数一次的时间为1/CK_INT
- 计数器、重装在寄存器:定时器使能(CEN置1)后,计数器CNT在CK_CNT驱动下计数,当TNT值与ARR的设定值相等时就自动生成事件并CNT自动清零,然后自动重新开始计数,如此重复以上过程。
影子寄存器
1.PSC和ARR都有影子寄存器,功能框图上有个影子
2.影子寄存器的存在起到一个缓冲的作用,用户值->寄存器->影子寄存器->起作用,
如果不使用影子寄存器则用户值在写到寄存器之后则里面起作用,ARR影子,
TIMx_CR1:APRE位控制。
2.定时时间的计算
- PSC=72-1,定时器的频率 = 72M/(PSC+1) = 1MHZ
- ARR = 1000 -1,从0计数到999,则计了1000次
- 中断周期T = 1000 * 1 /1 000 000 = 1ms
3.定时器的结构体和库函数
时基初始化结构体:typedef struct{uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode;
uint16_t TIM_Period;
//分频因子
//计数模式,基本定时器只能向上计数
//自动重装载值
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter; //重复计数值,基本定时器没有,高级定时器
专用
} TIM_TimeBaseInitTypeDef;
常用的库函数:
//外部输入时钟分频因子,基本定时器没有
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*
TIM_TimeBaseInitStruct);void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef*
TIM_TimeBaseInitStruct);void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState
NewState);void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler,
uint16_t TIM_PSCReloadMode);void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState
NewState);
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
练习:
如何实现500ms的定时?
void tim_Init(void)
{TIM_TimeBaseInitTypeDef tim_InitStructure;NVIC_InitTypeDef nvic_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);tim_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频tim_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数tim_InitStructure.TIM_Prescaler = 36000-1;//预分频tim_InitStructure.TIM_Period = 1000-1;//ARR自动重装TIM_ClearFlag(TIM2,TIM_FLAG_Update);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);TIM_TimeBaseInit(TIM2,&tim_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);nvic_InitStructure.NVIC_IRQChannel = TIM2_IRQn;nvic_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;nvic_InitStructure.NVIC_IRQChannelSubPriority = 1;nvic_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_InitStructure);TIM_Cmd(TIM2,ENABLE);}
定时器控制LED闪烁
软件流程设计
- 初始化系统
- 初始化定时器和LED的IO时钟
- 初始化LED的引脚IO
- 定时器中断中驱动LED灯
#include "tim.h"
#include "stm32f10x.h" // Device headervoid tim_Init(void)
{TIM_TimeBaseInitTypeDef tim_InitStructure;NVIC_InitTypeDef nvic_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);tim_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频tim_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数tim_InitStructure.TIM_Prescaler = 36000-1;//预分频tim_InitStructure.TIM_Period = 1000-1;//ARR自动重装TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清楚更新事件标志位防止一进来就更新TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开中断TIM_TimeBaseInit(TIM2,&tim_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);nvic_InitStructure.NVIC_IRQChannel = TIM2_IRQn;nvic_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;nvic_InitStructure.NVIC_IRQChannelSubPriority = 1;nvic_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvic_InitStructure);TIM_Cmd(TIM2,ENABLE);//开定时器}void TIM2_IRQHandler(void)
{static uint16_t Count;if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET){if(Count++ % 2 == 1){GPIO_ResetBits(GPIOA,GPIO_Pin_1);}else{GPIO_SetBits(GPIOA,GPIO_Pin_1);}}TIM_ClearFlag(TIM2,TIM_IT_Update);//清除中断标志位}
总结
定时器非常重要!!!
注:定时器中断要软件开启(TIM_ITConfig),要开启定时器(TIM_cmd)!!!
相关文章:

STM32(七)———TIM定时器(基本and通用)
文章目录 前言一、通用定时器TIM简介1.STM32F10X系列总共最多有八个定时器:2.三种STM32定时器的区别:3.STM32 的通用定时器功能:4.计数器模式 二、基本定时器1.基本定时器的结构框图2.定时时间的计算3.定时器的结构体和库函数 总结 前言 一个…...

Spring中网络请求客户端WebClient的使用详解
Spring中网络请求客户端WebClient的使用详解_java_脚本之家 Spring5的WebClient使用详解-腾讯云开发者社区-腾讯云 在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 …...

那些年我为了考PMP踩过的坑.....
说到考PMP我尊嘟很难过且伤心,众所周知,报考PMP都是要报机构的而且还是PMI认证的机构,所以在报考PMP过程中选的机构我可以说踩过了很多坑了...... Q:包过吗? 大家千万不要信某某机构说的包过噱头,真的很坑…...
邦芒解析:新人入职后存在的三种职场心理误区
多数职场新人会认为自己工作不快乐,不能正确处理职场人际关系。尤其是新人入职后在处理人际关系方面更明显,下面简述新人入职后主要存在的三种职场心理误区。 误区一:面对对上司的恐惧 学会和上司沟通,新人要采用上司容易接受…...

MFC案例:利用SetTimer函数编写一个“计时器”程序
一、希望达成效果 利用基于对话框的MFC项目,做一个一方面能够显示当前时间;另一方面在点击开始按钮时进行读秒计时,计时结果动态显示,当点击结束时读秒结束并保持最后结果。 二、编程步骤及相关代码、注释 1、启动VS…...

2. 音视频H264
视频软件基本流程 1.什么是H264 H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准 H265又名高…...

烽宇团队回报社会,走进贵州山区公益行
贵州省——在一片美丽的黔山秀水间,烽宇团队成员用实际行动诠释了“取之于民,用之于民”的公益精神。作为在科技和商业领域取得显著成就的团队,烽宇团队不仅在商业上取得了辉煌的成绩,还积极投身于社会公益事业,回报社会。 取之于民,用之于民 近年来,烽宇团队在多位行业领袖的…...

硬盘格式化NTFS好还是exFAT好 U盘存储文件用哪个格式好? 硬盘用exfat还是ntfs mac不能读取移动硬盘怎么解决
在计算机世界中,文件系统是数据管理的基石,而NTFS和exFAT无疑是这块基石上的两大巨头。它们各自拥有独特的特点和优势,并在不同的使用场景中发挥着重要作用。 什么是文件系统 文件系统提供了组织驱动器的方法。它规定了如何在驱动器上存储数…...
Elasticsearch机器学习初探:智能数据洞察
在当今数据驱动的时代,企业越来越依赖于数据来做出明智的决策。然而,随着数据量的不断增长和复杂性的增加,传统的数据分析方法已经无法满足快速、准确洞察数据的需求。为了应对这一挑战,Elasticsearch引入了机器学习功能ÿ…...

贪心算法——赶作业(C++)
慢慢来,沉稳一点。 2024年6月18日 题目描述 A同学有n份作业要做,每份作业有一个最后期限,如果在最后期限后交作业就会扣分,现在假设完成每份作业都需要一天。A同学想安排作业顺序,把扣分降到最低,请帮他实…...

Python 数据可视化 多色散点图
Python 数据可视化 多色散点图 fig, ax plt.subplots() max_line max([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) min_line min([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) ax.plot([min_line, max_line], [min_line, …...

C语言入门系列:数据类型之浮点数
文章目录 一,什么是浮点数二,C语言中的浮点数1,float1.1 float的声明1.2 float的存储格式1.3 float的精度和范围 2,double2.1 double变量的声明2.2 double的存储格式1.3 double的精度和范围1.4 long double 3,0.2 0.1…...

思科配置路由器,四台主机互相ping通
一、如图配置 PC4和PC5用来配置路由器,各ip、接口如图所示。 二、配置各主机ip、子网掩码SNM、默认网关DGW (一)、PC0 (二)、PC1 (三)、PC2 (四)、PC3 三、 配置路由器Router0 (期间报错是打错了字母) Router>en Router#configure terminal Enter configurat…...

个人博客测试用例设计
个人博客测试用例设计 个人博客测试用例 分别从功能、性能、安全、兼容及界面分别展开 个人博客测试用例...

Java输入输出语句 和 保留字
目录 键盘输入语句 保留字 键盘输入语句 Input.java , 需要一个 扫描器(对象), 就是Scanner 步骤 : 导入该类的所在包, java.util.*创建该类对象(声明变量)调用里面的功能 案例要求:可以从控制台接收用户信息,【姓…...

生成对抗网络——GAN深度卷积实现(代码+理解)
本篇博客为 上篇博客的 另一个实现版本,训练流程相同,所以只实现代码,感兴趣可以跳转看一下。 生成对抗网络—GAN(代码理解) http://t.csdnimg.cn/HDfLOhttp://t.csdnimg.cn/HDfLO 目录 一、GAN深度卷积实现 1. 模型…...

gbase8s数据库阻塞检查点和非阻塞检查点的执行机制
1. 检查点的描述 为了便于数据库系统的复原和逻辑恢复,数据库服务器生成的一致性标志点,称为检查点,其是建立在数据库系统的已知和一致状态时日志中的某个时间点检查点的目的在于定期将逻辑日志中的重新启动点向前移动 如果存在检查点&#…...

ARM32开发--串口库封装(初级)
知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中,封装抽取流程和抽取封装策略是非常重要的技术,能够提高代码的复用性和可维护性。本文将介绍如何在文…...
统一管理:Vue公共组件/公共样式/全局自定义指令
main.js 引入存放公共文件的文件路径 import "./plugins";src/plugins文件夹下的index.js 在处理公共文件中分别引入 /* 公共引入,勿随意修改,修改时需经过确认 */ import Vue from "vue";import "/icons"; // 图标 import ByuiQueryForm fr…...

Linux之旅: 基础知识点的终极指南
文章目录 1、Linux的目录结构2、ls命令3、管理文件和目录4、linux命令使用细节和技巧5、权限管理基本命令6、搜索命令7、管道符与重定向8、压缩和解压命令9、用户及vim编辑器10、用户和用户组管理一、Linux系统用户账号的基本管理二、Linux系统用户组的管理 1、Linux的目录结构…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...