当前位置: 首页 > news >正文

STM32定时器深入学习

STM32定时器分为三种定时器

高级定时器        TIM1和TIM8

通用定时器        TIM2、TIM3、TIM4、TIM5

基本定时器        TIM6、TIM7

三种定时器都是16位的自动装载计数器组成,由一个可编程的预分频器驱动。

1、高级定时器(TIM1、TIM8)

1.1    高级定时器的简介

1、测量输入信号的脉冲宽度(输入捕获)
2、输出波形 ( 输出比较、PWM、嵌入死区时间的互补 PWM )
3、使用定时器预分频器和RCC 时钟控制预分频器,可以实现脉冲宽度和波形周期的调节
4、高级控制定时器 (TIM1 TIM8) 和通用定时器 (TIMx) 完全独立的,不共享任何资源。

1.2   高级定时器的功能

  1. 16位向上、向下、向上/下自动装载计数器
  2. 16位可编程(实时修改)预分频器,计数器时钟频率的分频系数为165535之间的任意数值
  3. 多达4个独立通道:1、输入捕获   2、输出比较   3、PWM生成   4、单脉冲模式输出
  4. 死区时间可编程的互补输出
  5. 使用外部信号控制定时器和定时器互联的同步电路
  6. 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
  7. 刹车输入信号可以将定时器输出信
  8. 支持针对定位的增量(正交)编码器和霍尔传感器电路
  9. 触发输入作为外部时钟或者按周期的电流管理
  10. 如下事件发生时产生中断/DMA
        ─ 更新:计数器向上溢出 / 向下溢出,计数器初始化 ( 通过软件或者内部 / 外部触发 )
        ─ 触发事件 ( 计数器启动、停止、初始化或者由内部 / 外部触发计数 )
        ─ 输入捕获
        ─ 输出比较
        ─ 刹车信号输入

1.3高级控制定时器框图

上图中,对应了四种独立通道。(左下) 输入、(右下)输出

时基单元

● 计数器寄存器(TIMx_CNT)                CNT负责计数,到达设定值产生一个溢出标志位
● 预分频器寄存器 (TIMx_PSC)           对进来的频率进行分类,然后给CNT计数器
● 自动装载寄存器 (TIMx_ARR)           当CNT达到设定值,从新开始
● 重复次数寄存器 (TIMx_RCR)           记录溢出的次数(产生PWM有用)
计数器模式
1、中央对齐模式(向上/向下模式)        2、向上计数模式        3、向下计数模式

1.4  定时器时钟的选择

定时器可以由下面四种时钟源进行提供:(TIMx_SMCR = xxx)

1、内部时钟(CK-INT)                        (TIMx_SMCR = 000)   内部时钟

2、外部时钟模式1,外部输入引脚         (TIMx_SMCR = 111)   进行输入端的计数(上或下)

3、外部时钟模式2,外部触发输入ETR         计数器在外部触发ETR的计数(上升或下降沿)

4、内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器

1.5  捕获/比较通道

每一个捕获 / 比较通道都是围绕着一个捕获 / 比较寄存器 ( 包含影子寄存器 )
捕获 / 比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。
  • 捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
  • 比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器 进行比较。

1.5  PWM模式(脉冲宽度调制)

        脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器来确定频率,由TIMx_CCRx寄存器确定占空 比的信号。

● 进入中央对齐模式时,使用当前的向上 / 向下计数配置;这就意味着计数器向上还是向下计
数取决于 TIMx_CR1 寄存器中 DIR 位的当前值。此外,软件不能同时修改 DIR CMS 位。
不推荐当运行在中央对齐模式时改写计数器,因为这会产生不可预知的结果。

1.6 互补输出和死区插入

        高级控制定时器(TIM1 TIM8) 能够输出两路互补信号,并且能够管理输出的瞬时关断和接通。 这段时间通常被称为死区,用户应该根据连接的输出器件和它们的特性( 电平转换的延时、电源开关的延时等) 来调整死区时间。

1.7  单脉冲模式

        单脉冲模式(OPM) 是前述众多模式的一个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后产生一个脉宽可程序控制的脉冲。

TIM1TIM8相关寄存器

控制寄存器 1(TIMx_CR1)
控制寄存器 2(TIMx_CR2)
从模式控制寄存器(TIMx_SMCR)
DMA/中断使能寄存器(TIMx_DIER)
状态寄存器(TIMx_SR)
事件产生寄存器(TIMx_EGR)
捕获/比较模式寄存器 1(TIMx_CCMR1)
捕获/比较模式寄存器 2(TIMx_CCMR2)
捕获/比较使能寄存器(TIMx_CCER)
捕获/比较寄存器 1(TIMx_CCR1)
捕获/比较寄存器 2(TIMx_CCR2)
捕获/比较寄存器 3(TIMx_CCR3)
捕获/比较寄存器(TIMx_CCR4)

计数器(TIMx_CNT)
预分频器(TIMx_PSC)
自动重装载寄存器(TIMx_ARR)
重复计数寄存器(TIMx_RCR)
刹车和死区寄存器(TIMx_BDTR)
DMA控制寄存器(TIMx_DCR)
连续模式的DMA地址(TIMx_DMAR)

2、通用定时器(TIM2、TIM3、TIM4、TIM5)

2.1 通用定时器主要功能

  1. 16位向上、向下、向上/向下自动装载计数器
  2. 16位可编程(实时修改)预分频器,计数器时钟频率的分频系数为165536之间的任意数值
  3. 4个独立通道:1、输入捕获   2、输出比较   3、PWM生成   4、单脉冲模式输出
  4. 使用外部信号控制定时器和定时器互连的同步电路
  5. 支持针对定位的增量(正交)编码器和霍尔传感器电路
  6. 触发输入作为外部时钟或者按周期的电流管理
  7. 如下事件发生时产生中断/DMA
更新:计数器向上溢出 / 向下溢出,计数器初始化 ( 通过软件或者内部 / 外部触发 )
触发事件 ( 计数器启动、停止、初始化或者由内部 / 外部触发计数 )
输入捕获
输出比较

2.2  通用定时器框图

时基单元 

● 计数器寄存器(TIMx_CNT)                CNT负责计数,到达设定值产生一个溢出标志位
● 预分频器寄存器 (TIMx_PSC)           对进来的频率进行分类,然后给CNT计数器
● 自动装载寄存器 (TIMx_ARR)           当CNT达到设定值,从新开始

通用定时器拥有的功能都是高级定时器拥有的功能,只是缺少了重复计数寄存器

3、基本定时器(TIM6、TIM7)

3.1 基本定时器主要功能

  • 16位自动重装载累加计数器
  • 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为165536之间的任意数值分频
  • 触发DAC的同步电路
  • 在更新事件(计数器溢出)时产生中断/DMA请求

基本定时器框图

 3.2 与通用定时器的差异

1、计数模式只有计数功能(每次溢出产生溢出事件),无其他功能。

2、计数器的时钟由内部时钟(CK_INT)提供,无其他时钟输入。

基本定时器的寄存器很少

TIM6 和TIM7 控制寄存器 1(TIMx_CR1)
TIM6 和TIM7 控制寄存器 2(TIMx_CR2)
TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
TIM6 和TIM7 状态寄存器(TIMx_SR)
TIM6 和TIM7 事件产生寄存器(TIMx_EGR)
TIM6 和TIM7 计数器(TIMx_CNT)
TIM6 和TIM7 预分频器(TIMx_PSC)
TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)

        在这里只是对STM32定时器的理论知识进行了一些学习,但还没有进行应用,以后应用在加在这上面。

相关文章:

  • JavaConfig
  • codeblock图形界面编程(十)文件操作
  • 算法与数据结构【30天】集训营——详解查找章节数据结构(C语言版 第2版)课后习题答案 (20)
  • 对象以死嘛?对象什么时候该死?看这一篇就够了
  • DDoS报告团伙规模
  • Android 注解与注解处理器简述
  • 【C++】STL——vector(万字详解)
  • Rust学习指南(一)安装RUST后台管理框架
  • 车载操作系统汇总
  • 硬件工程师成长之路(10.1)——芯片选型
  • libusb系列-001-libusb简介
  • 基于Nonebot2搭建QQ机器人实战篇(一)
  • git工具基本操作命令
  • Xilinx zynq 7010/7020 GPIO
  • 【ESP32】13.DS18B20温度传感器实验(OneWire和DallasTemperature库)
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • leetcode386. Lexicographical Numbers
  • Markdown 语法简单说明
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • php ci框架整合银盛支付
  • PHP的类修饰符与访问修饰符
  • React-redux的原理以及使用
  • select2 取值 遍历 设置默认值
  • springMvc学习笔记(2)
  • ViewService——一种保证客户端与服务端同步的方法
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 程序员该如何有效的找工作?
  • 从输入URL到页面加载发生了什么
  • 删除表内多余的重复数据
  • 新手搭建网站的主要流程
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $().each和$.each的区别
  • (3)nginx 配置(nginx.conf)
  • (八)c52学习之旅-中断实验
  • (备忘)Java Map 遍历
  • (二)丶RabbitMQ的六大核心
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (算法)前K大的和
  • ..回顾17,展望18
  • .libPaths()设置包加载目录
  • .NET CLR Hosting 简介
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET多线程执行函数
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .NET中GET与SET的用法
  • :“Failed to access IIS metabase”解决方法
  • ??javascript里的变量问题