我正在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之间的微小误差(假设我的计算是正确的)?
HAL_RCC_GetSysClockFreq()
对于CPU时钟正确。您看到的实测周期数与理论时钟速度之间的差异可能是由于多种因素引起的;测量误差是大多数误差的可能源(对KIN1_GetCycleCounter()
和KIN1_ResetCycleCounter
的调用中将存在延迟),并且您没有提及时钟源的性质,但可能是不准确的。