欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32定时器中断

程序员文章站 2022-03-04 22:46:04
...

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时:
STM32定时器中断
当预分频系数从1变成4时:
STM32定时器中断

注意:在完成时基设置之后需要清除中断标志位以及使能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为预分频系数

作者水平有限希望批评指正。