STM32F103C8T6 函数执行时间测量:使用定时器实现精确计时
要计算函数之间的耗时,可以使用定时器来测量函数的执行时间。
以下是一个示例代码,演示如何使用定时器来测量两个函数之间的耗时:
#include "stm32f10x.h"
volatile uint32_t start_time, end_time;
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
end_time = TIM_GetCounter(TIM2);
}
}
void delay_us(uint32_t us)
{
start_time = 0;
end_time = 0;
TIM_Cmd(TIM2, ENABLE);
TIM_SetCounter(TIM2, 0);
while (end_time < us)
{
if (start_time == 0)
{
start_time = TIM_GetCounter(TIM2);
}
}
TIM_Cmd(TIM2, DISABLE);
}
void function1(void)
{
// 在这里编写函数1的代码
delay_us(1000); // 测试函数1的执行时间
}
void function2(void)
{
// 在这里编写函数2的代码
delay_us(2000); // 测试函数2的执行时间
}
int main(void)
{
// 初始化定时器2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000) - 1; // 设置定时器时钟频率为1MHz
TIM_TimeBaseStructure.TIM_Period = UINT32_MAX;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
while (1)
{
function1();
function2();
}
}
在上面的代码中,我们使用定时器2来测量微秒级的时间。在delay_us函数中,我们使用TIM_GetCounter函数来获取定时器的计数值,从而得到经过的时间。在function1和function2中,我们分别调用了delay_us函数来测量函数的执行时间。
注意,在使用定时器测量时间时,要确保定时器的时钟频率足够高,以确保测量的精度。在上面的代码中,我们将定时器的时钟频率设置为1MHz,可以根据实际需求进行调整。
原文地址: https://www.cveoy.top/t/topic/fNp3 著作权归作者所有。请勿转载和采集!