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上去。解释一些原理
在这个手册中我们可以看到有句话,如果APB1的分频系数为1,那么APB1给定时器的时钟就是不变,直接输入给定时器。APB1(36MHZ)是由AHB(72MHZ)时钟2分频而来的,此时APB1的分频系数为2,所以在给到定时器时钟时 会再次*2倍,所以定时器就是72Mhz。
上一篇: CSS - 盒子模型