stm32的定时器分为三种:基本,通用,高级。功能肯定是越来越强的。今天我们讲的是最简单的基本定时器。
基本定时器的作用就是定时一定的时间,当然在更新事件来的时候可以产生中断和DMA请求,还可以触发DAC同步电路。
我们今天分析的是产生定时器定时一段时间后产生更新中断的例子。
从基本定时器的框图来看,基本定时器由三部分组成,预分频器,计数器,自动重装载寄存器。
自动重装载寄存器,这个寄存器是预加载的,它的内部对应两个寄存器,一个预加载寄存器,一个影子寄存器,我们的读写都是对于预加载寄存器的,它有一个控制位,自动重装载预装载使能位,根据这个位的设置我们可觉得预装载寄存器的值是立刻写入寄存器还是在发送更新事件时写入。
计数器,把CK_CNT作为时钟来进行计数。
预分频器,将来自内部时钟的CK_INK通过分频后输出作为计数器的驱动时钟。这个寄存器具有缓冲,每次在更新时间发生时更新寄存器的值。
接下来再说说定时器的计数模数,在定时器中有向上计数,上下计数,中央对齐模式,在基本定时器里只有向上计数模式。
计数器从0开始累加计数到自动重装载寄存器的数值,这时会产生一个定时器溢出的事件并且重新从0开始累加。
在定时器发生溢出事件后,会产生一个更新事件。我们也可以通过设置EGR寄存器的UG位来产生一个更新事件。
产生中断事件后就会更新寄存器的值,并且硬件自动设置中断标志位。
基本定时器的使能不是去设置RCC寄存器,因为它是内部时钟作为时钟源,所以它是由CR1寄存器中的一个位控制。
下面我们以TIM6讲解一下。
上来还是先配置了需要工作的参数,配置预分频的系数,计数模数,自动重装载计数器的值。根据上面的只是置查时钟的驱动了。
下面的初始化函数里面无非就是一些参数检查,状态检测,我们只看其中的一句代码,TIM_Base_SetConfig(htim->Instance, &htim->Init);
可以预料的的这个函数里肯定就是将配置的参数写入了寄存器,我们还是看一下我们参数中没有的
TIMx->EGR = TIM_EGR_UG;这句话是设置了UG位,这样会在更新时间到来时更新寄存器的值。
我们看到下面还有两个赋值给结构体参数,这个结构体在我们基本定时器中没作用,因为定时器可以驱动另一个定时器,用到了主从模式和外部触发,这里我们可以忽略。
接下来我们配置好了参数只差驱动信号了,所以使能内部时钟就可以了,由于我们这里使用了中断,所以我们中断和时钟一起开启,调用HAL_TIM_Base_Start_IT(&htim6);
从代码也可以看出就是做了这两步工作。到这里就开始计数,到达ARR的值后产生中断。接下来我们看一下中断函数,我们已经知道了HAL的中断函数内都有一个自己的HAL中断处理,我们直接看那一部分,由于他的处理对所有中断都进行了判断,我们只看更新中断。
/* TIM Update event */
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
{
if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) !=RESET)
{
__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
HAL_TIM_PeriodElapsedCallback(htim);
}
}
我么可以看出当产生了更新中断后,清除了更新中断标志位,然后调用了一个回调函数,我们可以在这个回调函数判断定时器做一定的中断操作。