标签:style blog http color strong width
一、定时器简介
1、时钟来源
2、定时器结构(以基本定时器为例)
二、基本定时器的编程方法
1、基本定时器的寄存器
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,则可以看到下边的情况。
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位决定是否允许在写入预加载寄存器的时候,再立即传送到自动重装载寄存器。如果不允许的话,就是只有在更新事件发生的时候才能传送。
标签:style blog http color strong width
原文地址:http://www.cnblogs.com/amanlikethis/p/3829941.html