1、通用定时器(TIM)
通用定时器是一个通过可编程预分频器驱动的16 位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。定时器是完全独立的,而且没有互相共享任何资源。
2、SCB是MDK库文件里面定义的一个结构体,subsystem control block子系统管理模块
3、TIMER主要是由三部分组成:时基单元、输入捕获、输出比较,还有两种模式控制功能:从模式控制和主模式控制。
4、定时器的计数模式:
向上计数模式,
向下计数模式,在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存器中设置UG位(通过软件方式或者使用从模式控制器)也同样可以产生一个更新事件。
设置TIMx_CR1寄存器的UDIS位可以禁止UEV事件。这样可以避免向预装载寄存器中写入新值时更新影子寄存器。因此UDIS位被清为0之前不会产生更新事件。然而,计数器仍会从当前自动加载值重新开始计数,同时预分频器的计数器重新从0开始(但预分频器的速率不能被修改)。
此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求) ,设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。
当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。
中央对齐模式,
5、时基单元包含:
计数器寄存器(TIMx_CNT)
预分频器寄存器 (TIMx_PSC),预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
自动装载寄存器 (TIMx_ARR),自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMX_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。
6.可设置时长的定时器的方法
设置计数器的时钟频率。
设置计数器的计数初值。
打开计数器开始计数。开启中断。
执行中断服务程序
7、通用定时器的时钟来源:
内部时钟(CK_INT)
外部时钟模式1:外部输入脚(TIx)
外部时钟模式2:外部触发输入(ETR)
内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
8、计数器时钟频率的计算方法
9、从库函数角度设置定时时间
(1)Timx时钟使能:通用定时器挂在APB1下,通过APB1总线的使能函数来使能,函数为RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,enable)
(2)初始化定时器参数:设置自动重装值、分频系数和计数方式等,函数原形为:
TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
功能描述:根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位,输入参数1,TIMx:x可以是2,3或者4,来选择TIM外设;输入参数2TIM-TimeBase_InitStruct:指向结构TIM_TimeBaseInitTypeDef的指针,包含了TIMx时间基数单位的配置信息。TIM_TimeBaseInitTypeDef定义于文件“stm32f10x_tim.h”:
typedef struct
{
u16 TIM_Period;
u16 TIM_Prescaler;
u8 TIM_ClockDivision;
u16 TIM_CounterMode;
} TIM_TimeBaseInitTypeDef;
TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。
TIM_Prescaler
TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。
TIM_ClockDivision
TIM_ClockDivision设置了时钟分割
(3)设置timx-dier允许更新中断:函数原形void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState)功能描述,使能或者失能指定的TIM中断,输入参数1TIMx:x可以是2,3或者4,来选择TIM外设;输入参数2,TIM_IT:待使能或者失能的TIM中断源,输入参数3NewState:TIMx中断的新状态,这个参数可以取:ENABLE或者DISABLE
输入参数TIM_IT使能或者失能TIM的中断。可以取下表的一个或者多个取值的组合作为该参数的值。TIM_IT_Update TIM中断源,TIM_IT_CC1 TIM捕获/比较1中断源,TIM_IT_CC2 TIM捕获/比较2中断源,TIM_IT_CC3,TIM捕获/比较3中断源TIM_IT_CC4 TIM捕获/比较4中断源,TIM_IT_Trigger TIM触发中断源
(4) 设置中断优先级,在nvic的寄存器中设置
(5)使能timx
(6)编写中断服务函数
10、TIM_ClearFlag 函数原形void TIM_ClearFlag(TIM_TypeDef* TIMx, u32 TIM_FLAG)
功能描述,清除TIMx的待处理标志位,输入参数1,TIMx:x可以是2,3或者4,来选择TIM外设,输入参数2,TIM_FLAG:待清除的TIM标志位
TIM_FLAG值:
TIM_FLAG_Update TIM更新标志位
TIM_FLAG_CC1 TIM捕获/比较1标志位
TIM_FLAG_CC2 TIM捕获/比较2标志位
TIM_FLAG_CC3 TIM捕获/比较3标志位
TIM_FLAG_CC4 TIM捕获/比较4标志位
TIM_FLAG_Trigger TIM触发标志位
TIM_FLAG_CC1OF TIM捕获/比较1溢出标志位
TIM_FLAG_CC2OF TIM捕获/比较2溢出标志位
TIM_FLAG_CC3OF TIM捕获/比较3溢出标志位
TIM_FLAG_CC4OF TIM捕获/比较4溢出标志位
11、函数名:TIM_GetCounter
函数原形:u16 TIM_GetCounter(TIM_TypeDef* TIMx)
功能描述:获得TIMx计数器的值
输入参数:TIMx:x可以是2,3或者4,来选择TIM外设
12、函数名TIM_ GetITStatus
函数原形TIM_GetITStatus(TIM_TypeDef* TIMx, u16 TIM_IT)
功能描述检查指定的TIM中断发生与否
输入参数1TIMx:x可以是2,3或者4,来选择TIM外设
输入参数2TIM_IT:待检查的TIM中断源
13、函数名TIM_ITConfig
函数原形void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState)
功能描述使能或者失能指定的TIM中断
输入参数1TIMx:x可以是2,3或者4,来选择TIM外设
输入参数2TIM_IT:待使能或者失能的TIM中断源
输入参数3NewState:TIMx中断的新状态
这个参数可以取:ENABLE或者DISABLE
TIM_IT
TIM_IT_UpdateTIM中断源
TIM_IT_CC1TIM捕获/比较1中断源
TIM_IT_CC2TIM捕获/比较2中断源
TIM_IT_CC3TIM捕获/比较3中断源
TIM_IT_CC4TIM捕获/比较4中断源
TIM_IT_TriggerTIM触发中断源
14、函数名TIM_ ClearITPendingBit
函数原形void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, u16 TIM_IT)
功能描述清除TIMx的中断待处理位
输入参数1TIMx:x可以是2,3或者4,来选择TIM外设
输入参数2TIM_IT:待检查的TIM中断待处理位
15、STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。