历史上的今天
今天是:2025年08月12日(星期二)
2019年08月12日 | STM32-(22):定时器TIM(理论)
2019-08-12 来源:eefocus
STM32系列的CPU,有多达8个定时器。
1、 其中TIM1和TIM8是能够产生三对PWM互补输出的髙级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。
2、 其它6个为普通定时器,时钟由APB1的输出产生。
定时器的作用:
1、 定时功能
2、 计数功能
3、 输入捕获
4、 匹配输出
5、 PWM咏冲波
1、功能描述.
通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
它适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输
出比较和PWM)。
定时器是完全独立的,而且没有互相共享任何资源。
定时器还可以与定时器形成级联,组建更大的定时范围。
NOTE:只要你使用默认的库配置方式配置时钟为72M,无论TIM1还是TIMX, ft们的计数器频率都是72M。
2、主要特性.
通用TIMx定时器特性包括:
16位向上,向下,向上/向下自动装载计数器
16位可编程预分频器,计数器时钟频率的分频系数为1-65535之间的任意数值
4个独立通道:
输入捕获
输出比孤
PWM生成(边缘或中间对齐模式)
单脉冲模式输出使用外部信号控制定时器和定时器互连的同步电路
如下事件犮生时产生中断DMA
更新:计数器向上溢出./向下溢出,计数器初始化
触发事件:计数器启动,停止,初始化或者
输入捕获
输出比较
普通定时器(TIMx)框图

简析:
先简要分为5个部分分析,第1部分是时钟源选择,主要是输出CK_PSC这个时钟信号;第2部分是时基单元,进行计数等等;第3部分是输入捕获的;第4部分是比较输出的;第5部分是输入到输出的一些处理的寄存器。
第1部分:首先为了得到CK_PSC这个时钟,但是它有很多种途径,可以通过内部时钟(CK_INT);可以通过外部时钟源(TIMx_ETR);可以通过ITR0-ITR3等其他定时器;可以通过输入通道TIMx_CH1等提供的 TI1F_ED、TI1FP1、TI2FP2等等;其中 从模式控制器可以对这几路时钟源进行选择与控制。这样就可以得到CK_PSC
第2部分:首先得到CK_PSC这个信号,然后预分频得到CK_CNT,计数器(CNT)前面有+、-,表示可以向上计数也可以向下计数,当计数发生溢出,就会自动重载
第3部分:输入捕获,本来有四个通道,这里只显示两个通道(CH1/CH2)。输入捕获是对通道内的信号进行脉宽测量,可以捕获一个上升沿和一个下降沿,这里就可以得到高电平的脉冲时间;也可以捕获一个上升沿和下一个上升沿,这里就得到了整个周期的时间;大概流程是信号先进来,TI1是选择开关,首先进行输入滤波和边沿检测,假如经 TIFP1 通过 IC1 进行预分频(当不需要进行预分频把这个设置为0),然后产生 IC1PS 信号,然后 捕获/比较1寄存器就会把这个值保存下来。比如我们需要测量的是周期,当第一次上升沿捕获,会有一个值存入寄存器,第二次上升沿捕获,又会有一个值存入寄存器,这两个值相减就是脉冲的周期。

**通道1输入部分详解:**关于输入捕获中滤波的作用,滤波可以屏蔽一些高频的干扰,通过硬件屏蔽干扰,可以节省软件的开销和代码量,滤波器可以起到硬件消抖的作用,消抖稳定性很好。消抖完之后会进入边沿检测的模块可以判断是上升沿还是下降沿,CC1P可以决定这个 TI1FP1这个开关是上边沿检测还是下边沿检测。然后通过CC1S[1:0]位设置为 01 来通过这个信号 IC1,ICPS[1:0]来设定分频值,当不需要分频,设置为1,当分频为2,当脉冲来两次,IC1PS 信号才输出一个。

通道1输出部分详解:当CNT的值大于或者等于一个值(比较寄存器设定值)的时候,进入输出模式控制寄存器,模式的选择由OC1M[2:0]这两个位来设定的,然后出来一个信号 oc1ref,然后往后走,一个取反,一个不作处理,究竟选择哪一个,需要通过CC1P来设置,如果设置为0,则不处理,设置为1,则选择反向,再往后就是一个输出允许的电路(通过CC1E控制),通过外部的引脚输出一个电平。举个例子,当比较寄存器的值设定为5,当CNT等于5,就会产生一个信号,然后输出高电平,然后再相等,我就输出低电平,再相等,又输出高电平,这样就可以产生连续的脉冲。
关于输入部分的滤波 Filter down-counter:


首先有个时钟分频因子,是由寄存器的CKD[1:0]控制,比如设置为00,表示周期相同,则频率也相同;比如设置为01,表示数字滤波器的周期是定时器时钟的2倍,则频率是其1/2,若时钟频率为72Mhz,则 fDTS 频率为36Mhz.。采样频率 = 1/2 fDTS(这个公式待查阅资料再得知为什么),则采样频率为18Mhz。此时再设定采样次数,假设设定为6次,当采样第一次的时候是高电平,采样第二次的时候是高电平,当采样第六次的时候,还是高电平,则表示这个波的频率小于3Mhz,若第六次为低电平,则表示这个波的频率大于3Mhz,可以选择滤除高于3Mhz的波。采样频率在通道1输入部分的寄存器 ICF[3:0]中设定,若设定为6,采样6次,若波还是存在,则通过。

**滤波的基本道理:**如上图,TI1信号输入,采样次数设置为4,当采样到第4次,这个波突然变成了低电平,则这个波的频率比较高,认为是一个干扰(干扰一般都是瞬间的,频率很高),过滤掉,即 TI1F 一直保持低电平;若采样到第4次,仍为高电平,则认为这是一个正常波, TI1F会产生一个上升沿,因为在采样的时候占用的四个采样周期,故在这个波恢复到低电平的时候再弥补四个采样周期的时间,所以这个波在TI1F上只是相位退后了一点点,而长度,采集到的周期都是一样的。滤波之后输出TI1F,然后进入边沿检测,是高电平触发还是低电平触发,输出TI1FP1,然后进入预分频,如果预分频设为1,则直接过去,如果预分频设为2,则当检测到两次这个电平才产生IC1PS信号,由这个信号触发捕获/比较1寄存器,这个寄存器马上会将计数器的值装载下来,这样就得到了稍微准确的捕获时间。这个捕获时间在这里延后了4个采样周期。
滤波的好处:外部的信号经过这么一个滤波,可以节省软件的开销,硬件滤波更加稳定。硬件滤波实际上就是 消抖、去抖了。
那内部时钟(TIMXCLK)是怎么来的?
时钟系统
定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
APB1不但要为TIM2-7提供时钟,而且还要为其他外设提供时钟;设置这个倍频器可以在保证其他外设使用较低时钟频率时,TIM2-7仍能得到较高的时钟频率。即通过倍频器可以得到更高的频率。

每个定时器(比如TM1/TM2等等)都有四个通道(CH1—CH4),并分配了默认的引脚。例如
外部时钟源模式1
当TIMx_SMCR寄存器中的SMS=111时,次模式被选中。计数器可以在选定的输入上的每个上升沿或下降沿计数。
例如,要配置向上计数器在T12输入端的上升沿汁数,使用下列步骤:
配置TIMx_CCMR1寄存器CC2S=01, 配置通道2检测TI2输入的上升沿
配置TIMx_CCMR1寄存器的IC2F[3:0],选择输入滤波器带宽(滤波器作用是排除外界干扰)(如果不需要滤波器,保持IC2F=0000)
配置TIMx_CCER寄存器的CC2P=0,选定上升沿极性
配置TIMx_SMCR寄存器的SMS=111,选择定时器外部时钟模式1
配置TIMx_SMCR寄存器中的TS=110,选定TI2作为触发输入源
设置TIMx_CR1寄存器的CEN=1,启动计数器
当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。
在TI2的上升沿和计数器实际时钟之间的延时取决于在TI2输入端的重新同步电路。
计数模式
TIM 2- TIM 5可以由向上计数、向下计数、向上向下双向计数。
向上计数模式中,计数器从0计数到自动加载值( TIMx_ARR 计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。当TIMx _CR1寄存器中的 DIR 位为低的时候执行向上计数。
在向下模式中,计数器从自动装入的值( TIMx_ARR )开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数向下溢出事件。当 TIMx_CR1寄存器的 DIR 位为高时执行向下计数。
而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。当 TIMx_CR1寄存器中的 CMS 位不为00时为中央对齐模式。(双向计数其实就是从0加到n,然后再从n减到0,再从0加到n,如此循环)
向上计数模式
在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并产生一个计数器溢出事件。
比如,当 自动加载值 TIMx_ARR=0x36
CK_INT 表示内部时钟
CNT_EN 拉高表示使能允许计数
从 CK_CNT 看应该是上升沿计数
COUNTER REGISTER 开始计数时候的值是31,到了36,会重新从0开始
当计数到了自动加载值,会产生溢出、更新事件、中断信号标志位
注:分频因子为1表示没有分频,来一次脉冲,计数一次

注:分频因子不为1表示分频了,这里为2表示来两次脉冲,计数一次。
向下计数模式
在向下计数模式中,计数器从自动加载值(TIMx_ARR计数器的内容)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
同样假设当自动加载值 TIMx_ARR=0x36
自动重装载寄存器(TIMx_ARR)
该寄存器在物理上实际对应着2个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存 器在被叫做影子寄存器。事实上真正起作用的是影子寄存器。
根据TIMx_CR1寄存器中APRE位的设置:APRE=0时,预装载寄存器的内容 可以随时#送到影子寄存器,此时2者是连通的;而APRE=1时,在每一次更 新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器
史海拾趣
|
protel dxp中为什么没有intel的元件,到那可以下载到啊,谁能告诉我一下。 另外,在99se中有元件库Intel Databooks.ddb,怎么把他导入dxp中使用。… 查看全部问答> |
|
创意无限,只要你肯去做,水杯穿洞有点难度,需要家里电动工具齐全点就可以做,这个因该是最好看得一个,剩下的就比较简单,电子表的包装盒做大功率led外壳,散热真不错呢,至于汽车空气净化器不知大家见过没,像一个滚筒的芯,里面是纸地,外面是 ...… 查看全部问答> |
|
昨天看了一下电路图,发现内存(SDRAM)和2440接口有点不可思议(后来发现ATmel的ARM也是这么接的),后来仔细对比。 发现问题在LDQM,UDQM这两个引脚,他们接到2440的四个nWBE引脚。内存资料是这么说的:Data Input/Output Mask Controls output ...… 查看全部问答> |
|
公司现在高薪诚聘bss基站高级软件开发工程师(精通C++,两年以上C++研发经验,英语流利)! 工作地点:北京望京(爱立信总部) 可直接向我资讯 &nbs ...… 查看全部问答> |
|
请教PC主板关于BIOS的启动顺序??及如何在主板启动时屏蔽BIOS启动信息??? 请教PC主板关于BIOS的启动顺序??及如何在主板启动时屏蔽BIOS启动信息??? 本人现用PC104主板写DOS软件,但是主板启动后有自检信息,但是领导要求在主板启动时,不要显示主板自检信息,取代以LOGO,请个位多多赐教!!! ...… 查看全部问答> |
|
[color]第一步 打开一个ISE工程,随便哪一个有HDL组成的都可以,我打开的如下:第二步 进行综合,修改自己的错误。综合成功。 第三步,在区域2中点击区域3的选项运行,一定不要选择区域3上面的那个选项,出现如下界面:在 ...… 查看全部问答> |
|
vcredist_x86.exe 每次我一安装都出现这个提示,请问这是怎么回事,该怎么解决?谢谢 vcredist_x86.exe 每次我一安装都出现这个提示,请问这是怎么回事,该怎么解决?谢谢 无法访问 Windows Installer 服务 Windows Installer 没有正确安装时可能发生这种情况。 请与技术支持人员联系以获得帮助。… 查看全部问答> |
|
求教一个问题,我在写彩屏液晶的程序的时候,有16为驱动的程序有8位驱动的程序。有时候都能用,但有时候会就不能用,求分析哈。 TFT彩屏IC:9320 or 9325 接口声明: #define DATAOUT(x) GPIOB->ODR=x; //数据输出 #define DATAOUTH(x) GPIOB-> ...… 查看全部问答> |




