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

stm32之定时器Timer4测量代码运行时间

程序员文章站 2022-05-26 23:53:57
...

前言:
  stm32里面有8个定时器,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。
计算定时器的周期:

void TIM4_Int_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); 
	
    TIM_TimeBaseInitStructure.TIM_Period = 60000;  //自动重加载寄存器最大值为65535
	TIM_TimeBaseInitStructure.TIM_Prescaler=71;  
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; 
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
    TIM_ClearFlag(TIM4,TIM_FLAG_Update);	
	TIM_ITConfig(TIM4,TIM_FLAG_Update,ENABLE);
	
	TIM_Cmd(TIM4,ENABLE);
}

我使用的通用寄存器Time4,他的定时周期为:1/f = 72Mhz/72 =1us,重载次数为60000,最大为65535,所以我们得定时器时间为,60000*1us = 60ms。
也就是定时器每隔60ms就触发中断一次。

void TIM_NVIC_Config(void)
{

	   NVIC_InitTypeDef     NVIC_InitStructure;                  //只有一个中断源,优先级随便配
		 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);         //首先配置中断组,才能配置下面的抢占和先占优先级
		 
		 NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;           //中断源来自定时器4
		 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为0,具体看库函数配置表
		 NVIC_InitStructure.NVIC_IRQChannelSubPriority=5;        //先占优先级为3
		 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
		 
		 NVIC_Init(&NVIC_InitStructure);

}

定时器中断函数:
记录定时器触发中断的次数,每次的定时周期为60ms,这样就可以计算出代码运行时间了

void TIM4_IRQHandler (void)
{
  if(TIM_GetFlagStatus(TIM4,TIM_FLAG_Update) != RESET)
  {
	  time++;
		TIM_ClearFlag(TIM4,TIM_FLAG_Update);	
		TIM4->CNT=0x00;	
	}
}

定时器开始和结束函数

void time_start(void)
	{
	TIM4_Int_Init();
	TIM_NVIC_Config();
	TIM4->CNT=0x00;	
	}
 
u16 time_over (void)
{
	u32 result;
	result = TIM4->CNT;
	return result;
}

如何测量某段代码的运行时间呢?

#include "timer4.h"
#include "stm32f10x.h"
u8 ret;
extern u8 time;  //重中断函数中返回的中断次数
int main(void)
{
		time_start(); //把这个函数放在需要测量代码段的前面
		
		/*************************
     	需要测量运行时间的某段代码
		********************************/
		
		ret = time_over(); //放在测量代码段的后面,返回的是us单位
		
		printf("%d",ret/1000+time*60);   //单位为ms

return 0;
}

不同的定时时间,需要自己去计算,很简单的。有一个注意点,为什么定时器明明是挂载在APB1总线上,最大时钟为36Mhz,为什么你这里是72MHz,是因为这个定时器内部会自动的倍频到72M上去。解释一些原理
stm32之定时器Timer4测量代码运行时间
在这个手册中我们可以看到有句话,如果APB1的分频系数为1,那么APB1给定时器的时钟就是不变,直接输入给定时器。APB1(36MHZ)是由AHB(72MHZ)时钟2分频而来的,此时APB1的分频系数为2,所以在给到定时器时钟时 会再次*2倍,所以定时器就是72Mhz。

相关标签: stm32