STM32学习笔记time定时器


 STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。从系统框架图下看,名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。其中TIM1&TIM8称为高级控制定时器(advancedcontroltimer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。

STM32学习笔记time定时器_第1张图片


   由上图可知,当APB1的预分频系数为1 时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8 或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。也就是,当APB1不分频,TIM3的时钟速度为36MHz,当2分频是,APB1变成18MHz,但是TIM又会倍频,即TIM时钟等于18*2=36MHz。这里我们用向上计数的方式,即TIMx_CNT中的计数值达到TIMx_ARR中的值时,产生中断,TIMx_CNT又从0开始计。


无疑STM32的定时器是复杂的,主要有定时,捕获,PWM产生功能。我花了点时间看通用定时器2,3,4的框图,tim1则在通用定时器的基础上多加了些功能,称为高级定时器。
////////////////////////////////////////////////////////////////////////////////
根据程序来分析:
/////////////定时器2配置500ms///////////////////////////////////////////////////////
   TIM_DeInit(TIM2);//TIM2,3,4:SystemClk=APB1(Max36Mhz)
   RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能TIM2的时钟
   //////////定时器2配置///////////////////////////////
   //计划:PSC = 349 则     CK_CNT = 36Mhz/(349+1) =>10us
   //      ARR = 50 000     1us * 50 000 =50ms                                              
   m_TIM_TimeBaseInitTypeDef.TIM_Prescaler           = 349; //预分频    PSC(0-65535)
   m_TIM_TimeBaseInitTypeDef.TIM_CounterMode       = TIM_CounterMode_Up; //计数模式
   m_TIM_TimeBaseInitTypeDef.TIM_Period               = 50000; //自动重载 ARR(0-65535)
   m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision       = TIM_CKD_DIV1; //时钟分频因子1,2,4
   m_TIM_TimeBaseInitTypeDef.TIM_RepetitionCounter = 0;//循环计数次数(只是TIM1,8有)
   TIM_TimeBaseInit(TIM2,&m_TIM_TimeBaseInitTypeDef);
   ////////////////////////////////////////////////////
   //使能配置中断=>:使能更新事件中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//Enables or disables the specified TIM interrupts.
   //注意TIM_UpdateDisableConfig 用DISABLE函数处才将对应为清零而达到使能(UDIS=0:使能更新事件)
   TIM_UpdateDisableConfig(TIM2,DISABLE);//Enables or Disables the TIMx Update event.     
   NVIC->ISER[0] |= (1 << (TIM2_IRQChannel & 0x1F));     // enable interrupt
   //开始计数
   TIM_Cmd(TIM2,ENABLE);//Enables or disables the specified TIM peripheral.
首先在在定时功能上和传统的51,avr比,多了些功能,其他的一样。其输入时钟源为APB1/2,等同51,avr的系统时钟。忘了51,至少avr有时钟分频功能,stm32也有在函数配置中TIM_ClockDivision       = TIM_CKD_DIV1; //(时钟分频因子1,2,4)在时钟输入上,时钟多了个选TIM_Prescaler(预分频,这个的加入灵活性加大,它可以是0-65535的任意值,则预传统的只能几个选择则体现了配置的灵活和实用。
//
m_TIM_TimeBaseInitTypeDef.TIM_Prescaler           = 349;
// m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision       = TIM_CKD_DIV1;

   再说:51,avr的计数器初值,也是决定定时大小的一个因素。具体实现:就是计数器计数自减或者增加到某个值,发生溢出中断,在自加的时候是从初值加到满值 溢出。自减时,是从初值减到0溢出,发生中断,在每次定时完毕的定时器溢出后,其初值需要在中断函数中重新赋值给计数器
在stm32中也是有个同样的功能,但是这儿是不同的。在自加的时候,从0开始,直到寄存器TIMx_ARR值大小产生溢出中断,自减是从TIMx_ARR值大小开始自动减直到0溢出,不通点1。在进入中断后,中断函数一个更新事件,这个更新事件自动重载TIMx_ARR到计数器,这一点与51中的自动重载类似.
//
m_TIM_TimeBaseInitTypeDef.TIM_Period               = 50000;

以上转自:http://bbs.ednchina.com/BLOG_ARTICLE_252634.HTM

 

还有个不错的例子:http://blog.sina.com.cn/s/blog_7d4550b5010178ee.html

你可能感兴趣的:(STM32学习笔记time定时器)