STM32定时器TIM(本文只讨论基本定时器)

   1.基本介绍

STM32的常规定时器分为三类,包括高级控制定时器TIM 1和TIM8,通用定时器TIM2,TIM3、TIM4 , TIMS,基本定时器TIM6 ,TIM7.,在基本定时器中功能只有定时功能·,较为容易初步熟悉定时器的功能,也为后面学习高级定时器和通用定时器打好基础。

2.结构详解STM32定时器TIM(本文只讨论基本定时器)_第1张图片

1.计数器寄存器(TI Mx_CNT):一步步累加直到到初始值
2.预分频寄存器(TI Mx_PSC):将传导进来的时钟信号进行分频
3.自动重装载寄存器(TIMx_ARR):就是初始值

也就是我们在配置过程中要对上面三个进行配置。


3程序实例


下面这段代码是配置500ms时间的TIM7中断

static void BASIC_TIM_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
		
		// 开启定时器时钟,即内部时钟CK_INT=72M,我打开的是TIM7
    BASIC_TIM_APBxClock_FUN(RCC_APB1Periph_TIM7, ENABLE);
	
		// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period = 999;	//(我们是从0开始到999,正好是1000

	  // 时钟预分频数为
    TIM_TimeBaseStructure.TIM_Prescaler= 71;//同理和上面一样
	
		// 时钟分频因子 ,基本定时器没有,不用管
    //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
		
		// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
    //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
		
		// 重复计数器的值,基本定时器没有,不用管
		//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
	
	  // 初始化定时器
    TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);
		
		// 清除计数器中断标志位
    TIM_ClearFlag(TIM7, TIM_FLAG_Update);
	  
		// 开启计数器中断
    TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
		
		// 使能计数器
    TIM_Cmd(TIM7, ENABLE);	
}

下面是配置相应的中断服务函数(在"stm32f10xit.c"里面)

extern volatile uint32_t time;
void  BASIC_TIM_IRQHandler (void)
{
	if ( TIM_GetITStatus( TIM7, TIM_IT_Update) != RESET ) 
	{	
		time++;
		TIM_ClearITPendingBit(TIM7, TIM_FLAG_Update);  		 
	}	//都叫更新中断用于清除定时器的指定中断标志位	TIM_IT_Update 	
}

之后把写好的函数使用就行。

int main(void)
{	
	 
  BASIC_TIM_Init();
	while (1)
	{	if(time ==500)
		{    time=0;
//这里的时候经过了0.5s,完成了设置0.5秒的时间
		  
		}
	}
}
4.事项补充

一个问题怎么改上面程序中的参数配置自己想要的时间,下面不讲原理直接上手

   

     TIM_TimeBaseStructure.TIM_Period = a;    
    TIM_TimeBaseStructure.TIM_Prescaler= b;

       定时时间=(a+1)*(b+1) *1/72单位是  微秒。而上面time的值就是经过500个定时时间。最后时间就是(time的值)*(定时时间)。

你可能感兴趣的:(stm32,嵌入式硬件,单片机,学习)