使用STM32和HAL将DWT周期计数转换为时间
Convert DWT cycle count to time using STM32 and HAL
我正在 FreeRTOS 中的 STM32F302R8 上进行开发。我正在使用 here 中的以下 DWT 代码来分析执行时间。我的 DWT 循环计数似乎有效,但我不确定如何将其转换为秒数。从我在网上收集到的信息来看,循环计数似乎是基于 CPU 频率。哪个 HAL 函数 return 对我来说是正确的 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);
此外,我尝试通过在 1kHz 滴答中断中插入 DWT 代码来收集一些经验证据,如下所示:
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?这似乎接近我的 HAL_RCC_GetSysClockFreq()
,即 returns 72MHz。是什么导致了 71.3MHz 和 72Mhz 之间的轻微误差(假设我的计算是正确的)?
HAL_RCC_GetSysClockFreq()
对于 CPU 时钟是正确的。您看到的测量周期数与理论时钟速度之间的差异可能是由多种因素造成的;测量错误是其中大部分的可能来源(对 KIN1_GetCycleCounter()
和 KIN1_ResetCycleCounter
的调用会有延迟),并且您没有提及时钟源的性质,但它可能不准确.
我正在 FreeRTOS 中的 STM32F302R8 上进行开发。我正在使用 here 中的以下 DWT 代码来分析执行时间。我的 DWT 循环计数似乎有效,但我不确定如何将其转换为秒数。从我在网上收集到的信息来看,循环计数似乎是基于 CPU 频率。哪个 HAL 函数 return 对我来说是正确的 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);
此外,我尝试通过在 1kHz 滴答中断中插入 DWT 代码来收集一些经验证据,如下所示:
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?这似乎接近我的 HAL_RCC_GetSysClockFreq()
,即 returns 72MHz。是什么导致了 71.3MHz 和 72Mhz 之间的轻微误差(假设我的计算是正确的)?
HAL_RCC_GetSysClockFreq()
对于 CPU 时钟是正确的。您看到的测量周期数与理论时钟速度之间的差异可能是由多种因素造成的;测量错误是其中大部分的可能来源(对 KIN1_GetCycleCounter()
和 KIN1_ResetCycleCounter
的调用会有延迟),并且您没有提及时钟源的性质,但它可能不准确.