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为预分频系数

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

发布了3 篇原创文章 · 获赞 2 · 访问量 501

猜你喜欢

转载自blog.csdn.net/weixin_44675285/article/details/104251968