2017-02-15 33 views
1

1つの関数がSTM32を取る時間はどれくらい長く測定したいですか?私が見つけることができる唯一のものはSysTick_Handlerです。しかし、それは定期的な割り込みですが、私は必要なのと同様に、時間間隔を取得することです:STM32で時間間隔を取得する方法は?

long t1 = mcu_clock(); 
sleep(20); 
long t2 = mcu_clock(); 
long diff = (t2 - t1); 

私はC clock()を試してみたが、それは仕事と常に-1を返しませんでした。どうしたらいいですか?

+0

'SysTick_Handler'の変数をインクリメントし、その変数を問い合わせます。 –

+0

@BenceKaulicsそれは唯一の解決策ですか?これは回避策のようです。 –

+0

いずれかの方法でタイマーを設定し、それを追跡する必要があります。 sys tickとシンプルな変数を使うのが最も簡単です。 STの公式のHALライブラリは、それと同じ方法です。例:[stm32F0xx_hal.c](https://github.com/wemos/Motor_Shield_Firmware/blob/master/Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c) –

答えて

5

まず、起動時に一回のサイクルカウンタを有効にします。その後、

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; 
DWT->CYCCNT = 0; 
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; 

、あなたはその値にアクセスすることができます。

unsigned long t1 = DWT->CYCCNT; 
/* do something */ 
unsigned long t2 = DWT->CYCCNT; 
unsigned long diff = t2 - t1; 

は、それが経過CPUサイクルをカウントし、あなたがそれを分割する必要がありますCPUクロック周波数を秒単位で取得します。

32ビット値であるため、より高いクロック周波数、たとえば216 MHzで19.88秒でかなり高速オーバーフローする可能性があります。

+0

非常に便利な答え。 ;-) –

関連する問題