基于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输出产生 第六章 STM

2、32 定时器的使用 系统时基定时器SysTick: 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 定时器的使用

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

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

5、1的预分频系数可 以取任意数值;当预分频系数=1时,APB1=36MHz, TIM27的时钟频率=36MHz(倍频器不起作用); 当预分频系数=2时,APB1=18MHz,在倍频器的作用 下,TIM27的时钟频率=36MHz。 既然需要TIM27的时钟频率=36MHz,为什么不直接 取APB1的预分频系数=1? 第六章 STM32 定时器的使用 答案是:APB1不但要为TIM27提供时钟,而且还要 为其它外设提供时钟;设置这个倍频器可以在保证其 它外设使用较低时钟频率时,TIM27仍能得到较高的 时钟频率。 第六章 STM32 定时器的使用 例如普通定时器的时钟为72MHz,分频比为7199,

6、那么 我们想要得到一个1秒钟的定时,定时计数器的值需 要设定为 TIMx_ARR =10000 因为72000000 / 7200 =10KHz 时钟周期T=1/10KHz=100us 100us 10000 =1S 结论 :分频比7199 定时计数器的值10000。 第六章 STM32 定时器的使用 第六章 STM32 定时器的使用 通用定时器配置步骤 1)TIM3时钟使能 这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为 Stm32_Clock_Init函数里面把APB1的分频设置为2了, 所以我们的TIM3时钟就是APB1时钟的2倍,等于系统时 钟(72M)。 2)设置TIM

7、3_ARR和TIM3_PSC的值 通过这两个寄存器,设置自动重装的值及分频系数。这 两个参数加上时钟频率就决定了定时器的溢出时间。 3)设置TIM3_DIER允许更新中断 因为我们要使用TIM3的更新中断,所以设置DIER 的UIE位,并使能触发中断。 4)允许TIM3工作 我们在配置完后要开启定时器,通过TIM3_CR1的 CEN位来设置。 第六章 STM32 定时器的使用 5)TIM3中断分组设置 在定时器配置完了之后,因为要产生中断,必不可少的 要设置NVIC相关寄存器,以使能TIM3中断。 6)编写中断服务函数 编写定时器中断服务函数,通过该函数处理定时器 产生的相关中断。中断产生后,

8、通过状态寄存器的 值来判断此次产生的中断属于什么类型。然后执行 相关的操作。 第六章 STM32 定时器的使用 通用寄存器时基单元 计数器寄存器:TIMx_CNT 预分频器寄存器:TIMx_PSC 自动装载寄存器:TIMx_ARR 第六章 STM32 定时器的使用 通用寄存器时基单元 1)计数器寄存器:TIMx_CNT 16位的计数器,设定值从165535 第六章 STM32 定时器的使用 第六章 STM32 定时器的使用 计数器模式 向上计数模式:计数器从0计数到设定的数值,然后 重新从0开始计数并且产生一个计数器溢出事件。 计数器时序图(内部时钟分频因子为1) 计数器时序图(内部时钟分频因

9、子为2) 向下计数模式: 计数器从设定的数值开始向下计数到0,然后自动从设 定的数值重新向下计数,并产生一个向下溢出事件。 中央对齐模式(向上/向下计数): 计数器从0开始计数到设定的数值-1,产生一个计数器 溢出事件,然后向下计数到1并且产生一个计数器下溢 事件;再从0开始重新计数。 第六章 STM32 定时器的使用 计数器时序图(内部时钟分频因子为1) 第六章 STM32 定时器的使用 计数器时序图(内部时钟分频因子为4) 计数器在不同时钟频率下操作的例子: 计数器时序图(内部时钟分频因子为1,TIMx_ARR=0 x6) 第六章 STM32 定时器的使用 计数器时序图(内部时钟分频因子为

10、2) 第六章 STM32 定时器的使用 2)预分频器寄存器:TIMx_PSC 预分频器可以讲计数器的时钟频率按1到65536之间的任 意值分频,它是一个16位寄存器。 这个寄存器带有缓冲区,它能够在工作时被改变。新的 预分频器参数在下一次更新事件到来时被采。 第六章 STM32 定时器的使用 预分频器寄存器在事件更新时采用 第六章 STM32 定时器的使用 3)自动装载寄存器:TIMx_ARR 自动装载寄存器是预先装载的(要在使能定时器之前 设定好),根据在TIMx_CR1寄存器中自动装载使能 位(ARPE)的设置,立即或者在每次更新事件时传送 到计数器。 第六章 STM32 定时器的使用 立

11、即加载计数器 第六章 STM32 定时器的使用 更新事件时加载计数器 第六章 STM32 定时器的使用 时钟选择 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx) 第六章 STM32 定时器的使用 这些时钟,具体选择哪个可以通过TIMx_SMCR寄存器 的相关位来设置。 这里的CK_INT时钟是从APB1倍频而来的,除非APB1 的时钟分频数设置为1,否则通用定时器TIMx的时钟 是APB1时钟的2倍; 当APB1的时钟不分频的时候,通用定时器TIMx的时钟 就等于APB1的时钟。

12、注意高级定时器的时钟不是来自 APB1,而是来自APB2的。 输入捕获模式 PWM 输入模式 输出模式 输出比较模式 PWM 模式 单脉冲模式(OPM) 编码器接口模式 通用定时器的特殊工作模式 第六章 STM32 定时器的使用 输入捕获模式输入捕获模式 在输入捕获模式下,当检测到ICx信号上相应的边沿后 ,计数器的当前值被锁存到捕获/比较寄存器 (TIMx_CCRx)中。当捕获事件发生时,相应的CCxIF标 志(TIMx_SR寄存器)被置1,如果使能了中断或者 DMA操作,则将产生中断或者DMA操作。 在捕获模式下,捕获发生在影子寄存器上,然后再复 制到预装载寄存器中。 第六章 STM32

13、定时器的使用 PWM输入模式 例如,你需要测量输入到TI1上的PWM信号的长度 (TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具 体步骤如下(取决于CK_INT的频率和预分频器的值) 1)选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存 器的CC1S=01(选择TI1)。 2)选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1 中和清除计数器):置CC1P=0(上升沿有效)。 第六章 STM32 定时器的使用 3)选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄 存器的CC2S=10(选择TI1)。 4)选择TI1FP2的有效极性(捕获数据到

14、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输入模式只能使用TIMx_CH1 /TIMx_CH2信号。 第六章 STM32 定时器的使用 输出模式 在输出模式(TIMx_CCMRx寄存器中CCxS=00)下,输出 比较信号(OCxREF和相

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

16、置成无效电平(OCxM=010)或进行翻转(OCxM=011)。 第六章 STM32 定时器的使用 2)设置中断状态寄存器中的标志位(TIMx_SR寄存器中 的CCxIF位)。 3)若设置了相应的中断屏蔽(TIMx_DIER寄存器中的 CCxIE位),则产生一个中断。 4)若设置了相应的使能位(TIMx_DIER寄存器中的 CCxDE位,TIMx_CR2寄存器中的CCDS位选择DMA 请求功能),则产生一个DMA请求。 第六章 STM32 定时器的使用 输出比较模式的配置步骤: 1)选择计数器时钟(内部,外部,预分频器)。 2)将相应数据写入TIMx_ARR和TIMx_CCRx寄存器中 3)如

17、果要产生一个中断请求和/或一个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 寄存器OCxPE位以使能相应的预装载寄存器, 最后要设置TIMx_CR1寄存器的ARPE位,(在向上计数 或中心对称

18、模式中)使能自动重装载的预装载寄存器。 第六章 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)是前述众多模式的一个特例。这种模 式允许计数器响应一个激励,并在一个程序可控的延 时之后,产生

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

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

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

22、 其中计算关系如下: 系统时钟(一般为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_Counte Mode_Up; /定时基本设置(X=2、3、4、5) TIM_TimeBaseInit(TIMX, /清除定时器X的中断溢出标识 TIM_ClearITPendingBit(TIMX, TIM_IT_Update); /开定时器X溢出中断 TIM_I

温馨提示

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

最新文档

评论

0/150

提交评论