基于ARM的单片机应用及实践课件-第六章._第1页
基于ARM的单片机应用及实践课件-第六章._第2页
基于ARM的单片机应用及实践课件-第六章._第3页
基于ARM的单片机应用及实践课件-第六章._第4页
基于ARM的单片机应用及实践课件-第六章._第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第六六章章 STM32 定时器的使用定时器的使用本章内容STM32F的定时器简介通用定时器时基单元通用定时器特殊工作模式定时器编程及实训第六章 STM32 定时器的使用STM32中一共有11个定时器:2个高级控制定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器。TIM1,TIM8是能够产生三对PWM互补输出的高级定时器,常用于电动机的控制。它们的时钟由APB2的输出产生。TIM2TIM5是通用定时器:输入捕获输出比较PWM脉冲计数TIM6和TIM7是基本定时器:主要用于产生DAC触发信号,其时钟由APB1输出产生第六章 STM32 定时器的使用系统时基定时器SysTick

2、:24位递减计数器自动重加载常用于产生延时us级、ms级定时器的工作频率计算公式为CK_CNT=定时器时钟/(TIMx_PSC+1)其中CK_CNT表示定时器工作频率TIMx_PSC表示分频系数第六章 STM32 定时器的使用typedef struct vu32 CTRL; /SysTick控制和状态寄存器vu32 LOAD;/SysTick重装载值寄存器vu32 VAL; /SysTick当前值寄存器vuc32 CALIB;/SysTick校准值寄存器 SysTick_TypeDef;第六章 STM32 定时器的使用库函数:SysTick_CLKSourceConfig函数SysTick_

3、Setreload函数SysTick_CounterCmd函数SysTick_ITConfig函数SysTick_GetCounter函数SysTick_GetFlagStatus函数 第六章 STM32 定时器的使用STM32的通用定时器TIM,是一个通过可编程预分频器驱动的16位自动装载计数器构成。 通用TIMx定时器特性包括:具备16位向上,向下,向上/向下自动装载计数器。具备16位可编程预分频器。具备4个独立通道。使用外部信号控制定时器和定时器互连的同步电路。可以通过事件产生中断,中断类型丰富。具备DMA功能。 第六章 STM32 定时器的使用第六章 STM32 定时器的使用第六章 S

4、TM32 定时器的使用从上图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的浅蓝色部分。这个倍频器的作用:当APB1的预分频系数为1时,倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。下面举一个例子说明。假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM27的时钟频率=36MHz(倍频器不起作用);当预

5、分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM27的时钟频率=36MHz。既然需要TIM27的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?第六章 STM32 定时器的使用答案是:APB1不但要为TIM27提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM27仍能得到较高的时钟频率。第六章 STM32 定时器的使用例如普通定时器的时钟为72MHz,分频比为7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为TIMx_ARR =10000因为72000000 / 7200 =10KHz时钟周期T=1/1

6、0KHz=100us100us 10000 =1S结论 :分频比7199 定时计数器的值10000。第六章 STM32 定时器的使用第六章 STM32 定时器的使用通用定时器配置步骤1)TIM3时钟使能这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为Stm32_Clock_Init函数里面把APB1的分频设置为2了,所以我们的TIM3时钟就是APB1时钟的2倍,等于系统时钟(72M)。2)设置TIM3_ARR和TIM3_PSC的值通过这两个寄存器,设置自动重装的值及分频系数。这两个参数加上时钟频率就决定了定时器的溢出时间。3)设置TIM3_DIER允许更新中断因为我们要使用TIM3

7、的更新中断,所以设置DIER的UIE位,并使能触发中断。4)允许TIM3工作我们在配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。第六章 STM32 定时器的使用5)TIM3中断分组设置在定时器配置完了之后,因为要产生中断,必不可少的要设置NVIC相关寄存器,以使能TIM3中断。6)编写中断服务函数编写定时器中断服务函数,通过该函数处理定时器产生的相关中断。中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作。第六章 STM32 定时器的使用通用寄存器时基单元计数器寄存器:TIMx_CNT预分频器寄存器:TIMx_PSC自动装载寄存器:TIMx_ARR

8、第六章 STM32 定时器的使用通用寄存器时基单元1)计数器寄存器:TIMx_CNT16位的计数器,设定值从165535第六章 STM32 定时器的使用第六章 STM32 定时器的使用计数器模式向上计数模式:计数器从0计数到设定的数值,然后重新从0开始计数并且产生一个计数器溢出事件。计数器时序图(内部时钟分频因子为1)计数器时序图(内部时钟分频因子为2)向下计数模式:计数器从设定的数值开始向下计数到0,然后自动从设定的数值重新向下计数,并产生一个向下溢出事件。中央对齐模式(向上/向下计数):计数器从0开始计数到设定的数值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;

9、再从0开始重新计数。第六章 STM32 定时器的使用计数器时序图(内部时钟分频因子为1)第六章 STM32 定时器的使用计数器时序图(内部时钟分频因子为4)计数器在不同时钟频率下操作的例子:计数器时序图(内部时钟分频因子为1,TIMx_ARR=0 x6)第六章 STM32 定时器的使用计数器时序图(内部时钟分频因子为2)第六章 STM32 定时器的使用2)预分频器寄存器:TIMx_PSC预分频器可以讲计数器的时钟频率按1到65536之间的任意值分频,它是一个16位寄存器。这个寄存器带有缓冲区,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采。第六章 STM32 定时器的使用预分

10、频器寄存器在事件更新时采用第六章 STM32 定时器的使用3)自动装载寄存器:TIMx_ARR自动装载寄存器是预先装载的(要在使能定时器之前设定好),根据在TIMx_CR1寄存器中自动装载使能位(ARPE)的设置,立即或者在每次更新事件时传送到计数器。第六章 STM32 定时器的使用立即加载计数器第六章 STM32 定时器的使用更新事件时加载计数器第六章 STM32 定时器的使用时钟选择计数器时钟可以由下列时钟源提供:内部时钟(CK_INT)外部时钟模式1:外部输入脚(TIx)外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx)第六章 STM32 定时器的使用这些时钟,具体选择哪个

11、可以通过TIMx_SMCR寄存器的相关位来设置。这里的CK_INT时钟是从APB1倍频而来的,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍;当APB1的时钟不分频的时候,通用定时器TIMx的时钟就等于APB1的时钟。注意高级定时器的时钟不是来自APB1,而是来自APB2的。输入捕获模式 PWM 输入模式 输出模式 输出比较模式 PWM 模式 单脉冲模式(OPM)编码器接口模式 通用定时器的特殊工作模式 第六章 STM32 定时器的使用输入捕获模式输入捕获模式在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx

12、_CCRx)中。当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置1,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。第六章 STM32 定时器的使用PWM输入模式例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)1)选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。2)选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器

13、):置CC1P=0(上升沿有效)。第六章 STM32 定时器的使用3)选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。4)选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。5)选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。6)配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。第六章 STM32 定时器的使用 7) 使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式

14、只能使用TIMx_CH1 /TIMx_CH2信号。第六章 STM32 定时器的使用输出模式在输出模式(TIMx_CCMRx寄存器中CCxS=00)下,输出比较信号(OCxREF和相应的OCx)能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。例如:CCxP=0(OCx高电平有效),则OCx被强置为高电平。 置TIMx_CCMRx寄存器中的OCxM=100,可强置OCxREF信号为低。第六章 STM32 定时器的使用输出比较模式此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。 当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:1)将

15、输出比较模式和输出极性定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。第六章 STM32 定时器的使用2)设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。3)若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。4)若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位选择DMA请求功能),则产生一个DMA请求。第六章 STM32 定时器的使用输出比较模

16、式的配置步骤:1)选择计数器时钟(内部,外部,预分频器)。2)将相应数据写入TIMx_ARR和TIMx_CCRx寄存器中3)如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和CCxDE位。4)选择输出模式。5)设置TIMx_CR1寄存器的CEN位启动计数器。第六章 STM32 定时器的使用PWM模式脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入110(PWM模式1)或111(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCx

17、PE位以使能相应的预装载寄存器,最后要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。第六章 STM32 定时器的使用下面是一个PWM模式1的例子。当TIMx_CNTTIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为1。如果比较值为0,则OCxREF保持为0。 下图为TIMx_ARR=8时边沿对齐的PWM波形实例。第六章 STM32 定时器的使用第六章 STM32 定时器的使用PWM模式1的例子单脉冲模式单脉冲模式(OPM)是前述众多模式的一

18、个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后,产生一个脉宽可程序控制的脉冲。可以通过从模式控制器启动计数器,在输出比较模式或者PWM模式下产生波形。设置TIMx_CR1寄存器中的OPM位将选择单脉冲模式,这样可以让计数器自动地在产生下一个更新事件UEV时停止。第六章 STM32 定时器的使用第六章 STM32 定时器的使用编码器接口模式两个输入TI1和TI2被用来作为增量编码器的接口。计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1=TI1,TI2FP

19、2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数,同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。第六章 STM32 定时器的使用在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。 编码器接口模式相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计数)。所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。第六章 STM32 定时器的使用在这个模式下,计数器依

20、照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设TI1和TI2不同时变换。第六章 STM32 定时器的使用通用定时器及中断编程STM32的通用定时器为:TIM2、TIM3、TIM4和TIM5。利用库函数直接设置定时器如下:1. 使能定时器TIM_X的时钟:(X=2、3、4、5)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMX,ENABLE);1. 计算要定时的时间,根据定时时间来设定分频数和最大计数值(以向上计数为例子),第六章 STM32 定时器的使用其中计算

21、关系如下:系统时钟(一般为72MHZ)= 定时器分频数 * 计数值。如分频数为7200,则定时器时钟为72MHZ/7200=10KHZ,定时器每次计数时间间隔为1/10000秒,假如定时1秒,则要计数10000次,因此计数器的最大计数值为9999,因为计数器从零开始计数。第六章 STM32 定时器的使用3. 将相应分频数和计数值分别赋,如下:/自动重装的计数值 TIM_TimeBaseStructure.TIM_Period = (10000 - 1);/ 这个就是预分频系数 TIM_TimeBaseStructure.TIM_Prescaler =7200 ;/数字滤波器,定时时不涉及此功能,为零即可TIM_TimeBaseStructure.TIM_ClockDivision = 0;第六章 STM32 定时器的使用/计数模式选择,此处设置为向上模式TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounteMode_Up;/定时基本设置(X=2、3、4、5)TIM_TimeBaseInit(TIMX, &TIM_TimeBaseStructure);/清除定时器X的中断溢出标识TIM_ClearITPendingBit(TIMX, TIM_IT_Update);/开定时器X溢出中断TIM_ITC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论