STM32定时器---基本定时器

news2025/7/5 2:55:46

目录

一、定时器的概述

二、时基单元

三、基本定时器的的时序

(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. 配置 TIM6
    TIM_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. 启动 TIM6
    TIM_Cmd(TIM6, ENABLE);
}

// TIM6 中断处理函数
void TIM6_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) // 检查中断标志
    {
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update); // 清除中断标志
        //处理逻辑
    }
}


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

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

相关文章

大模型微调 - transformer架构

什么是Transformer Transformer 架构是由 Vaswani 等人在 2017 年提出的一种深度学习模型架构&#xff0c;首次发表于论文《Attention is All You Need》中 Transformer 的结构 Transformer 编码器&#xff08;Encoder&#xff09; 解码器&#xff08;Decoder&#xff09; …

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成

在GEE中实现时&#xff0c;发现简单的QA60是无法去云的&#xff0c;最近S2地表反射率数据集又进行了更新&#xff0c;原有的属性集也进行了变化&#xff0c;现在的SR数据集名称是“S2_SR_HARMONIZED”。那么&#xff1a; 要想得到研究区无云的图像&#xff0c;可以参考执行以下…

HTMLCSS模板实现水滴动画效果

.container 类&#xff1a;定义了页面的容器样式。 display: flex&#xff1a;使容器成为弹性容器&#xff0c;方便对其子元素进行布局。justify-content: center 和 align-items: center&#xff1a;分别使子元素在水平和垂直方向上居中对齐。min-height: 100vh&#xff1a;设…

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中&#xff0c;地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生&#xff0c;成为破解这一难题的核心工具。…

【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)

目录 创建容器 安装miniconda 安装mineru CPU运行 GPU加速 多卡问题 创建容器 构建Dockerfile文件 开启ssh服务&#xff0c;设置密码为1234等操作 # 使用官方 Ubuntu 24.04 镜像 FROM ubuntu:24.04# 安装基础工具和SSH服务 RUN apt-get update && \apt-get ins…

Appium自动化开发环境搭建

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

C++学习-入门到精通-【1】C++编程入门,输入/输出和运算符

C学习-入门到精通-【1】C编程入门&#xff0c;输入/输出和运算符 C编程入门&#xff0c;输入/输出和运算符 C学习-入门到精通-【1】C编程入门&#xff0c;输入/输出和运算符第一个C程序&#xff1a;输出一行文本算术运算 第一个C程序&#xff1a;输出一行文本 // 文本打印程序…

面向高性能运动控制的MCU:架构创新、算法优化与应用分析

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

某地农产品交易中心钢网架自动化监测项目

1. 项目简介 本项目规划建设现代物流产业园&#xff0c;新建6万平方米仓库&#xff0c;具体为新建3栋钢构仓库2万平方米&#xff0c;2栋砖混结构仓库1万平方米&#xff0c;3栋交易中心2万平方米&#xff0c;改造现有3栋3层砖混结构仓库1万平方米&#xff0c;配备智能化仓库物流…

【无人机】无人机位置估计出现偏差的原因分析

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

element-plus(vue3)表单el-select下拉框的远程分页下拉触底关键字搜索实现

一、基础内核-自定义指令 1.背景 2.定义 3.使用 4.注意 当编辑时需要回显&#xff0c;此时由于分页导致可能匹配不到对应label文本显示&#xff0c;此时可以这样解决 二、升级使用-二次封装组件 三、核心代码 1.自定义指令 定义 ----------------selectLoadMoreDirective.…

轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!

小白工具的在线视频编辑https://www.xiaobaitool.net/videos/edit/ 功能丰富、操作简便&#xff0c;在线裁剪或编辑视频工具&#xff0c;轻松完成视频创作能满足多种视频编辑需求。 格式支持广泛&#xff1a;可编辑超百种视频格式&#xff0c;基本涵盖常见和小众视频格式&#…

豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析

文章目录 前言一、数据读取与保存1. 读取清洗后数据2. 保存数据到CSV文件3. 保存数据到MySQL数据库 二、不同分类统计分析1. 不同分类的图书数量统计分析2. 不同分类的平均评分统计分析3. 不同分类的平均评价人数统计分析4. 不同分类的平均价格统计分析5. 分类综合分析 三、不同…

c++进阶——类与继承

文章目录 继承继承的基本概念继承的基本定义继承方式继承的一些注意事项 继承类模板 基类和派生类之间的转换继承中的作用域派生类的默认成员函数默认构造函数拷贝构造赋值重载析构函数默认成员函数总结 不能被继承的类继承和友元继承与静态成员多继承及其菱形继承问题继承模型…

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航

作者&#xff1a; Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位&#xff1a; 1 ^{1} 1乔治梅森大学计算机科学系&#xff0c; 2 ^{2} 2美国陆军研究实验室&…

Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互

Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示&#xff0c;实现前后端交互 前言一、JDBC 核心接口和类&#xff1a;数据库连接的“工具箱”1. 常用的 2 个“关键类”2. 必须掌握的 5 个“核心接口” 二、创建 JDBC 程序的步骤1. 第一步&#xf…

数据库未正常关闭后,再次启动时只有主进程,数据库日志无输出

瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台&#xff1a;银河麒麟svs&#xff08;X86_64&#xff09; 版本&#xff1a;4.5.8 症状 现象&#xff1a;使用pg_ctl stop停止数据库&#xff0c;未正常关闭&#xff1b;使用pg_ctl stop -m i 强制关闭数据库后&…

Oracle Recovery Tools修复ORA-00742、ORA-600 ktbair2: illegal inheritance故障

接到客户反馈,一套运行在虚拟化平台中的Oracle数据库,由于机房断电,导致数据库无法启动,最初启动报错 2025-04-22T16:59:48.92222708:00 Completed: alter database mount exclusive alter database open 2025-04-22T16:59:52.60972608:00 Ping without log force is disabled:…

基于 Netmiko 的网络设备自动化操作

学习目标 掌握 Netmiko 库的核心功能与使用场景。能够通过 Netmiko 连接多厂商设备并执行命令和配置。实现批量设备管理、配置备份与自动化巡检。掌握异常处理、日志记录与性能优化技巧。理解 Netmiko 在自动化运维体系中的角色。 1. Netmiko 简介 1.1 什么是 Netmiko Netmi…

LeNet5 神经网络的参数解析和图片尺寸解析

1.LeNet-5 神经网络 以下是针对 LeNet-5 神经网络的详细参数解析和图片尺寸变化分析&#xff0c;和原始论文设计&#xff0c;通过分步计算说明各层的张量变换过程。 经典的 LeNet-5架构简化版&#xff08;原始论文输入为 32x32&#xff0c;MNIST 常用 28x28 需调整&#xff09…