• 定时器功能简介

  STM32 一共有 8 个都为 16 位的定时器。其中 TIM6、 TIM7 是基本定时器;TIM2、TIM3、 TIM4、 TIM5 是通用定时器; TIM1 和 TIM8 是高级定时器。这些定时器使 STM32 具有定时、信号的频率测量、信号的 PWM 测量、 PWM输出、三相 6 步电机控制及编码器接口等功能。

  • 基本定时器 

  基本定时器TIM6 和TIM7,这两个定时器只具备最基本的定时功能,就是累加的时钟脉冲数超过预定值时,能触发中断或触发 DMA 请求。由于在芯片内部与 DAC 外设相连,可通过触发输出驱动 DAC。也可以作为其它通用定时器的时钟基准。

  这两个基本定时器使用的时钟源都是 TIMxCLK,时钟源经过 PSC 预分频器输入至脉冲计数器(TIMx_CNT) ,基本定时器只能工作在向上计数模式,在重载寄存器(TIMx_ARR) 保存的是定时器的溢出值。工作时, 脉冲计数器 TIMx_CNT 由时钟触发进行计数,当 TIMx_CNT 的计数值 X 等于重载寄存器 TIMx_ARR 中保存的数值 N 时,产生溢出事件,可触发中断或 DMA 请求。然后 TIMx_CNT 的值重新被置为 0,重新向上计数。

  • 通用定时器

  通用定时器为TIM2~TIM5,主要用在测量输入脉冲的频率、脉冲宽与输出 PWM 脉冲的场合,还具有编码器的接口。

  通用定时器比基本定时器多出的强大功能,就是因为通用定时器多出了一种寄存器——捕获/比较寄存器, TIMx_CCR(capture/compare register 简称CCR),它在输入时被用于捕获(存储) 输入脉冲在电平发生翻转时,脉冲计数器TIMx_CNT 的当前计数值,从而实现脉冲的频率测量;在输出时被用来存储一个脉冲数值,把这个数值用于与脉冲计数器 TIMx_CNT 的当前计数值进行比较,根据比较结果进行不同的电平输出 。

  • pwm输出:

  通用定时器可以利用 GPIO 引脚进行脉冲输出,在配置PWM输出功能时(或者比较输出功能时),捕获/比较寄存器 TIMx_CCR 被用作比较功能,配置脉冲计数器TIMx_CNT 为向上计数,重载寄存器 TIMx_ARR 被配置为 N,即 TIMx_CNT的当前计数值数值 X 在 TIMxCLK 时钟源的驱动下不断累加,当 TIMx_CNT 的数值 X 大于 N 时,会重置 TIMx_CNT 数值为 0 重新计数。而在 TIMxCNT 计数的同时, TIMxCNT 的计数值 X 会与比较寄存器TIMx_CCR 预先存储了的数值 A 进行比较,当脉冲计数器 TIMx_CNT 的数值 X小于比较寄存器 TIMx_CCR 的值 A 时, 输出高电平(或低电平),相反地,当脉冲计数器的数值 X 大于或等于比较寄存器的值 A 时,输出低电平(或高电平)。

  如此循环,得到的输出脉冲周期就为重载寄存器 TIMx_ARR 存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器 TIMx_CCR 的值A 乘以触发脉冲的时钟周期,即输出 PWM 的占空比为 A/(N+1) 。

  • 测量 PWM 输入

  当定时器被配置为输入功能时,可以用于检测输入到 GPIO 引脚的信号(频率检测、输入 PWM 检测),此时捕获/比较寄存器 TIMx_CCR 被用作捕获功能。测量脉冲宽,需要两个捕获寄存器,在输入脉冲的不同边沿(pwm波的上升沿IC1和下降沿IC2)对TIM_CNT 的计数值进行捕获,得到这个 T1脉冲占空比为(N+1)/(A+1)。

  要测量的PWM 脉冲通过 GPIO 引脚输入到定时器的脉冲检测通道把脉冲计数器 TIMx_CNT 配置为向上计数,重载计数器重载寄存器TIMx_ARR 的 N 值配置为足够大。

  在输入脉冲 TI1 的上升沿到达时,触发 IC1 和 IC2 输入捕获中断,这时把脉冲计数器 TIMx_CNT 的计数值复位为 0,于是 TIMx_CNT 的计数值 X 在TIMxCLK 的驱动下从 0 开始不断累加,直到 TI1 出现下降沿,触发 IC2 捕获事件,此时捕获寄存器 TIMx_CCR2 把脉冲计数器 TIMx_CNT 的当前值 N1 存储越来,而 TIMx_CNT 继续累加,直到 TI1 出现第二个上升沿,触发了 IC1 捕获事件,此时 TIMx_CNT 的当前计数值 N2 被保存到 TIMx_CCR1。

  很明显 TIMx_CCR1(加 1)的值乘以 TIMxCLK 的周期,即为待检测的 PWM输入脉冲周期, TIMx_CCR2(加 1) 的值乘以 TIMxCLK 的周期,就是待检测的PWM 输入脉冲的高电平时间(小于预留值时为高电平),有了这两个数值,就可以计算出 PWM 脉冲的频率、占空比了。

  • 定时器的时钟源

  所有定时器(包括基本、通用、高级)使用内部时钟时,定时器的时钟源都被称为 TIMxCLK,但 TIMxCLK 的时钟来源并不是完全一样的。

  常见的配置中,AHB=72MHz,而APB1预分频器系数被配置为2,则PCLK1刚好达到最大值36MHz。如果APB1的分频系数不为1,则TIM2~7的时钟TIMxCLK = (AHB/2) × 2=72MHz。APB2预分频器的分频系数被配置为1时,PCLK2刚好达到最大值72MHz,而TIMxCLK则直接等于APB2分配器的输出。

 

STM32PWM之——定时器(1)的更多相关文章

  1. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  2. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  3. [Java定时器]用Spring Task实现一个简单的定时器.

    今天做一个项目的的时候需要用到定时器功能.具体需求是: 每个月一号触发一次某个类中的方法去拉取别人的接口获取上一个月份车险过期的用户.如若转载请附上原文链接:http://www.cnblogs.co ...

  4. Node+fs+定时器(node-schedule)+MySql

    目标:将本人写博客时候的截图保存到桌面的图片 执行保存到指定文件进行整理 并写入数据库 先看最终的目录结构: package.json文件: { "name": "zqz ...

  5. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  6. 前端开发:setTimeout与setInterval 定时器与异步循环数组

    前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...

  7. 转载---javascript 定时器总结

    转载:http://www.jb51.net/article/40193.htm JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延 ...

  8. Node中的定时器详解

    在大多数的业务中,我们都会有一些需求,例如几秒钟实现网页的跳转,几分钟对于后台数据进行清理,node与javascript都具有将代码延迟一段时间的能力.在node中可以使用三种方式实现定时功能:超时 ...

  9. spring定时器,定时器一次执行两次的问题

    Spring 定时器 方法一:注解形式 配置文件头加上如下: xmlns:task="http://www.springframework.org/schema/task" htt ...

随机推荐

  1. P1169 [ZJOI2007]棋盘制作 悬线法or单调栈

    思路:悬线法\(or\)单调栈 提交:2次 错因:正方形面积取错了\(QwQ\) 题解: 悬线法 讲解:王知昆\(dalao\)的\(PPT\) 详见代码: #include<cstdio> ...

  2. Material Icons 查找的替代办法

    1 问题 1.1 国内访问 google 困难,众所周知 1.2 在平时的工作中使用 Material Icons 如何查询呢 2 办法 2.1 github.com 把包 download 2.2 ...

  3. MySQL B+树 的插入与删除

    一.MySQL Index 的插入 有如下B+树,其高度为2,每页可存放4条记录,扇出为5.所有记录都在叶子节点上, 并且是顺序存放,如果用户从最左边的叶子节点开始顺序遍历,可以得到所有简直的顺序 排 ...

  4. 编写测试类实现并发访问固定URL(亲测能用!!!)

    1.类目录 2.LatchTest.java类 package com.test; import java.util.concurrent.CountDownLatch; public class L ...

  5. 安装包设计-------安装(QT)---------知识总结

    1.判断文件是否存在 QFile file(path): file.exists(); 2.复制文件 bool copy(const QString &fileName, const QStr ...

  6. 存在日期类型的JSON数据,进行SpringMVC参数绑定时存在的问题和解决方案

    这篇文章已经过时了. 请参考比较合适的前后端交互方式. 首先是发送AJAX请求的html页面 <!DOCTYPE html> <html> <head> <m ...

  7. NSString的导出

    字符串的导出,写到某个文件中去 void stringExport(){ NSString *str=@"123456"; //if file not exist will not ...

  8. Raspberry Pi 4B 使用OpenCV访问摄像头picamera模块

    目录 1.OpenCV安装 (1)安装依赖 (2)下载OpenCV源码 (3)安装pip (4)安装Python虚拟机 (5)编译OpenCV (6)验证安装 2.使用OpenCV和Python控制摄 ...

  9. Sketch教程

    去年夏天开始用Sketch,觉得它放Dock里闪亮亮的很好看,当时笑称是男盆友送我的第一颗小钻石噗哈哈.所以那段时间几乎刷遍了所有关于 Sketch 的网站.文章.教程,之后又在自学设计,因为想和更多 ...

  10. Yarn 安装 node-sass 依赖导致 Build Fresh Packages 太慢的问题

    解决办法: 1. 在 项目目录下新建 .yarnrc 文件 添加以下代码 registry "https://registry.npm.taobao.org" sass_binar ...