码迷,mamicode.com
首页 > 其他好文 > 详细

STM32之定时器

时间:2014-07-09 21:36:50      阅读:608      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   width   

一、定时器简介

1、时钟来源

bubuko.com,布布扣

2、定时器结构(以基本定时器为例)

bubuko.com,布布扣

二、基本定时器的编程方法

1、基本定时器的寄存器

bubuko.com,布布扣

2、例程

/**
  * @brief  定时器6的初始化,定时周期0.01s
  * @param  无
  * @retval 无
  */
void TIM6_Init(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    /*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
    
    /* 时基初始化 */         
    TIM_TimeBaseStructure.TIM_Period = 99;          //当定时器从0计数到99,即定时周期为100次
    TIM_TimeBaseStructure.TIM_Prescaler = 7199;     //设置预分频:10KHz
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    TIM_ARRPreloadConfig(TIM6, ENABLE);             //使能TIM6重载寄存器ARR
    
    /* 设置更新请求源只在计数器上溢或下溢时产生中断 */
    TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Global);
    /* 定时器6的上溢或下溢中断使能 */
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
    /* 定时器6启动 */
    TIM_Cmd(TIM6, ENABLE);                          //使能定时器6
    TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
    /* 定时器6的NVIC中断配置 */
    NVIC_TIM6_Configuration(); 
}

三、疑惑与解答

  以下问题皆以基本定时器为例进行阐述 

1、何谓更新事件

  更新事件就是指这个事件发生后,将会将定时器的寄存器进行更新,以使定时器工作在新的配置下,例如当一个定时周期结束(计数器上溢)或者其他事件。

2、何谓自动重装载寄存器TIMx_ARR(auto-reload register)

  自动重装载寄存器决定了定时器的上溢时机,当定时器的计数器中数值达到了自动重装载寄存器规定的值,计数器就要归零。也就是说自动重装载寄存器决定了定时器的周期。假定TIMx_ARR=0x36,而且分频系数为1,则可以看到下边的情况。

bubuko.com,布布扣

3、自动重装载寄存器TIMx_ARR和预加载寄存器的区别与联系

  预加载寄存器和自动重装载寄存器是影子之间的关系。自动重装载寄存器的功能在2点已经说明,但是自动重装载寄存器不是用户用程序可以直接进行操作的,用户需要借助于预加载寄存器才能访问它。

  其目的是为了保证自动重装载寄存器在合适的时候被修改,不允许其随便被修改,否则可能导致在过渡的时候发生不期望的结果。比如说我们希望定时器以两种周期(T1、T2)交替进行工作。假设没有预加载寄存器,当定时器先以T1进行工作,我们需要在接下来的周期更改定时器的周期(TIMx_ARR),有可能是在定时器已经达到T1的时候才去修改这个周期。

  倘若加一个缓冲器--预加载寄存器,当定时器先以T1进行工作,此时我们将T2周期对应的值写入到预加载寄存器中(注意此时还没有写入TIMx_ARR)。当T1周期结束的时候,硬件自动将预加载寄存器中的值写入TIMx_ARR,这样在下一个周期工作的时候,就可以保证定时器的周期时T2。

  可以说预加载寄存器是用户操作的寄存器,而自动重装载寄存器才是真正参与定时器工作的寄存器。只不过用户需要通过预加载寄存器才能操作自动重装载寄存器,以保证定时器周期的平稳过渡。

  注意我们在写程序的时候,给TIMx_ARR赋值,并没有真正的写入到此寄存器中,而是写入到了预加载寄存器。

自动重装载寄存器是预加载的,每次读写自动重装载寄存器时,实际上是通过读写预加载寄存器实现。根据TIMx_CR1 寄存器中的自动重装载预加载使能位(ARPE) ,写入预加载寄存器的内容能够立即或在每次更新事件时,传送到它的影子寄存器。                摘自《STM32中文版芯片手册》

  事实上,用户可以通过TIMx_CR1的APPE位决定是否允许在写入预加载寄存器的时候,再立即传送到自动重装载寄存器。如果不允许的话,就是只有在更新事件发生的时候才能传送。

 

STM32之定时器,布布扣,bubuko.com

STM32之定时器

标签:style   blog   http   color   strong   width   

原文地址:http://www.cnblogs.com/amanlikethis/p/3829941.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!