stm32f103 延时20ns_【STM32时间戳的妙用,ucos 时间戳】如何测量程序的运行时间,精度为ns级别...
时间: 2024-02-01 16:16:07 浏览: 163
要测量程序的运行时间并精确到 ns 级别,可以使用 STM32 的时间戳功能。
首先,在 STM32 中启用时间戳功能,需要在 RCC 中使能 HSE 和 LSE 时钟,然后配置 SysTick 计数器为 HCLK 的 1/8。启用时间戳功能后,可以使用 HAL_GetTick() 函数获取自系统启动以来的毫秒数,并使用 HAL_GetTickFreq() 函数获取 SysTick 计数器的频率(单位为 Hz)。
然后,在代码中使用时间戳来测量程序的运行时间,可以在程序开始前获取当前时间戳,执行完程序后再获取当前时间戳,两者的差值即为程序的运行时间。需要注意的是,时间戳的精度为毫秒级别,因此需要进一步计算得到 ns 级别的精度。
以下是一个示例代码:
``` c
#include "stm32f1xx_hal.h"
#include <stdio.h>
uint32_t start_time, end_time;
float time_diff;
int main(void)
{
// 启用时间戳功能
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->CR1 |= TIM_CR1_CEN;
HAL_Init();
SystemClock_Config();
// 获取起始时间戳
start_time = TIM2->CNT;
// 执行程序
// ...
// 获取结束时间戳
end_time = TIM2->CNT;
// 计算时间差并转换为 ns
time_diff = (float)(end_time - start_time) / HAL_GetTickFreq() * 1000000000;
// 输出时间差
printf("Program execution time: %.2f ns\n", time_diff);
while(1);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);
while(!__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY));
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV2;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 8);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
```
阅读全文