STM32定时器中断
STM32定时器简介
STM32定时器有多种分为高级定时器、通用定时器、基本定时器
主要功能 | 高级定时器 | 通用定时器 | 基本定时器 |
---|---|---|---|
内部时钟源 | 是 | 是 | 是 |
计数方向 | 向上、向下、双向 | 向上、向下、双向 | 向上 |
外部事件计数 | 是 | 是 | 否 |
四个独立通道 | 是 | 是 | 否 |
另外的三种特殊的定时器:独立看门狗定时器、窗口看门狗定时器、系统滴答定时器(集成在Cortex-MX内部的SysTick定时器)
计数模式
1.向上计数模式:控制寄存器TIMx_CR1中CMS等于00,DIR=0时选择向上计数模式。向上计数模式中计数器从零开始向上计数到自动装载值(TIMx_ARR计数器中),当计数溢出的时候产生一个计数器溢出时间。同时产生一个更新事件。在TIMx_EGR寄存器中设置UG位,同时产生一个更新事件。
2.向下计数模式:控制寄存器TIMx_CR1中CMS等于00,DIR=1时选择向下计数模式。向下计数模式中计数器从装入的值开始向下计数到0(该装入值为TIMx_ARR计数器的值),然后从自动装入的值重新向下计数,同时产生一个更新事件。在TIMx_EGR寄存器中设置UG位,同时产生一个更新事件。
3.*对齐模式(向上向下计数模式):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后在从0开始重新计数。
在库函数开发中可以选择以下函数选择:
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;//例如计数模式选择向上计数模式
通用定时器的使用流程
1.中断设置
注意中断通道的选择根据不同的定时器。由于不同的定时器产生不同的中断请求,针对不同的定时器应该选择不同的中断通道。代码如下
NVIC_InitStructure.NVIC_IRQChannel =
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =
NVIC_InitStructure.NVIC_IRQChannelSubPriority =
NVIC_InitStructure.NVIC_IRQChannelCmd =
NVIC_Init(&NVIC_InitStructure);
2.定时器中断配置
STM32F103的高级控制定时器使用的是APB2,基本定时器和其他定时器使用APB1总线。预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。因为这个控制寄存器带有缓冲器,它能够在运行时被改变。新的预分频器的参数在下一次更新事件到来时被采用。当预分频系数从1变成2时:
当预分频系数从1变成4时:
注意:在完成时基设置之后需要清除中断标志位以及使能TIM中断源。
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动装载值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //设置预分频系数
TIM_TimeBaseInitStrue.TIM_RepetitionCounter=
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //清除中断标志位
中断服务程序:
void TIM3_IRQHandler(void)//该函数原型在启动文件中
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update))
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除定时中断标志
}
}
相关计算公式(在系统时钟为72MHz情况下):
TIM_Period*(TIM_Prescaler+1)/72000000
其中TIM_Period为计数值,TIM_Prescaler为预分频系数
作者水平有限希望批评指正。