使用STM32和HAL将DWT周期计数转换为时间

问题描述 投票:0回答:1

我正在FreeRTOS中开发STM32F302R8。我正在使用从here开始的以下DWT代码来分析执行时间。我的DWT周期计数似乎有效,但是我不确定如何将其转换为秒。从我在线收集的数据来看,周期数似乎是基于CPU频率的。哪个HAL函数将为我返回正确的CPU频率?我认为这是以下之一

uint32_t          HAL_RCC_GetSysClockFreq(void);
uint32_t          HAL_RCC_GetHCLKFreq(void);
uint32_t          HAL_RCC_GetPCLK1Freq(void);
uint32_t          HAL_RCC_GetPCLK2Freq(void);

此外,我试图通过将DWT代码插入1kHz滴答中断内来收集一些经验证据,如下所示:

void xPortSysTickHandler( void )
{
    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
    executes all interrupts must be unmasked.  There is therefore no need to
    save and then restore the interrupt mask value as its value is already
    known. */
    portDISABLE_INTERRUPTS();
    {
      /* MY CODE START */
      static uint32_t cycles;
      cycles = KIN1_GetCycleCounter();
      KIN1_ResetCycleCounter();
      /* MY CODE END */

        /* Increment the RTOS tick. */
        if( xTaskIncrementTick() != pdFALSE )
        {
            /* A context switch is required.  Context switching is performed in
            the PendSV interrupt.  Pend the PendSV interrupt. */
            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
        }
    }
    portENABLE_INTERRUPTS();
}

每个周期的平均周期约为71300。这是否意味着我的时钟运行在71300 * 1000 = 71.3MHz?这似乎与我返回72MHz的HAL_RCC_GetSysClockFreq()接近。是什么导致了71.3MHz和72Mhz之间的微小误差(假设我的计算是正确的)?

arm cortex-m hal
1个回答
0
投票

HAL_RCC_GetSysClockFreq()对于CPU时钟正确。您看到的实测周期数与理论时钟速度之间的差异可能是由于多种因素引起的;测量误差是大多数误差的可能源(对KIN1_GetCycleCounter()KIN1_ResetCycleCounter的调用中将存在延迟),并且您没有提及时钟源的性质,但可能是不准确的。

© www.soinside.com 2019 - 2024. All rights reserved.