微机原理及单片机应用技术-定时器原理及应用_第1页
微机原理及单片机应用技术-定时器原理及应用_第2页
微机原理及单片机应用技术-定时器原理及应用_第3页
微机原理及单片机应用技术-定时器原理及应用_第4页
微机原理及单片机应用技术-定时器原理及应用_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

定时器原理及应用本章主要内容10.1定时器概述10.2基本定时器10.3通用定时器10.4高级定时器10.5STM32F10x定时器相关库函数

10.6STM32F103定时器开发实例10.1定时器的概述本章讲述微控制器另一个基本的片上外设--定时器。定时器是微控制器必备的片上外设。微控制器中的定时器实际上是一个计数器,可以对内部脉冲/外部输入进行计数,不仅具有基本的计数/延时功能,还具有输入捕获、输出比较和PWM输出等高级功能。定时器的资源十分丰富,包括高级控制定时器、通用定时器和基本定时器。在低容量和中容量的STM32F103XX系列产品中,以及互连型产品STM32F105XX系列和STM32F107XX系列中,只有一个高级控制定时器TIM1。而在高容量和超大容量的STM32F103XX系列产品中,有两个高级控制定时器TIM1和TIM8。在所有的STM32F10XXX系列产品中,都有通用定时器TIM2~TIM5

本书以STM32F103系列为例,在该系列产品中最多有11个定时器,其中2个高级控制定时器,4个通用定时器,2个基本定时器,2个看门狗定时器,以及1个系统嘀嗒定时器。本章主要讨论前8个定时器。在嵌入式系统中,使用定时器可以完成以下功能:在多任务的分时系统中用作中断来实现任务的切换;周期性执行某个任务,如每隔固定时间完成一次AD采集;延时一定时间执行某个任务,如交通灯信号变化;显示实时时间,如万年历;产生不同频率的波形,如MP3播放器;产生不同脉宽的波形,如驱动伺服电机;测量脉冲的个数,如测量转速;测量脉冲的宽度,如测量频率。

10.2基本定时器

基本定时器TIM6和TIM7只具备最基本的定时功能,就是累加的时钟脉数超过预定值时,能触发中断或触发DMA请求。由于在芯片内部与DAC外设相连,可通过触发输出驱动DAC,也可以作为其他通用定时器的时钟基准。基本定时器框图见图这两个基本定时器使用的时钟源都是TIMxCLK,时钟源经过PSC预分频器输入至脉冲计数器TIMx_CNT,基本定时器只能工作在向上计数模式,在重载寄存器TIMx_ARR中保存的是定时器的溢出值。工作时,脉冲计数器TIMx_CNT由时钟触发进行计数,当TIMx_CNT的计数值X等于重载寄存器TIMx_ARR中保存的数值N时,产生溢出事件,可触发中断或DMA请求。然后TIMx_CNT的值重新被置为0,重新向上计数。10.3通用定时器相比之下,通用定时器TIM2~TIM5就比基本定时器复杂得多了。除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出PWM脉冲的场合,还具有编码器的接口。STM32F103系列通用定时器的主要功能如下:具有自动重装载功能的16位递增/递减计数器,其内部时钟CK_CNT的来源TIMxCLT来自APB1预分频器的输出。具有4个独立的通道,每个通道都可以用于输入捕获、输出比较、PWM输入和输出以及单脉冲模式输出等。在更新、触发、输入捕获以及输出比较事件时,可产生中断/DMA请求。支持针对定位的增量编码器和霍尔传感器电路。使用外部信号控制定时器和定时器互连的同步电路。触发输入作为外部时钟或者按周期的电流管理。通用定时器框图见下图。硬件结构可分为三个部分:时钟源、时钟单元、捕获和比较通道。10.3.1时钟源的选择

定时器时钟可由下述时钟源提供。(1)内部时钟(CK_INT,Internalclock)。(2)外部时钟模式1:外部输入脚(Tix),包括外部比较捕获引脚TI1F_ED、TI1FP1和TI2FP2,计数器在选定引脚的上升沿或下降沿开始计数。(3)外部时钟模式2:外部触发输入(ExternalTriggerInput,ETR),计数器在ETR引脚的上升沿或下降沿开始计数。(4)内部触发输入(ITRx,x=0,1,2,3):一个定时器作为另一个定时器的预分频器,如可以配置一个定时器TIM1作为另一个定时器TIM2的预分频器。除内部时钟外,其他3种时钟源都通过TRGI(触发输入),如图内部时钟源(CK_INT)如果选择内部时钟源的话则与基本定时器一样,也为TIMxCLK。但要注意的是,所有定时器(包括基本、通用和高级)使用内部时钟时,定时器的时钟源都被称为TIMxCLK,但TIMxCLK的时钟来源并不是完全一样的,如图所示,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。TIM2~7也就是通用定时器,TIMxCLK的时钟来源是APB1预分频器的输出。当APB1的分频系数为1时,则TIM2~7的TIMxCLK直接等于该APB1预分频器的输出,当APB1的预分频系数为其他数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,TIM2~7的TIMxCLK则为APB1预分频器输出的2倍。10.3.2时基单元STM32的通用定时器的时基单元包含计数器(TIMx_CNT)、预分频器(TIMx_PSC)、和自动装置寄存器(TIMx_ARR)等,如图所示。计数器、自动装载寄存器和预分频器可以由软件进行读/写操作,在计数器运行时仍可读/写。CNT计数器UUI自动装载寄存器PSC预分频器U停止、清零或递增/减CK_CNTCK_PSC+/-从时钟源送来的时钟信号,首先经过预分频器的分频,降低频率后输出信号CK_CNT,送入计数器进行计数,预分频器的分频取值范围可以是1~65536之间的任意数值。一个72MHz的输入信号经过分频后,可以产生最小接近1100Hz的信号。计数器具有16位计数功能,它可以在时钟控制单元的控制下,进行递增计数、递减计数或中央对齐计数(即先增计数,达到自动重装载寄存器的数值后再递减计数)。10.3.3捕获/比较寄通道通用定时器的基本计时功能与基本定时器的工作方式是一样的,同样把时钟源经过预分频器输出到脉冲计数器TIMx_CNT累加,溢出时就产生中断或DMA请求。而通用定时器比基本定时器多出的强大功能,就是因为通用定时器多出了一种寄存器--捕获/比较寄存器TIMx_CCR(capture/compareregister)。它包括捕获输入部分(数字滤波、多路复用和预分频器)和比较输出部分(比较器和输出控制)。当一个通道工作于捕获模式时,该通道的输出部分自动停止工作;同样,当一个通道工作于比较模式时,该通道的输入部分自动停止工作。1.捕获通道

当一个通道工作于捕获模式时,输入信号从引脚经输入滤波、边沿检测和预分频电路后,控制捕获寄存器的操作。当指定的输入边沿到来时,定时器将该时刻计数器的当前数值复制到捕获寄存器,并在中断使能时产生中断。读出捕获寄存器的内容,就可以知道信号发生变化的准确时间。2.比较通道当一个通道工作于比较模式时,用户程序将比较数值写入比较寄存器,定时器会不停地将该寄存器的内容与计数器的内容进行比较,一旦比较条件成立,则产生相应的输出。如果使能了中断,则产生中断;如果使能了引脚输出,则按照控制电路的设置产生输出波形。这个通道最重要的应用就是输出PWM(PulseWidthModulation)波形。10.3.4计数器模式向上计数模式在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数,并且产生一个计数器溢出事件。当TIMx_ARR=0x36时,计数器向上计数模式如图10.9所示。图10.9向上计数模式实例(TIMx_ARR=0X36)向下计数模式在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始计数,并且产生一个计数器向下溢出事件。当TIMx_ARR=0x36时,计数器向下计数模式如图10.10所示。图10.10向下计数模式实例(TIMx_ARR=0X36)中央对齐模式(向上/向下计数)在中央对齐模式中,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器),产生一个计数器溢出事件,然后向下计数到0,并且产生一个计数器下溢事件;然后再从0开始重新计数。当TIMx_ARR=0x06时,计数器向下计数模式如图11.11所示。图10.11中央对齐模式10.3.5PWM输出过程分析定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用做比较功能,下面把它简称为比较寄存器。这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0并重新计数。而在TIMx_CNT计数的同时,TIMx_CNT的计数值X会与比较寄存器TIMx_CCR预先存储的数值A进行比较。当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平);相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。如图10.12,图中为重载寄存器TIMx_ARR被配置为N=8,向上计数;比较寄存器TIMx_CCR的值被设置为4、8、大于8、等于0时的输出时序图。图中OCxREF即为GPIO引脚输出时序,CCxIF为触发中断的时序。图10.12PWM输出模式10.3.7定时器时间的计算定时时间由TIM_TimeBaseInitTypeDef中的TIM_Prescaler和TIM_Period设定。TIM_Period的大小实际上表示的是需要经过TIM_Period次计数后才能发生一次更新或中断。TIM_Prescaler是时钟预分频数。设脉冲频率为TIMxCLK,定时公式为T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK假设系统时钟是72MHz,时钟系统部分初始化程序如下所述:TIM_TimeBaseStructure.TIM_Period=1999;//计数值1999TIM_TimeBaseStructure.TIM_Prescaler=35999;//分频359999系统时间为T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(1999+1)*(35999+1)/72M=1s10.3.8定时器中断以TIM2为例,TIM2中断通道在中断向量表中的序号为28,优先级为25。TIM2能够引起中断的中断源或事件有很多,如更新事件(上溢/下溢)、输入捕获、输出匹配、DMA申请等。所有TIM2的中断事件都是通过一个TIM2中断通道向CM3内核提出中断申请的。CM3内核对于每个外部中断通道都有相应的控制字和控制位,用于控制该中断通道。与TIM2中断通道相关的,在NVIC中有13位,它们是PRI_28(IP[28])的8位(只用高4位);加上中断通道允许,中断通道清除(相当禁止中断),中断通道Pending置位,中断Pending清除,正在被服务的中断(Active)标志位,各1位。TIM2的中断过程如下所述:初始化过程

首先要设置寄存器AIRC和PRIGROUP值,规定系统中的占先优先级和副优先级的个数(在4位中占用的位数);设置TIM2寄存器,允许相应的中断,如允许UIE(TIM2_DIER的第[0]位);设置TIM2中断通道的占先优先级和副优先级(IP[28],在NVIC寄存器组中);设置允许TIM2中断通道。在NVIC寄存器组的ISER寄存器中的1位。中断响应过程

当TIM2的UIE条件成立(更新、上溢或下溢)时,硬件将TIM2本身的寄存器中的UIE中断标志置位,然后通过TIM2中断通道向内核申请中断服务。此时内核硬件将TIM2中断通道的Pending标志置位,表示TIM2有中断申请。如果当前有中断正在处理,TIM2的中断级别不够高,那么就保持Pending标志(当然用户可以在软件中通过写ICPR寄存器中相应的位将本次中断清除掉)。当内核有空时,开始响应TIM2的中断,进入TIM2的中断服务。此时硬件将IABR寄存器中相应的标志位置位,表示TIM2中断正在被处理。同时硬件清除TIM2的Pending标志位。执行TIM2的中断服务程序

所有TIM2的中断事件都是在一个TIM2中断服务程序中完成的,所以进入中断程序后,中断程序需要首先判断是哪个TIM2的中断源需要服务,然后转移到相应的服务代码去。注意,不要忘记把该中断标志位清除掉,硬件是不会自动清除TIM2寄存器中具体的中断标志位的。如果TIM2本身的中断源多于2个,那么它们服务的先后次序就由用户编写的中断服务程序决定。所以用户在编写服务程序时,应该根据实际的情况和要求,通过软件的方式,将重要的中断优先处理。中断返回

内核执行完中断服务程序后,便进入中断返回过程。在这个过程中,硬件将IABR寄存器中相应的标志位清除,表示该中断处理完成。如果TIM2本身还有中断标志位被置位,表示TIM2还有中断在申请,则重新将TIM2的Pending标志置为1,等待再次进入TIM2的中断服务。TIM2中断服务函数是stm32f10x_it.c中的函数TIM2_IRQHandler()。10.5STM32F10x定时器相关库函数本节将介绍STM32F103x定时器相关库函数的用法及其参数定义。本书介绍和使用的库函数均基于STM32F10x标准外设库的最新版本。STM32F103x定时器的相关库函数存放在STM32F10x标准外设库的stm32f10x_tim.h和stm32f10x_tim.c文件中。其中,头文件stm32f10x_tim.h用来存放定时器相关结构体和宏的定义以及定时器库函数声明,源代码文件stm32f10x_tim.c用来存放定时器库函数定义。如果在用户应用程序中使用STM32F10x的定时器相关库函数,需要将定时器相关库函数的头文件包含进来。该步骤可以在应用程序文件开关添加#include”stm32f10x_tim.h”语句。常用的STM32F10x定时器库函数如下;TIM_DeInit:将TIMx的寄存器恢复为复位启动时的默认值。TIM_TimeBaseInit:根据TIM_TimeBaseInitStruct的设置数据,设置TIMx的基础外设参数。TIM_OC1Init:根据TIM_OCInitStruCt的设置,设置通道1的参数。TIM_OC2Init:根据TIM_OCInitStruCt的设置,设置通道2的参数。TIM_OC3Init:根据TIM_OCInitStruCt的设置,设置通道3的参数。TIM_OC4Init:根据TIM_OCInitStruCt的设置,设置通道4的参数。TIM_OC1PreloadConfig:使能或禁止TIMx外设在CCR1上预装寄存器。TIM_OC2PreloadConfig:使能或禁止TIMx外设在CCR2上预装寄存器。TIM_OC3PreloadConfig:使能或禁止TIMx外设在CCR3上预装寄存器。TIM_OC4PreloadConfig:使能或禁止TIMx外设在CCR4上预装寄存器。TIM_ARRPreloadConfig:使能或禁止TIMx外设在ARR上预装寄存器。TIM_CtrlPWMOutputs:使能或禁止TIMx的主输出信号。TIM_Cmd:使能或禁止TIMx。TIM_GetFlagStatus:检查指定的TIMx标志位的状态。TIM_ClearFlag:清除TIMx的待处理标志位。TIM_ITConfig:使能或禁止指定的TIMx中断。TIM_GetITStatus:检查指定的TIMx中断是否发生。TIM_ClearITPendingBit:清除TIMx的中断挂起位。10.6STM32F103定时器开发实例10.6.1开发实例(一):准确定时1.开发要求本实例是通过通用定时器TIM3实现精准定时,使其定时1s,在定时器3的中断服务函数中,实现秒数相加。每当定时器中断达到1s后,进入中断服务函数,执行秒数加1,通过秒数的奇偶性控制开发板上LED1(DS1)点亮和熄灭。2.硬件设计开发板上的LED0(DS0)与STM32F103ZET6微控制器的PB5相连接,电路图如图10.18所示。

由于该实例是使用定时器中断控制LED,需要对所需要定的时间进行分析。考虑到使用开发板为ARMCortex-M3内核的STM32F103ZET6,其系统时钟FSysClk=72MHz。首先对时钟频率进行分频。先将时钟频率3600分频至20KHz,可得分频值为:3600-1,计数值为:20000-1。采用向下计数的计数模式。3.软件流程设计

本实例使用定时器实现LED闪烁,软件设计主要实现以下功能:(1) 配置RCC寄存器组,使用PLL输出72MHz时钟作为主时钟,并配置PCLK1时钟为主时钟2分频。(2) 配置GPIOB的5引脚为推挽输出模式。(3) 配置TIM3时基单元:分频数为3600,计数值为20000。(4) 配置NVIC使能TIM3中断。以上功能的实现,在软件设计中采用基于前/后台的构架,故其流程也分为前台(TIM3中断服务函数)和后台(主程序)两个部分。4.程序清单结合流程图及本章所述相关库函数,具体程序如下。1)后台程序#include"led.h"#include"sys.h"#include"timer.h"//************************主程序************************intmain(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC LED_Init(); //LED端口初始化 TIM3_Int_Init(20000,3600);//定时器3配置 while(1){If(sec%2==0)GPIO_ResetBits(GPIOB,GPIO_Pin_5);elseGPIO_SetBits(GPIOB,GPIO_Pin_5);}} voidLED_Init(void){GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //LED-->PB.5端口配置GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置I/O口速度50MHzGPIO_Init(GPIOB,&GPIO_InitStructure); //根据设定参数初始化GPIOB.5GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5输出高}voidTIM3_Int_Init(u16arr,u16psc){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; NVIC_InitTypeDefNVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//时钟使能

//定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//

温馨提示

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

评论

0/150

提交评论