032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器(一) - 基本定时器知识

在这里插入图片描述

这节开始学习一下TIM定时器功能,从字面意思上理解,定时器的基本功能就是用来定时,与定时器相结合,可以实现一些周期性的数据发送、采集等功能,比如定时发送USART数据、ADC定时采集数据、与GPIO结合测量信号输入脉宽以及产生输出波形,常用的PWM波控制电机就是定时器的一种应用。

在STM32F42xxx系列控制器中,有2个高级控制定时器、10个通用定时器和2个基本定时器以及2个看门狗定时器。控制器上所有定时器都是彼此独立,不共享任何资源。高级控制定时器包含通用定时器的所有功能,通用定时器包含基本定时器的所有功能。其特性参见下表:

定时器类型Timer计数器分辨率计数器类型预分频系数DMA请求生成捕获/比较通道互补输入最大接口时钟(MHz)最大定时器时钟(MHz)
高级控制TIM116位递增、递减、递增/递减1~65536490(APB2)180
通用TIM232位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM316位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM416位递增、递减、递增/递减1~65536445(APB1)90/180
通用TIM532位递增、递减、递增/递减1~65536445(APB1)90/180
基本TIM616位递增1~65536045(APB1)90/180
基本TIM716位递增1~65536045(APB1)90/180
高级控制TIM816位递增、递减、递增/递减1~65536490(APB2)180
通用TIM916位递增1~65536290(APB1)180
通用TIM1016位递增1~65536190(APB1)180
通用TIM1116位递增1~65536190(APB1)180
通用TIM1216位递增1~65536245(APB1)90/180
通用TIM1316位递增1~65536145(APB1)90/180
通用TIM1416位递增1~65536145(APB1)90/180

这里需要注意,所有定时机器预分频系数都是在1~65536之间取值,且都为整数。最大定时器时钟可以通过RCC_DCKCFGR寄存器进行配置,可配置值为90/180MHz。

一、基本定时器功能框图

基本定时器的功能框图包含了基本定时器最核心的内容,其结构如下图:

在这里插入图片描述

在上图中,绿框中是对定时器的图标解释,黑框带阴影方框中,方框内容一般为寄存器名称,比如上面的自动重载寄存器(TIMx_ARR)和PSC(TIMx_PSC)预分频寄存器,方框加阴影效果主要是为了突出表示该寄存后面还有一个寄存器,只是这个寄存器我们无法进行操作,这里我们称之为影子寄存器,而上面我们可以操作的寄存器我们称之为源寄存器。影子寄存器是在程序运行时真正起到作用的,源寄存器只是给我们提供读写功能,当特定事件发生时,才会把源寄存器的值拷贝给其影子寄存器。多个影子寄存器一起使用可以达到同步更新多个寄存器内容。

下面向下趋势的折线箭头表示为一个事件,向上趋势的这下箭头表示中断和DMA输出,以上图为例,在自动重载寄存器左侧带有字母“U”的是按图标,表示在更新事件生成时就把自动重载寄存器内容拷贝到影子寄存器内,寄存器右边的时间图标、中断和DMA输出图标表示在自动重载寄存器与计数器寄存器值相等时生成事件、中断和DMA输出。

在了解图示图标后,下来我们逐项分析下基本定时器框图:

1、时钟源

既然要实现定时的功能,就必须要给定时器提供时钟源实现计数,基本定时器时钟只能使用内部时钟,而高级和通用定时器可以选择外部时钟源或者其他定时器等待模式。可以通过RCC专用始终配置寄存器(RCC_DCKCFGR)的TIMPRE位设置所有定时器的时钟频率,一般改为设置为默认值0。从而使得上面表中的可选最大定时器时钟为90MHz,即基本定时器的内部时钟CK_INT频率为90MHz。

基本定时器只能使用内部时钟,当TIM6和TIM7控制寄存器1(TIMx_CR1)的GEN位置1时,启动基本定时器,并且预分频器的始终来源位CK_INT。

2、控制器

控制器用于控制实现定时器功能,控制其复位、使能、计数等其基础功能,基本定时器还专门用于DAC转换触发。

3、计数器

基本定时器计数过程中主要针对三界寄存器,分别位计数器寄存器TIMx_CNT、预分频器寄存器TIMx_PSC、自动重载寄存器TIMx_ARR,这三个寄存器均为16位有效位,可以设置的值为0~65535。

预分频寄存器PSC:预分频器PSC有一个输入时钟CK_PSC和一个输出时钟CK_CNT,输入时钟CK_PSC来源于控制器,基本定时器只有内部时钟源,所以CK_PSC实际等于CK_INT,即90MHz。当需要不同的定时频率时,可以通过设置预分频器PSC的值可以得到不同的时钟输出CK_CNT,计算公式如下:
f C K C N T = f C K P S C / ( P S C [ 15 : 0 ] + 1 ) fCKCNT = fCKPSC/(PSC[15:0]+1) fCKCNT=fCKPSC/(PSC[15:0]+1)
在这里插入图片描述

上图中明确表示了将预分频从1改为4时计数器变化过程,在1分频时,CK_PSC和CK_CNT频率相同。向TIMx_PSC寄存器写入新值时,并不会马上更新CK_CNT的输出频率,需要等到更新事件发生时,把TIMx_PSC寄存器值更新到影子寄存器中,才能产生效果。当更新为4分频后,CK_PSC每产生4个脉冲时,CK_CNT才会产生1个脉冲。

当定时器使能时(CNT_EN = 1),计数器COUNTER根据CK_CNT的频率向上计数,意思就是当CK_CNT每产生一个脉冲,TIMx_CNT的值就累加1。当TIMx_CNT的值与TIMx_ARR的值一致时会自动生成事件,并且TIMx_CNT自动清零,然后开始下一轮计数,如此往复。

因此我们只需要设置CK_PSC和TIMx_ARR这两个寄存器的值,就可以控制事件生成的事件,一般的应用程序就是在事件生成的会点函数中运行,在TIMx_CNT递增至TIMx_ARR值相等时,我们称之为定时器上溢。

自动重载寄存器TIMx_ARR用于存放与计数器值比较的数值(设定值),如果两个数值相等就生成事件,将相关事件标志位置位,生成DMA和中断输出。TIMx_ARR有影子寄存器,可通过RIMx_CR1寄存器的ARPE位控制影子寄存器功能,如果ARPE位置1,影子寄存器有效,当且只有事件更新时,才会将TIMx_ARR值赋值给影子寄存器,如果ARPE位为0,修改TIMx_ARR值则可以马上生效。

4、定时器周期计算

通过上面的内容,我们直到定时时间生成时间主要由TIMx_PSC和TIMx_ARR两个寄存器值决定,这个称之为定时器的周期。假如我们需要一个1s周期的定时器,该如何设置这两个寄存器的值呢?

假设我们先设置TIMx_ARR寄存器的值为9999,则表示当TIMx_CNT从0开始计数,当累加到9999个脉冲后,生成事件,合计就是10000次,那么如果此时时钟源周期为100us,就刚好得到了1s的定时周期。

如此我们只需要关注如何设置TIMx_PSC寄存器值,使得CK_CNT输出为100us(1/0.0001 = 10000Hz)周期的时钟即可。预分频的输入时钟CK_PSC为90Mhz,根据上面提供的CK_CNT计算公式得到PSC = 90MHz / 10000Hz - 1 = 9000 - 1 = 8999。

OK,定时器的基本内容学习完了,下来就是了解一下与定时器相关的结构体了。

二、定时器相关结构体

标准库中对定时器外设建立了四个初始化结构体,其中基本定时只用到一个,即TIM_TimeBaseInitTypeDef,该结构体成员用于设置定时器基本工作参数,并由定时器基本初始化配置函数TIM_TimeBaseInit调用。

TIM_TimeBaseInitTypeDef结构体定义在stm32f4xx_tim.h中,TIM_TimeBaseInit函数定义在stm32f4xx_tim.c中,首先我们先看一下TIM_TimeBaseInitTypeDef结构体定义:

typedef struct {
    uint16_t TIM_Prescaler; 			// 预分频器
    uint16_t TIM_CounterMode; 			// 计数模式
    uint32_t TIM_Period; 			    // 定时器周期
    uint16_t TIM_ClockDivision; 		// 时钟分频
    uint8_t TIM_RepetitionCounter; 		// 重复计算器
} TIM_TimeBaseInitTypeDef;

定时器预分频器TIM_Prescaler:时钟源经过该分频器之后输出的才是定时器时钟,该值设置的为TIM_PSC寄存器的值,可设置范围为065535,可实现165536分频。

定时器计数模式TIM_CounterMode:可视之为向上计数、向下计数以及三种中心对其模式,基本定时器只能为向上计数,即TIMx_CNT只能从0开始递增,并且无需初始化。

定时器周期TIM_Period:实际就是设置自定重载寄存器的值,当事件生成时更新到影子寄存器,可设置范围为0~65535。

时钟分频TIM_ClockDivision:设置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比。基本定时器没有此项功能,不用设置。

重复计数器TIM_RepetitionCounter:该项输入高级控制寄存器的专用寄存器位,利用它可以控制输出PWM的个数,基本寄存器中无需设置。

综上,虽然定时器初始化结构体由5个成员,但是对于基本定时器来说,只需要设置其中两个就可以,其余的暂时不涉及。

OK ,关于定时器的基本知识,这节就先学习这么些,下节使用基本定时器先写个小Dome来验证一下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python实现批量替换目录下多个后缀为docx文档内容

批量替换目录下多个后缀为docx文档内容 摘要: 本文将介绍如何使用Python实现批量替换目录下多个后缀为docx文档内容。通过使用Python的os和glob模块,我们可以轻松地遍历目录下的所有文件,并对每个文件进行操作。此外,我们还将使用…

使用Ubuntu22+Minikube快速搭建K8S开发环境

安装Vmware 这一步,可以参考我的如下课程。 安装Ubuntu22 下载ISO镜像 这里我推荐从清华镜像源下载,速度会快非常多。 下载地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.3/ 如果你报名了我的这门视频课程&#xf…

【网络编程】网络通信基础——简述TCP/IP协议

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、ip地…

26、湾湾国立阳明交通大学、湾湾长庚纪念医院提出:ALL Attention U-Net,独属头部CT分割的[玛格丽特]

本文由台湾国立阳明交通大学、台湾长庚纪念医院于2023年12月16日在arXiv<Image and Video Processing>发表。 论文地址&#xff1a; 2312.10483.pdf (arxiv.org) 0、Abstract 脑出血在 Head CT扫描中作为第一线工具&#xff0c;帮助专家诊断不同类型的出血。然而&…

AI技术图像编辑 Luminar Neo最新中文 for Mac

Luminar Neo是一款功能强大的AI智能图像处理工具&#xff0c;借助Luminar Neo领先的AI技术和灵活的工作流程&#xff0c;用户可以完成创意任务并获得专业品质的编辑结果。以下是该软件的主要特点和功能&#xff1a; 支持多种文件格式&#xff1a;Luminar Neo支持多种文件格式&…

Android模拟器的安装和adb连接

一、前置说明 APP 自动化可以使用真机进行测试&#xff0c;也可以使用模拟器来模拟安卓设备。我们可以根据个人喜好安装模拟器&#xff0c;个人推荐安装两款模拟器&#xff1a;网易 MuMu 模拟器、夜神模拟器。 MuMu模拟器可以支持 Android 12 版本&#xff0c;优点是&#xf…

docker-compaose部署openldap

前段时间在本地搭建了一套gitlab geo测试环境&#xff0c;因为需要集成ldap&#xff0c;所以特意搭建下&#xff0c;特此作为笔记记录下。 文章目录 1. 前置条件2. 编写docker-openldap.yml文件3. 登录4. 使用创建组创建用户登录测试 1. 前置条件 安装docker-compose 安装docke…

el-select绑定值的坑

碰到一个问题&#xff0c;选择框的数据是后端传过来的&#xff0c;下拉框的数据也是后端传过来的&#xff0c;但是打开下拉框时&#xff0c;发现数据没有高亮。 最后发现&#xff0c;只要选择框v-model给的值和option的value绑定的值一致&#xff0c;就可以高亮。 大多数情况下…

041_小驰私房菜_MTK平台添加支持通过原生Camera API接口调用UsbCamera

平台:MTK 问题:通过调用Android Camera API去调用UsbCamera,需要做哪些修改? Google官方文档,关于usbcamera的支持: 外接 USB 摄像头 | Android 开源项目 | Android Open Source Project 相关修改内容如下: 一、MTK平台支持通过标准接口打开USB Camera 1)device相…

springboot集成websocket全全全!!!

一、界面展示 二、前置了解 1.什么是websocket WebSocket是一种在单个TCP连接上进行全双工通信的持久化协议。 全双工协议就是客户端可以给我们服务器发数据 服务器也可以主动给客户端发数据。 2.为什么有了http协议 还要websocket 协议 http协议是一种无状态&#xff0c;非…

红帆iOffice iorepsavexml.aspx接口存在任意文件上传漏洞 附POC

@[toc] 红帆iOffice iorepsavexml.aspx接口存在任意文件上传漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅…

为什么react call api in cDidMount

为什么react call api in cDM 首先&#xff0c;放到constructor或者cWillMount不是语法错误 参考1 参考2 根据上2个参考&#xff0c;总结为&#xff1a; 1、官网就是这么建议的&#xff1a; 2、17版本后的react 由于fiber的出现导致 cWM 会调用多次&#xff01; cWM 方法已…

16-高并发-队列术

队列&#xff0c;在数据结构中是一种线性表&#xff0c;从一端插入数据&#xff0c;然后从另一端删除数据。 在我们的系统中&#xff0c;不是所有的处理都必须实时处理&#xff0c;不是所有的请求都必须实时反馈结果给用户&#xff0c;不是所有的请求都必须100%一次性处理成功…

如何查看内存卡使用记录-查看的设备有:U盘、移动硬盘、MP3、SD卡等-供大家学习研究参考

主要功能 USB Viewer&#xff08;USB移动存储设备使用记录查看器&#xff09;可用于查看本机的USB移动存储设备使用记录。可查看的设备有&#xff1a;U盘、移动硬盘、MP3、SD卡……等。   可用于兵器、航空、航天、政府、军队等对保密要求较高的单位&#xff0c;可在计算机保…

ubuntu22.04+ROS2推荐匹配的gazebo版本

放大以后看到&#xff1a; 可以看到ros2推荐使用版本是humble-----匹配的是Ubuntu22.04LTS -------匹配gazebo Harmonic

论文阅读——Flamingo

Flamingo: a Visual Language Model for Few-Shot Learning 模型建模了给定交织的图片或支视频的条件下文本y的最大似然&#xff1a; 1 Visual processing and the Perceiver Resampler Vision Encoder&#xff1a;from pixels to features。 预训练并且冻结的NFNet&#xff…

每次maven刷新jdk都要重新设置

pom.xml <java.version>17</java.version> 改为<java.version>1.8</java.version>

【LeetCode:1962. 移除石子使总数最小 | 堆 + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

变限积分求导(带参,极限)

方法 一般形 带参数方程形 带极限型

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者&#xff1a;索增增&#xff08;小红书&#xff09;、宋泽辉&#xff08;小红书&#xff09;、张佐玮&#xff08;阿里云&#xff09; 背景介绍 Koordinator 是一个开源项目&#xff0c;基于阿里巴巴在容器调度领域多年累积的经验孵化诞生&#xff0c;目前已经支持了 K8s…