STM32开发项目:定时器预装载寄存器(ARR)
项目背景笔者在进行某项目开发时,需要实时调节定时器的周期,以控制定时器下次更新中断的时间。预装载寄存器自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不...
项目背景
笔者在进行某项目开发时,需要实时调节定时器的周期,以控制定时器下次更新中断的时间。
预装载寄存器
自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器)。
在图中可以看到auto-reload register这个框有一个阴影,有些其它寄存器也有用阴影表示,如我用蓝色标出的Capture/Compare寄存器;有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);正如手册上的14.3.1节所说,根据TIMx_CR1寄存器中APRE位的设置,preload register的内容可以随时传送到shadow register,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把preload register的内容传送到shadow register。
参考文献
实现方法
禁用预装载寄存器,修改ARR的值(TIM_Period)会直接操作影子寄存器,新的ARR值将立即生效:
TIM_ARRPreloadConfig(TIM4, DISABLE);
使能预装在寄存器,修改ARR的值(TIM_Period)会操作预装载寄存器,直到更新事件后,ARR预装载寄存器的值才会被拷贝到影子寄存器中:
TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_ARRPreloadConfig函数的定义如下:
/**
* @brief Enables or disables TIMx peripheral Preload register on ARR.
* @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
* @param NewState: new state of the TIMx peripheral Preload register
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Set the ARR Preload Bit */
TIMx->CR1 |= TIM_CR1_ARPE;
}
else
{
/* Reset the ARR Preload Bit */
TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE);
}
}
更多推荐
所有评论(0)