您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第6章高级定时器TIMX
STM32定时器的工作原理•STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振)T=1/FF为频率例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为12MHz/12=1MHzT=1/1MHz=1usSTM32定时器的工作原理最小定时时间T=1/1MHz=1us51单片机定时器:方式013位最大定时时间间隔2^13=8.192ms方式116位最大定时时间间隔2^16=65.536ms方式28位最大定时时间间隔2^8=256usSTM32定时器的工作原理由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容1.分频器(分频比)2.定时计数器的值STM32定时器类型•按功能划分●2个高级控制定时器TIM1TIM8可分配6个通道的三相PWM发生器(多用于电机控制)●4个普通定时器TIM2TIM3TIM4TIM5每个定时器有4个输入捕获/输出比较/PWM/脉冲计数STM32定时器类型●2个基本定时器TIM6TIM7主要用于产生DAC触发信号●2个看门狗定时器——独立看门狗窗口看门狗●系统时基定时器SysTick24位递减计数器自动重加载常用于产生延时us级ms级从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。下面以通用定时器2的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。STM32高级定时/计数器STM32高级定时/计数器举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。基本定时器寄存器示意图STM32定时器的时钟•CK_CNT表示定时器工作频率•TIMx_PSC表示分频系数则定时器的工作频率计算公式为CK_CNT=定时器时钟/(TIMx_PSC+1)由此我们可得到STM32单片机1个时钟周期为:T=1/CK_CNT•例如普通定时器模块的时钟为72MHz,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为–TIMx_ARR=10000–因为72000000/7200=10KHz–时钟周期T=1/10KHz=100us–100us×10000=1S结论:分频比7199定时计数器的值10000定时时间T公式为:T=(TIMx_PSC+1)(TIM_Period)/TIMxCLK举例:基本定时器编程步骤•定时器相关的库函数主要集中在固件库文件stm32f10x_tim.h和stm32f10x_tim.c文件中。•1)TIMx时钟使能。•2)初始化定时器参数,设置自动重装值,分频系数,计数方式等。在库函数中,定时器的初始化参数是通过初始化函数TIM_TimeBaseInit实现的:voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);•3)允许中断发生。在库函数里面定时器中断使能是通过TIM_ITConfig函数来实现的:voidTIM_ITConfig(TIM_TypeDef*TIMx,uint16_tTIM_IT,FunctionalStateNewState);基本功能:定时器7定时时间为0.5秒,定时时间到达后,翻转LED灯的状态,达到LED灯闪烁的效果,闪烁周期1秒举例:基本定时器编程步骤•4)TIMx中断优先级设置。•在定时器中断使能之后,因为要产生中断,必不可少的要设置NVIC相关寄存器,设置中断优先级。•5)允许TIMx工作,也就是使能TIMx。•在固件库里面使能定时器的函数是通过TIM_Cmd函数来实现的:•6)编写中断服务函数。•在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,举例:基本定时器•基本功能:定时器7定时时间为0.5秒,定时时间到达后,翻转LED灯的状态,达到LED灯闪烁的效果,闪烁周期1秒•编程步骤:•1、开时钟voidRCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);}举例:基本定时器•2)配置GPIO口:voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//LED1V6GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);}举例:基本定时器•3)配置中断分组(NVIC),并使能中断•voidNVIC_Configuration(void)•{•NVIC_InitTypeDefNVIC_InitStructure;•NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);•NVIC_InitStructure.NVIC_IRQChannel=TIM7_IRQn;•NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级0•NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//子优先级0•NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能•NVIC_Init(&NVIC_InitStructure);}举例:基本定时器•4)配置TIMER;①利用TIM_DeInit()函数将Timer设置为默认缺省值;②TIM_InternalClockConfig()选择TIMx来设置内部时钟源;③TIM_Perscaler来设置预分频系数;④TIM_ClockDivision来设置时钟分割;⑤TIM_CounterMode来设置计数器模式;⑥TIM_Period来设置自动装入的值⑦TIM_ARRPerloadConfig()来设置是否使用预装载缓冲器⑧TIM_ITConfig()来开启TIMx的中断举例:基本定时器3)-(6)步骤中的参数由TIM_TimerBaseInitTypeDef结构体给出。步骤(3)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。CK_INT是内部时钟源的频率,是根据2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值范围是从0–65535。定时器频率=((1+TIM_Prescaler)/72M)*(1+TIM_Period)举例:基本定时器•例:如果想要设置定时器频率为1秒,可以设置•TIM_Prescaler=35999,TIM_Period=1999//2Khz的频率,计数到2000•或•TIM_Prescaler=7199,TIM_Period=9999//10KHz的频率,计数到10000•但是在作为PWM输出时会有细度不同的问题,后者的细度更高些,更倾向于第二种配置。举例:基本定时器•voidTIM_Configuration(void)•{•TIM_DeInit(TIM7);•TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;•TIM_TimeBaseStructure.TIM_Prescaler=36000-1;//分频36000•TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方向向上计数•TIM_TimeBaseStructure.TIM_Period=1000;//自动重装载寄存器的值•TIM_TimeBaseStructure.TIM_ClockDivision=0x0;//时钟分频•TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);//初始化TIM7的时间基数数据•TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);•TIM_Cmd(TIM7,ENABLE);•}举例:基本定时器5)中断服务子程序VoidTIM7_IRQHandler(void){if(TIM_GetITStatus(TIM7,TIM_IT_Update)==SET){GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)));;//TIM_ClearITPendingBit(TIM7,TIM_FLAG_Update);}}•不是说使用了IO的复用功能就一定要启动RCC_APB2Periph_AFIO的Clock的,(参考手册8.4)•只有使用了AFIO的事件控制寄存器、AFIO的重映射功能以及外部中断(EXTI)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来没说过使用IO的复用功能就一定要开启AFIO时钟,这是个误区。•例如下面的,最常用的USART1,如果你的板子上,默认用的就是PA9和PA10这两个IO作为USART1的TX和TX,那么也就是没有重映射,NoRemap,这种情况下根本不需要开启AFIO时钟,只要开启USART1的外设时钟就行了第6章高级定时器TIM1.TIM8定时器的应用:◆定时操作,完成与时间相关的任务。◆另一种情况是计数操作。6.1定时和计数功能的实现方式6.1.1、完全硬件实现完全硬件电路实现,没有软件参与,可靠性高,但是通用性和灵活性差,一但设计好很难修改,如果需要修改,心须改变硬件的元器件戓线路,每次应用心须重新设计。6.1.2、纯软件方式6.1.3可编程定时/计数器●可编程定时/计数器时钟源来自内部系统时钟时,则定时/计数值就可以完成精密的定时,如果时钟源来自外部信号时,可编程定时/计数器就可以完成信号计数。●为了扩大定时/计数的范围,可编程定时/计数器经常附加设计了预分频计数器,对时钟进行分频操作。●可编程定时/计数器的启动、停止、定时间隔、预分频设置,工作模式等控制操作均可以通过软件实现。●通过这种方法实现的定时/计数具有不占用CPU时间,定时准确,定时/计数器可编程,可以重复利用,实现成本低,通用性强,实现灵活等优点,是目前使用最多的一种定时/计数方式6.2STM32高级定时/计数器TIM1和TIM8称为高级控制定时器,功能最强:TIM2—TIM5称为通用定时器:TIM6和TIM7称为基本定时器:更详细内容见223页表6-1STM32高级定时/计数器STM32系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通和基本定时器,时钟由APB1的输出产生。这些定时器使STM32具有定时、信号的频
本文标题:第6章高级定时器TIMX
链接地址:https://www.777doc.com/doc-7243367 .html