1.TIM定时器概念
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
16位计数器,预分频器,自动重装寄存器的时基本单元可以实现最大的59.65s的定时
定时器不仅具备中断功能,而且还包含内外时钟源选择,输入捕获,输出比较,编码器口
定时器主要分为3大类,高级定时器(TIM1,TIM8) 通用定时器(TIM2~TIM5) 基本定时(TIM6,TIM7)
不同芯片所带的资源不同,因此具体所带资源应该查看所对应的芯片手册。
1.定时器三大类的不同作用
高级定时器:拥有通用定时器的全部功能,并额外拥有重复计数器,死区生成,互补输出,刹车输入等功能
通用定时器:拥有基本定时器的所有功能,并且额外具有内外时钟源选择,输入捕获,输出比较,编码器接口,主从触发模式等功能
基本定时器:定时中断,主模式触发DAC的功能
2.定时器中断
定时器中断:定时中断是在受到时钟源的影响下,实现CNT计数器的增长,在增长的同时与自动重装寄器(ARR)相比较,当计数器达到自动重装寄存器的值时,会使CNT计数器清0,并且发出一个中断信号,以实现定时器中断的目标。
1.定时器中断
在定时器中断时,我们通常需要打开定时器的内部时钟,并且为定时器选择时钟源(选择内部时钟源)。使其在内部模式的状态下工作,此时我们也需要初始化时基单元。将时基单元的参数配置成我们实现功能所需要的参数。然后就时配置配置中断实现功能了。
对于定时器时基单元的参数选择:
计数器溢出频率:也就是计数器计完一个过程的频率,换句话说也就是计数器达到ARR触发中断的频率,通过这样也就可以得到他的周期,也就是定时器定的时间。CK_PSC也就是定时器时钟源的时钟频率。
//定时器初始化函数 void TIM_Init() { // 1.第一步打开定时器的时钟,使用RCC_APB1PeriphClockCmd函数打开TIM2资源 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //2.第二步将时钟资源设为内部时钟源 TIM_InternalClockConfig(TIM2); //3.第三步配置时基单元,设置一个结构体来对其赋值 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // TIM_CKD_DIV1:不分频,即输入时钟不分频。这意味着定时器的时钟频率等于输入时钟的频率。例如,如果输入时钟是72MHz,那么定时器的时钟频率也是72MHz。这样可以保持最高的定时器分辨率,但也意味着定时器的计数速度较快。 //TIM_CKD_DIV2:除以2分频。定时器的时钟频率为输入时钟的一半。这可以减慢定时器的计数速度,使得定时器的周期变长。 //TIM_CKD_DIV4:除以4分频。定时器的时钟频率为输入时钟的四分之一。这进一步减慢了定时器的计数速度,使得定时器的周期更长。 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1 ; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up ; TIM_TimeBaseInitStructure.TIM_Period=(10000-1); TIM_TimeBaseInitStructure.TIM_Prescaler=(7200-1); TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); /*中断输出配置*/ TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除定时器更新标志位 //TIM_TimeBaseInit函数末尾,手动产生了更新事件 //若不清除此标志位,则开启中断后,会立刻进入一次中断 //如果不介意此问题,则不清除此标志位也可 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启TIM2的更新中断 /*NVIC中断分组*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2