Преобразование счетчика циклов DWT во время с использованием STM32 и HAL - PullRequest
0 голосов
/ 16 января 2020

Я занимаюсь разработкой на STM32F302R8 во FreeRTOS. Я использую следующий код DWT от здесь для профилирования времени выполнения. Кажется, мой счетчик циклов DWT работает, но я не уверен, как преобразовать его в секунды. Из того, что я собрал онлайн, кажется, что количество циклов основано на частоте процессора. Какая функция HAL вернет мне правильную частоту процессора? Я думаю, что это одно из следующих

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 в тиковое прерывание 1 кГц, например:

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,3 МГц? Это похоже на мой HAL_RCC_GetSysClockFreq(), который возвращает 72 МГц. Что вызывает небольшую ошибку между 71,3 МГц и 72 МГц (если предположить, что мои вычисления верны)?

1 Ответ

0 голосов
/ 16 января 2020

HAL_RCC_GetSysClockFreq() правильно для тактовой частоты процессора. Расхождение между измеренным числом циклов и теоретической тактовой частотой может быть вызвано рядом факторов; Погрешность измерения является вероятным источником большинства из них (в вызовах на KIN1_GetCycleCounter() и KIN1_ResetCycleCounter будет задержка), и вы не упоминаете природу вашего источника синхронизации, но возможно, что он неточен.

...