STM32定时器---基本定时器
目录
一、定时器的概述
二、时基单元
三、基本定时器的的时序
(1)预分频器时序
(2)计数器时序
四、基本定时器的使用
一、定时器的概述
在没有定时器的时候,我们想要延时往往都是写一个Delay函数,里面执行许多的空操作得到的。但是这样的方式不能保证定时的准确性和扩展性,同时在等待期间CPU是无法执行其他函数的。换句话说CPU在死等待。
而定时功能又是一个非常重要的工具,我们在使用各种外设的时候,往往需要定时器来进行时序确认、来其他操作的同步性等等。STM32也必然包含了这种功能。
定时器原理:
使用晶振分频后的时钟频率进行计数,通过硬件的方式,不断让计数器++,当计数器的值满足你预期的时候,说明时钟定时结束。此时计数器会对外触发一个中断信号。
由于晶振的频率十分精准,所以这样定时往往精度较高,且不依赖CPU可以在定时期间释放CPU的工作资源,进而提高效率。
二、时基单元
下图是手册中找到的基本定时器结构框图:这个我们也称为时基单元,他作为其他通用定时器、高级定时器的一部分使用
分析这个图可以知道基本定时器的运行流程:
(1)时钟信号从TIMxCLK线发送到定时器的控制器。
(2)控制器将时钟信号经过预分频后传递给计数器。
(3)每来一个时钟周期,计数器++。
(4)当计数器的值和自动重装寄存器的值相同的时候,对外触发中断信号,或者由触发控制器对外触发TRGO信号到ADC。(这里的中断信号和触发事件可以同时配置,互不影响)
(5)同时计数器的值清零,重新开始计数。
我们把时钟树和基本定时器的框图结合起来看看。
时钟树中有一句话是这样说的:如果APB1预分频系数为1,则频率不变,否则频率*2。这个我们该如何理解呢?
APB1接的是AHB总线的时钟,经过APB1预分频器分频得到APB1总线的时钟。本来呢如果预分频系数为1,则APB1的时钟频率应该是72MHz,单丝这幅图中其实隐藏了一个部分,他接在APB1预分频器之后,且在定时器接线处之后,他使得APB1其他外设的频率永远不能超过36MHz。此时定时器频率率仍然为72MHz。
当APB2的预分频系数>1的时候,定时器的时钟频率则为APB1总线频率的两倍。且此时APB1总线的频率也会<36MHz。
- 例如:
- 系统时钟 72MHz,APB1 预分频系数为 4,则 APB1 时钟为 18MHz,定时器时钟为 36MHz。
- 系统时钟 72MHz,APB1 预分频系数为 2,则 APB1 时钟为 36MHz,定时器时钟为 72MHz。
- 结论:APB1 上的定时器时钟可能为 72MHz 或 36MHz,具体取决于 APB1 的预分频系数。
- 不同STM32型号的默认APB1预分频系数可能不同。例如:
- STM32F103:默认APB1预分频系数 = 2(导致APB1总线频率 = 36MHz,当SYSCLK=72MHz时)。
- 其他型号:可能默认APB1预分频系数 = 1(导致APB1总线频率 = SYSCLK)。
我们可以尝试计算一下一个时基单元最长的定时时间:
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
16为计数器,意味着最多可以从0计数到65536个数,而一个数的时间为一个时钟周期。
假设我们采取默认的分频方式,即APB1时钟频率为36MHz,APB1的定时器时钟频率为72MHz。计算出该情况下一个时基单元的最长定时长度不到一分钟。
当然,基本定时器由于不支持定时器级联功能,所以最长定时时间看起来不多,如果你使用通用定时器,一个定时器的输出可以作为下一个定时器的输入的话,则最长时间将变为42亿年多。
三、基本定时器的的时序
(1)预分频器时序
预分频可以以系数介于1至65536之间的任意数值对计数器时钟分频。它是通过一个16位寄存器(TIMx_PSC)的计数实现分频。因为TIMx_PSC控制寄存器具有缓冲,可以在运行过程中改变它
的数值,新的预分频数值将在下一个更新事件时起作用。
这里有一个概念,叫做预分频器控制寄存器(1)和预分频器缓冲器(2)。这个2号我们也称为影子寄存器。
当你通过代码修改预分频器的分频规则的时候其实是修改预分频器控制寄存器(1),此时预分频器缓冲器(2)不受任何影响。分频器仍旧按照之前的分频规则向计数器传递信号。当这一次计数器达到自动重装寄存器的值后,产生中断信号、更新事件的同时,预分频器控制寄存器(1)的值才会填入预分频器缓冲器(2)。
简而言之,真正起作用的是2号预分频器缓冲器。之所以STM32要这么设计是为了防止在一个定时周期内修改了分频规则导致该次定时时间的错误。
同理:自动重装寄存器也会有一个影子寄存器。作用和上述类似。
(2)计数器时序
计数器时序与上图类似,不再赘述。
四、基本定时器的使用
从上面的过程我们可以把配置流程抽象成下图所示:
不过由于基本定时器没有接入到GPIO引脚,所以仅能使用内部时钟源作为定时器使用、或用于主模式触发DAC功能。如果你想使用计数功能、或使用外部时钟源,则可以选择使用基本定时器或者高级定时器。
下面是配置函数示例:
#include "time6.h"
#include "stm32f10x.h"
#include <stdio.h>
#include "led.h"void TIM6_Init(uint16_t psc, uint16_t arr)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;// 1. 开启 TIM6 时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);// 2. 配置 TIM6TIM_TimeBaseStructure.TIM_Prescaler = psc; // 预分频系数TIM_TimeBaseStructure.TIM_Period = arr; // 自动重装载值TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数模式:向上计数TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);//3.清除中断挂起位,避免程序启动时触发意外中断TIM_ClearITPendingBit(TIM6, TIM_IT_Update);// 4. 使能 TIM6 更新中断TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);// 5. 配置 NVIC 中断优先级NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 6. 启动 TIM6TIM_Cmd(TIM6, ENABLE);
}// TIM6 中断处理函数
void TIM6_IRQHandler(void)
{if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) // 检查中断标志{TIM_ClearITPendingBit(TIM6, TIM_IT_Update); // 清除中断标志//处理逻辑}
}
相关文章:

STM32定时器---基本定时器
目录 一、定时器的概述 二、时基单元 三、基本定时器的的时序 (1)预分频器时序 (2)计数器时序 四、基本定时器的使用 一、定时器的概述 在没有定时器的时候,我们想要延时往往都是写一个Delay函数,里面…...
mysql快速在不同库中执行相同的sql
目录 背景 解决方案 方式一:利用变量拼接好sql,复制出来执行(简单,推荐) 方式二:使用存储过程和游标实现(比较复杂,脚本需要拼接一个完整的,也比较麻烦,不…...

大模型微调 - transformer架构
什么是Transformer Transformer 架构是由 Vaswani 等人在 2017 年提出的一种深度学习模型架构,首次发表于论文《Attention is All You Need》中 Transformer 的结构 Transformer 编码器(Encoder) 解码器(Decoder) …...
【器件专题1——IGBT第1讲】IGBT:电力电子领域的 “万能开关”,如何撑起新能源时代?
一、IGBT 是什么?重新认识这个 “低调的电力心脏” 你可能没听过 IGBT,但一定用过它驱动的设备:家里的变频空调、路上的电动汽车、屋顶的光伏逆变器,甚至高铁和电网的核心部件里,都藏着这个 “电力电子开关的瑞士军刀”…...
文件IO(Java)
注:此博文为本人学习过程中的笔记 1.概念 狭义上的文件是指保存在硬盘上的文件,广义上指操作系统进行资源管理的一种机制,很多软件/硬件资源都可以抽象成文件,这里我们针对的是狭义上的文件。 在硬盘里还有文件夹,这…...
常见缓存淘汰算法(LRU、LFU、FIFO)的区别与实现
一、前言 缓存淘汰算法主要用于在内存资源有限的情况下,优化缓存空间的使用效率。以确保缓存系统在容量不足时能够智能地选择需要移除的数据。 二、LRU(Least Recently Used) 核心思想:淘汰最久未被访问的数据。实现方式&#x…...

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成
在GEE中实现时,发现简单的QA60是无法去云的,最近S2地表反射率数据集又进行了更新,原有的属性集也进行了变化,现在的SR数据集名称是“S2_SR_HARMONIZED”。那么: 要想得到研究区无云的图像,可以参考执行以下…...

HTMLCSS模板实现水滴动画效果
.container 类:定义了页面的容器样式。 display: flex:使容器成为弹性容器,方便对其子元素进行布局。justify-content: center 和 align-items: center:分别使子元素在水平和垂直方向上居中对齐。min-height: 100vh:设…...
Cesium实现地形可视域分析
Cesium实现可视化分析 一、地形可视域主要实现技术(Ray + 地形碰撞检测) Cesium 本身的 Ray 类可以用来执行非常精确的射线检测,我们可以结合地形高度(sample)来逐点检测光线是否与 terrain 相交,从而判断是否可见。 1.1 优势 实时判断每条射线是否被 terrain 遮挡地形…...
前端如何获取文件的 Hash 值?多种方式详解、对比与实践指南
文章目录 前言一、Hash 值为何重要?二、Hash 值基础知识2.1 什么是 Hash?2.2 Hash 在前端的应用场景2.3 常见的 Hash 算法(MD5、SHA 系列) 三、前端获取文件 Hash 的常用方式3.1 使用 SparkMD5 计算 MD5 值3.2 使用 Web Crypto AP…...

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?
在智慧城市、能源管理、工业4.0等领域的快速发展中,地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生,成为破解这一难题的核心工具。…...
蓝桥杯 16.对局匹配
对局匹配 原题目链接 题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。 小明发现,网站的自动对局系统在匹配对手时,只会将积分差恰好是 K 的两名用户匹配在一起。如果两人分差小…...

【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)
目录 创建容器 安装miniconda 安装mineru CPU运行 GPU加速 多卡问题 创建容器 构建Dockerfile文件 开启ssh服务,设置密码为1234等操作 # 使用官方 Ubuntu 24.04 镜像 FROM ubuntu:24.04# 安装基础工具和SSH服务 RUN apt-get update && \apt-get ins…...
DeepSeek回答过于笼统,提示词如何优化
针对DeepSeek回答过于笼统的问题,可通过以下方法优化,使输出更具体、详细: 一、优化提示词设计 明确具体要求 在提问中嵌入「背景限制示例」,例如: “作为跨境电商运营新手,请详细说明如何优化亚马逊产品标…...
C语言实现贪心算法
一、贪心算法核心思想 特征:在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局最优解 适用场景:需要满足贪心选择性质和最优子结构性质 二、经典贪心算法示例 1. 活动选择问题 目标:…...
全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)
一、行业全景:从“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作为第三代半导体材料的代表,凭借其宽禁带(3.26eV)、高临界击穿场强(3MV/cm)、高热导率(4.9W/cmK&…...
FreeRTOS学习笔记【10】-----任务上下文切换
1 概念性内容 开机到调度需要经历的步骤有: 系统初始化任务创建启动调度器上下文切换时间分片任务执行 1.1 任务本质 FreeRTOS 的 任务(Task)本质上就是一个运行在任务自己的栈区中无限循环的函数 一段上下文(context&#x…...

Appium自动化开发环境搭建
自动化 文章目录 自动化前言 前言 Appium是一款开源工具,用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windows sdk编写的应用。移动网页应用是通过移动浏览器访问的网页应用(appum支持iOS和Chrom…...

C++学习-入门到精通-【1】C++编程入门,输入/输出和运算符
C学习-入门到精通-【1】C编程入门,输入/输出和运算符 C编程入门,输入/输出和运算符 C学习-入门到精通-【1】C编程入门,输入/输出和运算符第一个C程序:输出一行文本算术运算 第一个C程序:输出一行文本 // 文本打印程序…...
UOJ 228 基础数据结构练习题 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分三种: add ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...

面向高性能运动控制的MCU:架构创新、算法优化与应用分析
摘要:现代工业自动化、汽车电子以及商业航天等领域对运动控制MCU的性能要求不断提升。本文以国科安芯的MCU芯片AS32A601为例,从架构创新、算法优化到实际应用案例,全方位展示其在高性能运动控制领域的优势与潜力。该MCU以32位RISC-V指令集为基…...

某地农产品交易中心钢网架自动化监测项目
1. 项目简介 本项目规划建设现代物流产业园,新建6万平方米仓库,具体为新建3栋钢构仓库2万平方米,2栋砖混结构仓库1万平方米,3栋交易中心2万平方米,改造现有3栋3层砖混结构仓库1万平方米,配备智能化仓库物流…...

【无人机】无人机位置估计出现偏差的原因分析
目录 #0、原因分析 #1、过度振动的测定 #2、确定过度陀螺仪偏差 #3、偏航精度差的测定 #4、确定 GPS 精度差 #5、确定 GPS 数据丢失 #6、气压计地面效应补偿 #0、原因分析 位置背离的最常见原因是: 参考:Using the ECL EKF | PX4 Guide (v1.15)…...

element-plus(vue3)表单el-select下拉框的远程分页下拉触底关键字搜索实现
一、基础内核-自定义指令 1.背景 2.定义 3.使用 4.注意 当编辑时需要回显,此时由于分页导致可能匹配不到对应label文本显示,此时可以这样解决 二、升级使用-二次封装组件 三、核心代码 1.自定义指令 定义 ----------------selectLoadMoreDirective.…...

轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!
小白工具的在线视频编辑https://www.xiaobaitool.net/videos/edit/ 功能丰富、操作简便,在线裁剪或编辑视频工具,轻松完成视频创作能满足多种视频编辑需求。 格式支持广泛:可编辑超百种视频格式,基本涵盖常见和小众视频格式&#…...
高精度运算
1.乘法 #include <bits/stdc.h> using namespace std;char s1[2000], s2[2000]; int a[2000], b[2000], c[4000];int main() {cin >> s1 >> s2;int ls1 strlen(s1);int ls2 strlen(s2);int ls3 ls1 ls2;// 将字符串 s1 和 s2 转换为数组 a 和 bfor (int…...
express的模板handlebars用app.engine()创建配置和用exphbs.create()的区别
在使用 express-handlebars 时,app.engine 和 exphbs.create 都可以用来配置 Handlebars 模板引擎,但它们的使用方式和功能有一些区别。以下是详细的对比和说明 app.engine 方法 app.engine 是 Express 提供的方法,用于注册一个新的模板引擎…...

豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析
文章目录 前言一、数据读取与保存1. 读取清洗后数据2. 保存数据到CSV文件3. 保存数据到MySQL数据库 二、不同分类统计分析1. 不同分类的图书数量统计分析2. 不同分类的平均评分统计分析3. 不同分类的平均评价人数统计分析4. 不同分类的平均价格统计分析5. 分类综合分析 三、不同…...
聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥
目录 一、什么是临界区? 二、Mutex类简介 三、Mutex的基本用法 解释: 四、Mutex的工作原理 五、使用示例1-保护共享资源 解释: 六、使用示例2-跨进程同步 示例场景 1. 进程A - 主进程 2. 进程B - 第二个进程 输出结果 ProcessA …...
Sql刷题日志(day5)
面试: 1、从数据分析角度,推荐模块怎么用指标衡量? 推荐模块主要目的是将用户进行转化,所以其主指标是推荐的转化率推荐模块的指标一般都通过埋点去收集用户的行为并完成相应的计算而形成相应的指标数据,而这里的驱动…...