【STM32定时器 TIM小总结】
STM32 TIM详解
- TIM介绍
- 定时器类型
- 基本定时器
- 通用定时器
- 高级定时器
- 常用名词
- 时序图
- 预分频时序
- 计数器时序图
- 定时器中断配置图
- 定时器定时
- 代码调试
TIM介绍
定时器(Timer)是微控制器中的一个重要模块,用于生成定时和延时信号,以及处理定时事件。在STM32系列微控制器中,定时器通常用于以下几个方面:
-
定时器功能: 定时器可以生成精确的定时信号,用于定时器中断、PWM(脉冲宽度调制)、计时等应用。它可以产生周期性的计数器溢出事件,也可以产生比较匹配和捕获事件。
-
PWM生成: 定时器可以用于产生PWM信号,用于控制电机速度、调光、音频产生等应用。
-
计时功能: 定时器可以用于测量时间间隔,计算时间延迟,或者用于定时测量外部事件的频率。
-
输入捕获和输出比较: 定时器可以用于捕获外部事件的时间戳,也可以用于与比较器进行比较,并产生相应的事件。
在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);//使能定时器中断//下面这行程序后面还有中断使能开关,中断标志置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开始
个人总结复习使用,如果对你也有帮助,那可真是小舞的荣幸。
相关文章:

【STM32定时器 TIM小总结】
STM32 TIM详解 TIM介绍定时器类型基本定时器通用定时器高级定时器常用名词时序图预分频时序计数器时序图 定时器中断配置图定时器定时 代码调试 TIM介绍 定时器(Timer)是微控制器中的一个重要模块,用于生成定时和延时信号,以及处…...

RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools
RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools 编译环境搭建以及说明 操作系统:什么系统都可以 虚拟机:VMmare Workstation Pro 17.50.x (版本不限) 编译环境:Ubuntu 18.04.5 CPU:i7-8750h(虚拟机分配4核…...

一文速通ESP32(基于MicroPython)——含示例代码
ESP32 简介 ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管…...

记录一次业务遇到的sql问题
刚开始工作 业务能力比较薄弱 记录一下这几天遇见的一个业务问题 场景 先简单说一下场景,有一批客户(一张表),可以根据这个客户匹配出很多明细数据(另一张表),现在需要删除明细,一个…...

代码分支管理
代码分支管理规范 一、分支管理要求 分支管理 • 将代码提交到适当的分支,遵循分支管理策略。 • 随时可以切换到线上稳定版本代码,确保可以快速回滚到稳定版本。 • 同时进行多个版本的开发工作,确保分支清晰,避免混淆。提交记录的可读性 • 提交描述准确,具有可检索性,…...

uniapp sqlite时在无法读取到已准备好数据的db文件中的数据
问题 {“code”:-1404,“message”:“android.database.sqlite.SQLiteException: no such table: user (Sqlite code 1): , while compiling: select * from user, (OS error - 2:No such file or directory),http://ask.dcloud.net.cn/article/282”} at pages/index/index.vu…...

源码编译部署LAMP
编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…...

Echo框架:高性能的Golang Web框架
Echo框架:高性能的Golang Web框架 在Golang的Web开发领域,选择一个适合的框架是构建高性能和可扩展应用程序的关键。Echo是一个备受推崇的Golang Web框架,以其简洁高效和强大功能而广受欢迎。本文将介绍Echo框架的基本特点、使用方式及其优势…...

数据结构--七大排序算法(更新ing)
下面算法编写的均是按照由小到大排序版本 选择排序 思想: 每次遍历待排序元素的最大下标,与待排序元素中最后一个元素交换位置(此时需要设置一个临时变量来存放下标) 时间复杂度--O(n^2) 空间复杂度--O(1) 稳定性--不稳定 代码实…...

202203青少年软件编程(图形化) 等级考试试卷(二级)
第1题:【 单选题】 红框中加入哪个选项积木, 不能阻止气球下落? ( ) A: B: C: D: 【正确答案】: D 【试题解析】 : 第2题:【 单选题】 下图分别是两个角色的初始位置和“黑色圆形”的程序, 点击绿旗后, 角色显示为下列哪个选项?( ) A: B: C: D: 【正确答…...

【智能硬件、大模型、LLM 智能音箱】Emo:基于树莓派 4B DIY 能笑会动的桌面机器人
简介 Emo 是一款个人伴侣机器人,集时尚与创新于一身。他的诞生离不开最新的树莓派 4 技术和先进的设计。他不仅仅是一款机器人,更是一个活生生的存在。与其他机器人不同,他拥有独特的个性和情感,能够俘获你的心灵。 硬件部分 – 树莓派 4B – 微雪 2 英寸 IPS LCD 显示屏…...

rust学习笔记(1-7)
原文 8万字带你入门Rust 1.包管理工具Cargo 新建项目 1)打开 cmd 输入命令查看 cargo 版本 cargo --version2) 使用 cargo new 项目名 在文件夹,按 shift 鼠标右键 ,打开命令行,运行如下命令,即可创建…...

vscode jupyter 如何关闭声音
网上之前搜的zen模式失败 仅仅降低sound失败 #以下是成功方式: 首先确保user和remote的声音都是0: 然后把user和remote的以下设置都设置为off就行了! 具体操作参考 https://stackoverflow.com/questions/54173462/how-to-turn-off-or-on-so…...

plt保存PDF矢量文件中嵌入可编辑字体(可illustrator编辑)
背景: 用默认 plt.savefig() 保存图片,图中文字是以瞄点保存,而不是以文字格式。在编辑矢量图中,无法调整文字大小和字体。 方法: import matplotlib.pyplot as plt import numpy as np# ------输出的图片为illustr…...

Nacos与Eureka的使用与区别
Nacos与Eureka的使用与区别 单体架构:优点缺点 分布式架构需要考虑的问题:微服务企业需求 认识SpringCloud服务的拆分与远程调用微服务调用方式 Eureka提供者和消费者架构搭建Eureka服务注册服务发现 Ribbon负载均衡饥饿加载总结 Nacos注册中心Nacos安装…...

利用express从0到1搭建后端服务
目录 步骤一:安装开发工具步骤二:安装插件步骤三:安装nodejs步骤四:搭建启动入口文件步骤五:启动服务器总结 在日常工作中,有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…...

如何在Ubuntu中查看编辑lvgl的demo和examples?
如何在Ubuntu中查看编辑lvgl的demo和examples? 如何在 Ubuntu系统中运行查看lvgl 1、拉取代码 在lvgl的github主页面有50多个仓库,找到lv_port_pc_eclipse这个仓库,点进去 拉取仓库代码和子仓库代码 仓库网址:https://github…...

深入了解 大语言模型(LLM)微调方法
引言 众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。 那么&…...
C语言之快速排序
目录 一 简介 二 代码实现 快速排序基本原理: C语言实现快速排序的核心函数: 三 时空复杂度 A.时间复杂度 B.空间复杂度 C.总结: 一 简介 快速排序是一种高效的、基于分治策略的比较排序算法,由英国计算机科学家C.A.R. H…...

获取扇区航班数
1、Spark Streaming清洗服务,接收kafka中Topic为“task_ATC”中的数据,保存在MySQL中。 打开SpringBoot项目BigData-Etl-KongGuan 请认真阅读:在前面的“使用Spark清洗统计业务数据并保存到数据库中”任务阶段中应该已经完成了所有Topic的数…...

【已解决】npm install卡主不动的情况
使用 npm install 初始化前端项目时,会出现卡住不动的情况。原因是淘宝镜像源由原来的https://registry.npm.taobao.org 更换为下面这个: https://registry.npmmirror.com 直接在终端执行下面的指令即可: npm config set registry https://re…...

Golang协程详解
一.协程的引入 1.通过案例文章引入并发,协程概念 见:[go学习笔记.第十四章.协程和管道] 1.协程的引入,调度模型,协程资源竞争问题 通过上面文章可以总结出Go并发编程原理: 在一个处理进程中通过关键字 go 启用多个协程,然后在不同的协程中完成不同的子任…...

git:码云仓库提交以及Spring项目创建
git:码云仓库提交 1 前言 码云访问稳定性优于github,首先准备好码云的账户: 官网下载GIT,打开git bash: 查看当前用户的所有GIT仓库,需要查看全局的配置信息,使用如下命令: git …...

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突
【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到…...

【机器学习-02】矩阵基础运算---numpy操作
在机器学习-01中,我们介绍了关于机器学习的一般建模流程,并且在基本没有数学公式和代码的情况下,简单介绍了关于线性回归的一般实现形式。不过这只是在初学阶段、为了不增加基础概念理解难度所采取的方法,但所有的技术最终都是为了…...

《A Second-Order PHD Filter With Mean and Variance in Target Number》学习心得
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. 主要内容2. PHD、CPHD和SO-PHD之间的差别2.1 PHD2.2 CPHD2.3 SO-PHD2.4 关于“CPHD对每个可能的目标数量状态进行建模”3. PHD、CPHD和SO-PHD描述目标数量分布所用的参数3.1 PHD所用参数3.2 CPH…...

React 实现下拉刷新效果
简介 本文基于react实现下拉刷新效果,在下拉的时候会进入loading状态。 实现效果 效果如上图所示,在下拉到底部时候,会出现loading条,在处理完成后loading条消失。 具体代码 布局 & 逻辑 import {useRef, useState} from …...

使用endnote插入引用文献导致word英文和数字变成符号的解决方案
使用endnote插入引用文献导致word英文和数字变成符号的解决方案 如图使用endnote插入引用文献导致word英文和数字变成符号字体Wingdings Wingdings 是一个符号字体系列,它将许多字母渲染成各式各样的符号,用途十分广泛。 解决方法: 直接通过更…...

npm下载慢换国内镜像地址
1 设置淘宝镜像地址 npm config set registry http://registry.npm.taobao.org 2 查看当前下载地址 npm config get registry 3 其它镜像地址列表: 1. 官方镜像:https://registry.npmjs.org/ 2. 淘宝镜像:https://registry.npm.taobao.o…...

开源绘图工具 PlantUML 入门教程(常用于画类图、用例图、时序图等)
文章目录 一、类图二、用例图三、时序图 一、类图 类的UML图示 startuml skinparam classAttributeIconSize 0 class Dummy {-field1 : String#field2 : int~method1() : Stringmethod2() : void } enduml定义能见度(可访问性) startumlclass Dummy {-f…...