STM32微控制器原理及应用 课件 第6章 定时器计数器_第1页
STM32微控制器原理及应用 课件 第6章 定时器计数器_第2页
STM32微控制器原理及应用 课件 第6章 定时器计数器_第3页
STM32微控制器原理及应用 课件 第6章 定时器计数器_第4页
STM32微控制器原理及应用 课件 第6章 定时器计数器_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

第6章定时器/计数器STM32微控制器原理及应用主要内容6.1STM32定时器概述6.2通用定时器TIMx相关寄存器6.3库函数6.4定时器应用举例6.5系统时钟SysTick简介6.6SysTick应用实例6.1STM32定时器概述名为TIMx的定时器有8个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。

APB2可以工作在72MHz下,而APB1最大是36MHz。定时器都是16位的。通用定时器4个:TIM2、TIM3、TIM4和TIM5。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。高级定时器2个:TIM1和TIM8。比通用定时器功能更强大,适用于更多场合。基本定时器2个:TIM6和TIM7。主要用于产生DAC触发信号,也可当做通用的16位时基计数器。通用TIMX定时器主要功能(1)16位向上、向下、向上/向下自动装载计数器(2)16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值(3)4个独立通道:①输入捕获;②输出比较;③PWM生成(边缘或中间对齐模式);④单脉冲模式输出(4)使用外部信号控制定时器和定时器互连的同步电路。(5)如下事件发生时产生中断/DMA:更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发);触发事件(计数器启动、停止、初始化或者由内部/外部触发计数);输入捕获;输出比较;支持针对定位的增量(正交)编码器和霍尔传感器电路;触发输入作为外部时钟或者按周期的电流管理。TIMX功能描述时基单元可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。时基单元包含:●计数器寄存器(TIMx_CNT)●预分频器寄存器(TIMx_PSC)●自动装载寄存器(TIMx_ARR)预分频器预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。这个控制寄存器带有缓冲器,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。计数器模式16位向上、向下、向上/向下自动装载计数器向上计数模式向下计数模式中央对齐模式(向上/向下计数)时钟选择计数器时钟可由下列时钟源提供:●内部时钟(CK_INT)●外部时钟模式1:外部输入脚(TIx)●外部时钟模式2:外部触发输入(ETR)●内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,内部时钟:6.2通用定时器TIMX相关寄存器CR1:控制寄存器1CR2:控制寄存器2SMCR:从模式控制寄存器DIER:DMA/中断使能寄存器SR:状态寄存器EGR:事件产生寄存器CCMR1:捕获/比较模式寄存器1CCMR2:捕获/比较模式寄存器2CCER:捕获/比较使能寄存器CNT:计数器寄存器PSC:预分频寄存器APR:自动重装载寄存器CCR1:捕获/比较寄存器1CCR2:捕获/比较寄存器2CCR3:捕获/比较寄存器3CCR4:捕获/比较寄存器4DCR:DMA控制寄存器DMAR:连续模式的DMA地址寄存器控制寄存器1(TIMX_CR1)CEN:使能计数器。0:禁止计数器;1:使能计数器。DIR:方向(Direction)。0:计数器向上计数;1:计数器向下计数。CMS[1:0]:选择中央对齐模式(Center-alignedmodeselection)参见“STM32中文参考手册_V10.pdf”

从模式控制寄存器(TIMX_SMCR)SMS[2:0]:从模式选择(Slavemodeselection)000:关闭从模式,如果CEN=1,则预分频器直接由内部时钟驱动。DMA/中断使能寄存器(TIMX_DIER)位0(UIE):允许更新中断(Updateinterruptenable)。0:禁止更新中断;1:允许更新中断。状态寄存器(TIMX_SR)位0(UIF):更新中断标记(Updateinterruptflag)当产生更新事件时该位由硬件置’1’。它由软件清’0’。0:无更新事件产生;1:更新中断等待响应。当寄存器被更新时该位由硬件置’1’:−若TIMx_CR1寄存器的UDIS=0、URS=0,当TIMx_EGR寄存器的UG=1时产生更新事件(软件对计数器CNT重新初始化);−若TIMx_CR1寄存器的UDIS=0、URS=0,当计数器CNT被触发事件重初始化时产生更新事件。(参考同步控制寄存器的说明)6.3库函数TIM_DeInit:将外设TIMx寄存器重设为缺省值。TIM_TimeBaseInit:根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位。TIM_TimeBaseStructInit:把TIM_TimeBaseInitStruct中的每一个参数按缺省值填入。TIM_Cmd:使能或者失能TIMx外设。TIM_ITConfig:使能或者失能指定的TIM中断。TIM_PrescalerConfig:设置TIMx预分频TIM_GetFlagStatus:检查指定的TIM标志位设置与否TIM_ClearFlag:清除TIMx的待处理标志位TIM_ClearITPendingBit:清除TIMx的中断待处理位函数TIM_TIMEBASEINIT功能:根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位。函数原形:voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)其中,TIMx:x可以是2,3或者4,来选择TIM外设。TIMTimeBase_InitStruct:指向结构TIM_TimeBaseInitTypeDef的指针,包含了TIMx时间基数单位的配置信息。TIM_TIMEBASEINITTYPEDEFSTRUCTUREtypedefstruct{u16TIM_Period;/*TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值,0x0000和0xFFFF之间*/u16TIM_Prescaler;/*TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值*/u8TIM_ClockDivision;/*TIM_ClockDivision设置了时钟分割*/u16TIM_CounterMode;/*TIM_CounterMode选择了计数器模式*/}TIM_TimeBaseInitTypeDef;TIM_ClockDivision描述 TIM_CKD_DIV1TDTS=Tck_tim TIM_CKD_DIV2TDTS=2Tck_tim TIM_CKD_DIV4TDTS=4Tck_timTDTS:数字滤波器使用的采样频率Tck_tim:定时器时钟频率暂时不涉及数字滤波器,这项先不考虑TIM_CounterMode描述TIM_CounterMode_UpTIM向上计数模式TIM_CounterMode_DownTIM向下计数模式TIM_CounterMode_CenterAligned1TIM中央对齐模式1计数模式TIM_CounterMode_CenterAligned2TIM中央对齐模式2计数模式TIM_CounterMode_CenterAligned3TIM中央对齐模式3计数模式例:TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period=0xFFFF;TIM_TimeBaseStructure.TIM_Prescaler=0xF;TIM_TimeBaseStructure.TIM_ClockDivision=0x0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);定时时间的计算定时时间=(Period+1)*(Prescaler+1)/TIMxCLK当Prescaler≠1时,TIMxCLK=72MHz当Prescaler=1时,TIMxCLK=36MHz函数TIM_CMD功能描述:使能或者失能TIMx外设函数原形:voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState)TIMx:x可以是2,3或者4,来选择TIM外设NewState:外设TIMx的新状态,ENABLE或者DISABLE例:/*EnablestheTIM2counter*/TIM_Cmd(TIM2,ENABLE);函数TIM_ITCONFIG功能描述:使能或者失能指定的TIM中断函数原形:voidTIM_ITConfig(TIM_TypeDef*TIMx,u16TIM_IT,FunctionalStateNewState)TIMx:x可以是2,3或者4,来选择TIM外设TIM_IT:待使能或者失能的TIM中断源NewState:TIMx中断的新状态。ENABLE或者DISABLETIM_IT值:例:/*EnablestheTIM2CaptureComparechannel1Interruptsource*/

TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);函数TIM_PRESCALERCONFIG功能描述:设置TIMx预分频函数原形:voidTIM_PrescalerConfig(TIM_TypeDef*TIMx,u16Prescaler,u16TIM_PSCReloadMode)TIM_PSCReloadMode:预分频重载模式例:/*ConfigurestheTIM2newPrescalervalue*/u16TIMPrescaler=0xFF00;TIM_PrescalerConfig(TIM2,TIMPrescaler,TIM_PSCReloadMode_Immediate);函数TIM_GETFLAGSTATUS功能描述:检查指定的TIM标志位设置与否函数原形:FlagStatusTIM_GetFlagStatus(TIM_TypeDef*TIMx,u16TIM_FLAG)

TIMx:x可以是2,3或者4,来选择TIM外设TIM_FLAG:待检查的TIM标志位返回值:TIM_FLAG的新状态(SET或者RESET)例:/*CheckiftheTIM2CaptureCompare1flagissetorreset*/if(TIM_GetFlagStatus(TIM2,TIM_FLAG_CC1)==SET){}

TIM_FLAG值:函数TIM_CLEARFLAG功能描述:清除TIMx的待处理标志位函数原形:voidTIM_ClearFlag(TIM_TypeDef*TIMx,u32TIM_FLAG)TIMx:x可以是2,3或者4,来选择TIM外设TIM_FLAG:待清除的TIM标志位例:/*CleartheTIM2CaptureCompare1flag*/TIM_ClearFlag(TIM2,TIM_FLAG_CC1);函数TIM_CLEARITPENDINGBIT功能描述:清除TIMx的中断待处理位函数原形:voidTIM_ClearITPendingBit(TIM_TypeDef*TIMx,u16TIM_IT)TIMx:x可以是2,3或者4,来选择TIM外设。TIM_IT:待检查的TIM中断待处理位。例:/*CleartheTIM2CaptureCompare1interruptpendingbit*/TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);6.4定时器应用举例设LED与STM32的接口电路如下,编写程序控制LED的亮灭时间。程序设计方法包含头文件声明函数声明变量主函数函数调用主循环程序段配置系统时钟、使能外设时钟子函数配置GPIO子函数配置NVIC子函数配置定时器子函数延时子函数中断服务子函数声明函数:#include"stm32f10x.h" voidDelay(vu32nCount);voidRCC_Configuration(void); voidGPIO_Configuration(void);voidNVIC_Configuration(void);voidTIM2_Configuration(void);主函数:intmain() { RCC_Configuration(); /*配置系统时钟*/ NVIC_Configuration(); /*配置NVIC*/ GPIO_Configuration(); /*配置GPIOIO口初始化*/ TIM2_Configuration(); /*配置TIM2定时器*/ GPIOC->ODR=0xffffffff;/*全灭*/ while(1);}使能外设时钟:voidRCC_Configuration(){{//初始化系统时钟(略)}//使能TIM2时钟和GPIOC时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);}//延时子函数:voidDelay(vu32nCount){for(;nCount!=0;nCount--);}配置GPIO的子函数:voidGPIO_Configuration()/*GPIO初始化,PC输出,PA输入*/{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);}配置NVIC:voidNVIC_Configuration(){ NVIC_InitTypeDefNVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure);}配置TIM2子函数:voidTIM2_Configuration(){ TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period=35999; TIM_TimeBaseStructure.TIM_Prescaler=1999; TIM_TimeBaseStructure.TIM_ClockDivision=0x0; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);TIM_ClearFlag(TIM2,TIM_FLAG_Update);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2,ENABLE); }中断服务子函数://中断服务程序一般写在stm32f10x_it.c文件中。voidTIM2_IRQHandler(void){ if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0) GPIO_SetBits(GPIOC,GPIO_Pin_3); else GPIO_ResetBits(GPIOC,GPIO_Pin_3); TIM_ClearFlag(TIM2,TIM_FLAG_Update); }6.5系统时基定时器SYSTICK简介stm32-M3有一个系统时基定时器,其为一个24位递减计数器。系统时基定时器设置初值并使能后,每经过一个系统时钟周期,计数器就减一,当计数器递减到0时,系统时基定时器自动重装载初值,并继续向下计数,同时内部的COUNTFLAG标志会置位,触发中断。系统时基定时器功能简单,只能提供一个时基定时器,作为滴答时钟。在外部晶振8MHZ,通过PLL9倍频,系统时钟为72MHz,系统时钟定时器的递减频率可以设为9MHz(HCLK/8),在这个条件下,把系统定时器的初值设置为90000,就能够产生10ms的时间基值。如果开启中断,则产生10ms的中断。时基定时器的中断并不需要清除中断位,系统会自动清除。SYSTICK寄存器结构typedefstruct{vu32CTRL; //SysTick控制和状态寄存器vu32LOAD; //SysTick重装载值寄存器vu32VAL; //SysTick当前值寄存器vuc32CALIB; //SysTick校准值寄存器}SysTick_TypeDef;SYSTICK库函数SysTick_CLKSourceConfig:设置SysTick时钟源SysTick_SetReload:设置SysTick重装载值SysTick_CounterCmd:使能或者失能SysTick计数器SysTick_ITConfig:使能或者失能SysTick中断SysTick_GetCounter:获取SysTick计数器的值SysTick_GetFlagStatus:检查指定的SysTick标志位设置与否函数SYSTICK_CLKSOURCECONFIG功能描述:设置SysTick时钟源函数原形:voidSysTick_CLKSourceConfig(u32SysTick_CLKSource)SysTick_CLKSource:SysTick时钟源SysTick_CLKSource值:例:/*AHBclockselectedasSysTickclocksource*/SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);函数SYSTICK_SETRELOAD功能描述:设置SysTick重装载值函数原形:voidSysTick_SetReload(u32Reload)Reload:重装载值,该参数取值必须在1和0x00FFFFFF之间例:/*SetSysTickreloadvalueto0xFFFF*/SysTick_SetReload(0xFFFF);函数SYSTICK_COUNTERCMD功能描述:使能或者失能SysTick计数器函数原形:voidSysTick_CounterCmd(u32SysTick_Counter)SysTick_Counter:SysTick计数器新状态SysTick_Counter值:例:/*EnableSysTickcounter*/SysTick_CounterCmd(SysTick_Counter_Enable);函数SYSTICK_ITCONFIG功能描述:使能或者失能SysTick中断函数原形:voidSysTick_ITConfig(FunctionalStateNewState)NewState:SysTick中断的新状态,取ENABLE或者DISABLE例:/*EnableSysTickinterrupt*/SysTick_ITConfig(ENABLE);

函数SYSTICK_GETCOUNTER功能描述:获取SysTick计数器的值函数原形:u32SysTick_GetCounter(void)返回值:SysTick计数器的值例:/*GetSysTickcurrentcountervalue*/u32SysTickCurrentCounterValue;SysTickCurrentCounterValue=SysTick_GetCounter();函数SYSTICK_GETFLAGSTATUS功能描述:检查指定的SysTick标志位设置与否函数原形:FlagStatusSysTick_GetFlagStatus(u8SysTick_FLAG)SysTick_FLAG:待检查的SysTic标志位SysTick_FLAG值:例:/*TestiftheCountflagissetornot*/FlagStatusStatus;Status=SysTick_GetFlagStatus(SysTick_FLAG_COUNT);if(Status==RESET){...…}else{...…}下面的程序段,让LED灯1S跳变一次。void

SysTick_Configuration(void)

{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);SysTick->LOAD=900000;//100msSysTick->CTRL=0x03;//开中断、启动计数

}

void

SysTick_Handler

温馨提示

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

评论

0/150

提交评论