STM32 TIM1高级定时器RCR重复计数器的理解
STM32 TIM1高级定时器RCR重复计数器的理解
TIMx_RCR重复计数器寄存器,重复计数器只支持高级定时器TIM1和TIM8,下面看标准外设库的TIM结构体的封装;
typedef struct
{
uint16_t TIM_Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock.
This parameter can be a number between 0x0000 and 0xFFFF */
uint16_t TIM_CounterMode; /*!< Specifies the counter mode.
This parameter can be a value of @ref TIM_Counter_Mode */
uint16_t TIM_Period; /*!< Specifies the period value to be loaded into the active
Auto-Reload Register at the next update event.
This parameter must be a number between 0x0000 and 0xFFFF. */
uint16_t TIM_ClockDivision; /*!< Specifies the clock division.
This parameter can be a value of @ref TIM_Clock_Division_CKD */
uint8_t TIM_RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter
reaches zero, an update event is generated and counting restarts
from the RCR value (N).
This means in PWM mode that (N+1) corresponds to:
- the number of PWM periods in edge-aligned mode
- the number of half PWM period in center-aligned mode
This parameter must be a number between 0x00 and 0xFF.
@note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;
可以看到uint8_t TIM_RepetitionCounter将暂存RCR寄存器的值,从后面注释可以得知;
RCR寄存器中的值会递减到0,在允许更新事件UEV发生的情况下,则TIM的更新事件UEV就会产生;
如果设置RCR的值为N,那么PWM模式下,更新事件将会在弟N+1个周期发生;
下面根据PWM模式加以区分;
- 边沿模式
edge-aligned mode,延迟PWM周期数量和N相同; - 中央对齐模式
center-aligned mode,延迟PWM周期数量等于N2\cfrac{N}{2}2N;
更新事件
UEV会在当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于0时产生
下面看STM32参考手册中的一张图;

从图中不难发现;
中央对齐模式下:
- RCR = 0,更新事件没有延迟;
- RCR = 1,更新事件延后了半个PWM周期;
- RCR = 2, 更新事件延后了一个PWM周期;
- RCR = 3,更新事件延后了cfrac32cfrac{3}{2}cfrac32个PWM周期;
因此,中央对齐模式center-aligned mode,更新事件延迟的PWM周期数量等于RCR2\cfrac{RCR}{2}2RCR;
RCR 寄存器的范围是 0~0xFF;
边沿对齐模式下:
- RCR = 0,更新事件没有延迟;
- RCR = 1,更新事件延后了一个PWM周期;
- RCR = 2, 更新事件延后了两个PWM周期;
- RCR = 3,更新事件延后了三个PWM周期;
因此,边沿对齐模式延迟的PWM周期数量等于RCRRCRRCR;
这么一来,TIM中的UEV的使用就变得非常灵活。
实际的应用中,对于STM32芯片的ADC的转换启动,一般分为软件启动或外部触发事件启动。其中外部触发事件启动,可以是定时器触发事件或EXTI引脚信号。在很多应用场合,比如电机、电源、变频器等应用中,ADC的采样点可能会有很严格的时间要求,如果采样点选择错误,可能会给整个控制系统造成严重不良后果。这里针对STM32的定时器周期性地触发ADC采样的实现方式做个简要介绍。
这里以STM32F1的TIMER1 触发ADC注入通道的转换为例【当然,规则通道也可以使用定时器触发】。我们可以利用定时器更新事件或比较输出信号作为ADC的触发使能信号。根据STM32F1参考手册查表得知,可以使用TIM1的TRGO事件或通道CH4的捕捉事件来触发注入通道的ADC转换。
1、使用TIM1 TRGO来触发ADC
// 选择Tim1更新事件作为TRGO
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
//设定T1_TRGO作为ADC触发源
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;
特别提醒:经常有人忘记配置上面红色语句,那就相当于使用了默认的TRGO信号。但对于一个定时器来讲,可以作为TRGO的信号很多,有时默认的并非你要的信号。

2、利用TIM1 CH4的比较事件来触发ADC
这里就是选择OC4REF信号作为TRGO输出来触发ADC.
// 选择OC4REF作为TRGO;
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC4Ref);
//设定T1_TRGO作为ADC触发源
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;
相比上面第一种方法,ADC采样时间点更为灵活可调,不仅仅局限于定时器的更新事件。
图一:间隔触发ADC采样点
有时候,我们可能需要多个周期才需进行一次AD触发采样及相关计算。如果时间是基于更新时刻又是定时周期的倍数,较为方便的办法就是使用定时器里的重复计数器,使用更新事件作为TRGO。软件设置就是在上面第一种方法的基础上增加一句对重复计数器TIMx_RCR的设置。图一的蓝色箭头即为此种情况的触发点设定。基本配置如下:
//配置重复计数器为2次
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1;
// 选择Tim1更新事件作为TRGO
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);
//设定T1_TRGO作为ADC触发源
ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T1_TRGO;

如果要实现跨周期非更新时间点采样和计算,即上图中绿色箭头所指的情形。我们可以考虑使用多次采样配合中断进行计数的方式或者引入其它定时器进行分频后来灵活处理。
STM32 TIM1高级定时器RCR重复计数器的理解的更多相关文章
- STM32 TIM1高级定时器配置快速入门
layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 重点内容 时基单元 计 ...
- STM32 TIM高级定时器死区时间的计算
STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...
- 高级定时器TIM1&TIM8
高级定时器 初识stm32高级定时器: (1)高级控制定时器(TIM1 和 TIM8)和通用定时器在基本 ...
- Stm32高级定时器(四)
Stm32高级定时器(四) 1 编码器接口模式 1.1 编码器原理 什么是正交?如果两个信号相位相差90度,则这两个信号称为正交.由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向.根 ...
- Stm32高级定时器(三)
Stm32高级定时器(三) 1 互补输出和死区插入 1.1 死区:某个处于相对无效状态的时间或空间 本来OCX信号与OCXREF时序同相同步,OCXN信号与OCXREF时序反相同步.但为了安全考虑,以 ...
- Stm32高级定时器(一)
Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波 ...
- Stm32高级定时器(二)
Stm32高级定时器(二) 1 主从模式:主?从? 谈论主从,可知至少有两个以上的触发或者驱动信号,stm32内部有多个定时器,可以相互之间驱动或者控制. 主模式:定时器使能只受驱动时钟控制或者输出控 ...
- stm32高级定时器的应用——spwm
用过stm32定时器的朋友都知道,定时器的CCR寄存器,可以用来配置PWM的输出,但同样也可以用来配置spwm.废话不多说,直接上代码. 首先,你得考虑一下几个因素: 1.同步调制还是异步调制. 2 ...
- Stm32高级定时器(转自:luowei_memory)
1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波形 增量正交编码器驱动电机获 ...
随机推荐
- Matlab学习-(3)
1. 二维图 绘制完图形以后,可能还需要对图形进行一些辅助操作,以使图形意义更加明确,可读性更强. 1.1 图形标注 title(’图形名称’) (都放在单引号内)xlabel(’x轴说明’)ylab ...
- 数据挖掘入门系列教程(十)之k-means算法
简介 这一次我们来讲一下比较轻松简单的数据挖掘的算法--K-Means算法.K-Means算法是一种无监督的聚类算法.什么叫无监督呢?就是对于训练集的数据,在训练的过程中,并没有告诉训练算法某一个数据 ...
- vscode 使用记录
快捷键 Cmd+P 查找最近的文件 Ctrl+cmd + P 打开命令面板 Ctrl+tab文件间切换 Ctrl+` 打开终端 Cmd +b 隐藏侧边栏 VScode对多行编辑有两种模式 第一种模式 ...
- 移植madplay到ARM板
一.环境和软件介绍 1.主机环境:Ubuntu16.04 2.交叉编译器: gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) 3.ARM板:kernel: ...
- 在.NET Core中用最原生的方式读取Nacos的配置
背景 之前老黄写过一篇<ASP.NET Core结合Nacos来完成配置管理和服务发现>简单介绍了如何让.NET Core程序接入Nacos,之前的SDK里面更多的是对Nacos的Open ...
- 聊聊JavaScript在工作中常用的方法(一)
一.字符串转数组(split方法) 废话少说,直接上代码: //例子1 var str="abc,def,ghi"; var strArray=str.split(",& ...
- BATJ高级Java面试题分享:JVM+Redis+Kafka +数据库+设计模式
话不多说,直接上面试题,来看一下你还欠缺多少? Mysql 与 Oracle 相比, Mysql 有什么优势? 简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别? ...
- spark2.4.5计算框架中各模块的常用实例
本项目是使用scala语言给出了spark2.4.5计算框架中各模块的常用实例. 温馨提醒:spark的版本与scala的版本号有严格的对应关系,安装请注意. Spark Core RDD以及Pair ...
- centos7在命令行下安装图形界面
yum groupinstall "GNOME Desktop" "Graphical Administration Tools" ln -sf /lib/sy ...
- linux的p0f检测,分析抓包信息
p0f是一个纯粹的被动指纹识别工具,它在不干涉双方通信的情况下,通过嗅探的方式来分析流经某一网卡的流量以达到指纹识别的目的 P0f是继Nmap和Xprobe2之后又一款远程操作系统被动判别工具.它支持 ...