STM32 例程定时器.docx

上传人:b****3 文档编号:3814274 上传时间:2023-05-06 格式:DOCX 页数:19 大小:288.57KB
下载 相关 举报
STM32 例程定时器.docx_第1页
第1页 / 共19页
STM32 例程定时器.docx_第2页
第2页 / 共19页
STM32 例程定时器.docx_第3页
第3页 / 共19页
STM32 例程定时器.docx_第4页
第4页 / 共19页
STM32 例程定时器.docx_第5页
第5页 / 共19页
STM32 例程定时器.docx_第6页
第6页 / 共19页
STM32 例程定时器.docx_第7页
第7页 / 共19页
STM32 例程定时器.docx_第8页
第8页 / 共19页
STM32 例程定时器.docx_第9页
第9页 / 共19页
STM32 例程定时器.docx_第10页
第10页 / 共19页
STM32 例程定时器.docx_第11页
第11页 / 共19页
STM32 例程定时器.docx_第12页
第12页 / 共19页
STM32 例程定时器.docx_第13页
第13页 / 共19页
STM32 例程定时器.docx_第14页
第14页 / 共19页
STM32 例程定时器.docx_第15页
第15页 / 共19页
STM32 例程定时器.docx_第16页
第16页 / 共19页
STM32 例程定时器.docx_第17页
第17页 / 共19页
STM32 例程定时器.docx_第18页
第18页 / 共19页
STM32 例程定时器.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

STM32 例程定时器.docx

《STM32 例程定时器.docx》由会员分享,可在线阅读,更多相关《STM32 例程定时器.docx(19页珍藏版)》请在冰点文库上搜索。

STM32 例程定时器.docx

STM32例程定时器

实验目的

STM32定时器基本用法

STM32定时器固件库学习

定时器中断的使用

[编辑]实验要求

完成一个跑马灯实验

1s的确定间隔时间

[编辑]硬件分析

[编辑]定时器

在STM32F10xxx系列的32位MCU上,定时器资源十分丰富,包括高级控制定时器,通用定时器和基本定时器。

此外,还有能够实现定时功能的系统滴答定时器,实时时钟以及看门狗。

关于这些定时器的介绍,占据了STM32F10xxx参考手册1/5的篇幅,可见其功能的强大。

在低容量和中容量的STM32F103xx产品,以及互联型产品STM32F105xx和STM32F107xx中,只有一个高级控制定时器TIM1。

而在高容量和超大容量的STM32F103xx产品中,有两个高级控制定时器TIM1和TIM8。

在所有STM32F10xxx系列产品中,都有通用定时器TIM2~TIM5,除非另有说明。

除此之外,在超大容量产品中,还有通用定时器TIM9~TIM14。

在高容量和超大容量的STM32F101xx和STM32F103xx产品,以及互联型产品STM32F105xx和STM32F107xx中,有两个基本定时器TIM6和TIM7。

其中,高级控制定时器的功能最为强大,可以实现所有其他定时器的所有功能。

TrailBreaker开发板使用的是高容量的STM32F103ZE,因此有两个高级控制定时器TIM1和TIM8。

下面我们就着重介绍这两个高级控制定时器。

[编辑]TIM1和TIM8简介

高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。

它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。

使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

关于实验中用到的LED部分原理图和GPIO跑马灯实验所用到的相同,在此不再多做介绍。

TIM1和TIM8定时器的功能包括:

16位向上、向下、向上/下自动装载计数器

16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值

多达4个独立通道:

─输入捕获─输出比较─PWM生成(边缘或中间对齐模式)─单脉冲模式输出

死区时间可编程的互补输出

使用外部信号控制定时器和定时器互联的同步电路

允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器

刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态

如下事件发生时产生中断/DMA:

─更新:

计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)

─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)

─输入捕获

─输出比较

─刹车信号输入

支持针对定位的增量(正交)编码器和霍尔传感器电路

触发输入作为外部时钟或者按周期的电流管理

[编辑]高级定时器框图和时钟简介

如框图中的红框所示,红框中的部分,也是时基单元(Time-baseunit),对时基单元进行设置,就可以完成基础的定时器的使用设置。

计数器时钟可由下列时钟源提供:

●内部时钟(CK_INT)

●外部时钟模式1:

外部输入引脚

●外部时钟模式2:

外部触发输入ETR

●内部触发输入(ITRx):

使用一个定时器作为另一个定时器的预分频器。

如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

详见数据手册的通用定时器部分。

内部时钟源(CK_INT):

如果禁止了从模式控制器(SMS=000),则CEN、DIR(TIMx_CR1寄存器)和UG位(TIMx_EGR寄存器)是事实上的控制位,并且只能被软件修改(UG位仍被自动清除)。

只要CEN位被写成’1’,预分频器的时钟就由内部时钟CK_INT提供。

下图显示控制电路和向上计数器在一般模式下,不带预分频器时的操作。

外部时钟源模式1

当TIMx_SMCR寄存器的SMS=111时,此模式被选中。

计数器可以在选定输入端的每个上升沿或下降沿计数。

下图为TI2外部时钟连接例子

例如,要配置向上计数器在T12输入端的上升沿计数,使用下列步骤:

1.配置TIMx_CCMR1寄存器CC2S=01

2.配置通道2检测TI2输入的上升沿

3.配置TIMx_CCMR1寄存器的IC2F[3:

0],选择输入滤波器带宽(如果不需要滤波器,保持IC2F=0000)

4.配置TIMx_CCER寄存器的CC2P=0,选定上升沿极性

5.配置TIMx_SMCR寄存器的SMS=111,选择定时器外部时钟模式1

6.配置TIMx_SMCR寄存器中的TS=110,选定TI2作为触发输入源

7.设置TIMx_CR1寄存器的CEN=1,使能计数器

注:

捕获预分频器不用作触发,所以不需要对它进行配置

当上升沿出现在TI2,计数器计数一次,且TIF标志被设置。

在TI2的上升沿和计数器实际时钟之间的延时,取决于在TI2输入端的重新同步电路。

下图为外部时钟模式1下的控制电路

外部时钟源模式2

选定此模式的方法为:

令TIMx_SMCR寄存器中的ECE=1。

计数器能够在外部触发ETR的每一个上升沿或下降沿计数。

下图是外部触发输入的框图

设置从模式控制寄存器的ETP位选择选择是用ETR还是ETR的反相来作为触发操作

例如,要配置在ETR下每2个上升沿计数一次的向上计数器,使用下列步骤:

1.本例中不需要滤波器,置TIMx_SMCR寄存器中的ETF[3:

0]=0000

2.设置预分频器,置TIMx_SMCR寄存器中的ETPS[1:

0]=01

3.选择ETR的上升沿检测,置TIMx_SMCR寄存器中的ETP=0

4.开启外部时钟模式2,写TIMx_SMCR寄存器中的ECE=1

5.启动计数器,写TIMx_CR1寄存器中的CEN=1

计数器在每2个ETR上升沿计数一次。

在ETR的上升沿和计数器实际时钟之间的延时取决于在ETRP信号端的重新同步电路。

下图为外部时钟模式2下的控制电路

如图,该图为STM32的时钟树,结合高级控制定时器框图,我们可以看出,高级定时器的时钟不是直接来自APB2,而是来自于输入为APB2的一个倍频器。

当APB2的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB2的频率;当APB2的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个分频器起作用,定时器的时钟频率等于APB2的频率相应倍数。

假定AHB=36MHz,因为APB2允许的最大频率为72MHz,所以APB2的预分频系数可以取任意数值;当预分频系数=1时,APB2=72MHz,TIM1和TIM8的时钟频率=72MHz(分频器不起作用);当预分频系数=2时,APB1=36MHz,在倍频器的作用下,TIM1和TIM8的时钟频率=72MHz。

有人会问,既然需要TIM1和TIM8的时钟频率为72MHz,为什么不直接取APB2的预分频系数=1?

答案是:

APB2不但要为TIM1和TIM8提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM1和TIM8仍能得到较高的时钟频率。

再举个例子:

当AHB=72MHz时,APB2因为其他设备需要,时钟为36MHZ,因为这个倍频器,TIM1和TIM8仍然能够得到72MHz的时钟频率。

能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

[编辑]高级定时器寄存器简介

可编程高级控制定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。

这个计数器可以向上计数、向下计数或者向上向下双向计数。

此计数器时钟由预分频器分频得到。

计数器、自动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还在运行读写仍然有效。

时基单元,也就是决定了定时器的基本功能的模块包含:

1.计数器寄存器(Counterregister,简写为TIMx_CNT)

2.预分频器寄存器(Prescalerregister,简写为TIMx_PSC)

3.自动装载寄存器(Auto-reloadregister,简写为TIMx_ARR)

4.重复次数寄存器(Repetitioncounterregister,简写为TIMx_RCR)

[编辑]1.影子寄存器

这张图是高级定时器框图的一部分,细心的人可以发现预分频器寄存器、自动重载寄存器和捕捉/比较寄存器下面有一个阴影,其他的寄存器有些也有阴影。

这表示在物理上这个寄存器对应2个寄存器:

一个是我们可以可以写入或读出的寄存器,称为预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为影子寄存器.

数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。

原文如下:

Theauto-reloadregisterispreloaded.Writingtoorreadingfromtheauto-reloadregisteraccessesthepreloadregister.Thecontentofthepreloadregisteraretransferredintotheshadowregisterpermanentlyorateachupdateevent(UEV),dependingontheauto-reloadpreloadenablebit(ARPE)inTIMx_CR1register.Theupdateeventissentwhenthecounterreachestheoverflow(orunderflowwhendowncounting)andiftheUDISbitequals0intheTIMx_CR1register.Itcanalsobegeneratedbysoftware.Thegenerationoftheupdateeventisdescribedindetailedforeachconfiguration.

在图中的,表示对应寄存器的影子寄存器可以在发生更新事件时,被更新为它的预装载寄存器的内容;而图中的部分,表示对应的自动重载寄存器可以产生一个更新事件(U)或更新事件中断(UI)。

设计预装载寄存器和影子寄存器的好处是,所有真正需要起作用的寄存器(影子寄存器)可以在同一个时间(发生更新事件时)被更新为所对应的预装载寄存器的内容,这样可以保证多个通道的操作能够准确地同步。

如果没有影子寄存器,软件更新预装载寄存器时,则同时更新了真正操作的寄存器,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上例如中断等其它因素,多个通道的时序关系有可能会混乱,造成是不可预知的结果。

[编辑]2.预分频寄存器

预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。

它是基于一个在TIMx_PSC寄存器中的16位寄存器控制的16位计数器。

因为这个控制寄存器带有缓冲器,它能够在运行时被改变。

新的预分频器的参数在下一次更新事件到来时被采用。

下面给出了在预分频器运行时,更改计数器参数的例子

当预分频器的参数从1变到2时,计数器的时序图如下:

当预分频器的参数从1变到4时,计数器的时序图如下:

预分频寄存器各位的描述如下:

位15:

0PSC[15:

0]:

预分频值

计数器的时钟频率(CK_CNT)等于fCK_PSC/(PSC[15:

0]+1)。

PSC的值保存在预分频寄存器的预装载寄存器中,在每次更新事件时加载至影子寄存器.

[编辑]3.计数器寄存器

高级定时器计数模式:

在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。

如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事件(UEV);否则每次计数器溢出时才产生更新事件。

在事件产生寄存器寄存器中(通过软件方式或者使用从模式控制器)设置UG位也同样可以产生一个更新事件。

设置TIMx_CR1寄存器中的UDIS位,可以禁止更新事件;这样可以避免在向预装载寄存器中写入新值时更新影子寄存器。

在UDIS位被清’0’之前,将不产生更新事件。

但是在应该产生更新事件时,计数器仍会被清’0’,同时预分频器的计数也被请0(但预分频器的数值不变)。

此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV,但硬件不设置UIF标志(即不产生中断或DMA请求)。

这是为了避免在捕获模式下清除计数器时,同时产生更新和捕获中断。

当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。

●重复计数器被重新加载为TIMx_RCR寄存器的内容。

●自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。

●预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。

下面给出一些例子,当TIMx_ARR=0x36时计数器在不同时钟频率下的动作。

内部时钟分频因子为1时的计数器时序图如下:

内部时钟分频因子为2时的计数器时序图如下:

内部时钟分频因子为4时的计数器时序图如下:

内部时钟分频因子为N时的计数器时序图如下:

当ARPE=0时的更新事件(TIMx_ARR没有预装入)时的计数器时序图如下:

当ARPE=1时的更新事件(TIMx_ARR预装入)时的计数器时序图如下:

在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。

如果使用了重复计数器,当向下计数重复了重复计数寄存器(TIMx_RCR)中设定的次数后,将产生更新事件(UEV),否则每次计数器下溢时才产生更新事件。

在TIMx_EGR寄存器中(通过软件方式或者使用从模式控制器)设置UG位,也同样可以产生一个更新事件。

设置TIMx_CR1寄存器的UDIS位可以禁止UEV事件。

这样可以避免向预装载寄存器中写入新值时更新影子寄存器。

因此UDIS位被清为0之前不会产生更新事件。

然而,计数器仍会从当前自动加载值重新开始计数,并且预分频器的计数器重新从0开始(但预分频系数不变)。

此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。

当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。

●重复计数器被重置为TIMx_RCR寄存器中的内容

●预分频器的缓存器被加载为预装载的值(TIMx_PSC寄存器的值)。

●当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。

注:

自动装载在计数器重载入之前被更新,因此下一个周期将是预期的值。

下面是一些当TIMx_ARR=0x36时,计数器在不同时钟频率下的动作。

内部时钟分频因子为1时的计数器时序图如下:

内部时钟分频因子为2时的计数器时序图如下:

内部时钟分频因子为4时的计数器时序图如下:

内部时钟分频因子为N时的计数器时序图如下:

当没有使用重复计数器时的更新事件时的计数器时序图:

中央对齐模式(up/downcounting)在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−s211,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。

在此模式下,不能写入TIMx_CR1中的DIR方向位。

它由硬件更新并指示当前的计数方向。

可以在每次计数上溢和每次计数下溢时产生更新事件;也可以通过(软件或者使用从模式控制器)设置TIMx_EGR寄存器中的UG位产生更新事件。

然后,计数器重新从0开始计数,预分频器也重新从0开始计数。

设置TIMx_CR1寄存器中的UDIS位可以禁止UEV事件。

这样可以避免在向预装载寄存器中写入新值时更新影子寄存器。

因此UDIS位被清为0之前不会产生更新事件。

然而,计数器仍会根据当前自动重加载的值,继续向上或向下计数。

此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。

当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。

●重复计数器被重置为TIMx_RCR寄存器中的内容

●预分频器的缓存器被加载为预装载(TIMx_PSC寄存器)的值。

●当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。

注:

如果因为计数器溢出而产生更新,自动重装载将在计数器重载入之前被更新,因此下一个周期将是预期的值(计数器被装载为新的值)。

下面是一些计数器在不同时钟频率下的操作的例子:

内部时钟分频因子为1,TIMx_ARR=0x6时的计数器时序图:

内部时钟分频因子为2时的计数器时序图:

内部时钟分频因子为4,TIMx_ARR=0x36时的计数器时序图:

注:

在此无论是中心对齐模式2或3都是在溢出时与UIF标志一起使用

内部时钟分频因子为N,计数器时序图如下:

ARPE=1时的更新事件(计数器下溢),计数器时序图如下:

计数器寄存器各位的描述如下:

位15:

0ARR[15:

0]:

自动重装载的值(Prescalervalue)

ARR包含了将要装载入实际的自动重装载寄存器的值。

详细参考数据手册13.3.1节:

有关ARR的更新和动作。

当自动重装载的值为空时,计数器不工作。

[编辑]4.重复计数器

前面解释了计数器上溢/下溢时更新事件(UEV)是如何产生的,然而事实上它只能在重复计数达到0的时候产生。

这个特性对产生PWM信号非常有用。

这意味着在每N次计数上溢或下溢时,数据从预装载寄存器传输到影子寄存器(TIMx_ARR自动重载入寄存器,TIMx_PSC预装载寄存器,还有在比较模式下的捕获/比较寄存器TIMx_CCRx),N是TIMx_RCR重复计数寄存器中的值。

重复计数器在下述任一条件成立时递减:

●向上计数模式下每次计数器溢出时,

●向下计数模式下每次计数器下溢时,

●中央对齐模式下每次上溢和每次下溢时。

虽然这样限制了PWM的最大循环周期为128,但它能够在每个PWM周期2次更新占空比。

在中央对齐模式下,因为波形是对称的,如果每个PWM周期中仅刷新一次比较寄存器,则最大的分辨率为2xTck。

重复计数器是自动加载的,重复速率是由TIMx_RCR寄存器的值定义。

当更新事件由软件产生(通过设置TIMx_EGR中的UG位)或者通过硬件的从模式控制器产生,则无论重复计数器的值是多少,立即发生更新事件,并且TIMx_RCR寄存器中的内容被重载入到重复计数器。

下图为不同模式下更新速率的例子,及TIMx_RCR的寄存器设置

重复计数器各位的描述如下:

位15:

8保留位,始终读为0。

位7:

0REP[7:

0]:

重复计数器的值(Repetitioncountervalue)开启了预装载功能后,这些位允许用户设置比较寄存器的更新速率(即周期性地从预装载寄存器传输到当前寄存器);如果允许产生更新中断,则会同时影响产生更新中断的速率。

每次向下计数器REP_CNT达到0,会产生一个更新事件并且计数器REP_CNT重新从REP值开始计数。

由于REP_CNT只有在周期更新事件U_RC发生时才重载REP值,因此对TIMx_RCR寄存器写入的新值只在下次周期更新事件发生时才起作用。

这意味着在PWM模式中,(REP+1)对应着:

-在边沿对齐模式下,PWM周期的数目;

-在中心对称模式下,PWM半周期的数目;

[编辑]5.控制寄存器1

控制寄存器1各位的描述如下:

位15:

10保留,始终读为0。

位9:

8CKD[1:

0]:

时钟分频因子(Clockdivision)

这2位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用的采样时钟之间的分频比例。

00:

tDTS=tCK_INT

01:

tDTS=2xtCK_INT

10:

tDTS=4xtCK_INT

11:

保留,不要使用这个配置

位7ARPE:

自动重装载预装载允许位(Auto-reloadpreloadenable)

0:

TIMx_ARR寄存器没有缓冲;

1:

TIMx_ARR寄存器被装入缓冲器。

位6:

5CMS[1:

0]:

选择中央对齐模式(Center-alignedmodeselection)

00:

边沿对齐模式。

计数器依据方向位(DIR)向上或向下计数。

01:

中央对齐模式1。

计数器交替地向上和向下计数。

配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。

10:

中央对齐模式2。

计数器交替地向上和向下计数。

配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向上计数时被设置。

11:

中央对齐模式3。

计数器交替地向上和向下计数。

配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。

在计数器开启时(CEN=1),不允许从边沿对齐模式转换到中央对齐模式。

位4DIR:

方向(Direction)

0:

计数器向上计数;

1:

计数器向下计数。

当计数器配置为中央对齐模式或编码器模式时,该位为只读。

位3OPM:

单脉冲模式(Onepulsemode)

0:

在发生更新事件时,计数器不停止;

1:

在发生下一次更新事件(清除CEN位)时,计数器停止。

位2URS:

更新请求源(Updaterequestsource)

软件通过该位选择UEV事件的源

0:

如果使能了更新中断或DMA请求,则下述任一事件产生更新中断或DMA请求:

−计数器溢出/下溢

−设置UG位

−从模式控制器产生的更新

1:

如果使能了更新中断或DMA请求,则只有计数器溢出/下溢才产生更新中断或DMA请求

位1UDIS:

禁止更新(Updatedisable)

软件通过该位允许/禁止UEV事件的产生

0:

允许UEV。

更新(UEV)事件由下述任一事件产生:

−计数器溢出/下溢

−设置UG位

−从模式控制器产生的更新具有缓存的寄存器被装入它们的预装载值。

(更新影子寄存器)

1:

禁止UEV。

不产生更新事件,影

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2