2017-02-15 7 views
1

하나의 함수가 STM32를 얼마나 오랫동안 사용하는지 측정하고 싶습니다. 내가 찾을 수있는 유일한 것은 SysTick_Handler입니다. 그러나,는주기적인 인터럽트이지만, 내가 필요한 것은 같은 시간 간격을 얻을 수 있습니다 : 나는 C clock() 시도했습니다STM32에서 시간 간격을 얻는 방법은 무엇입니까?

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

,하지만 작동 항상 -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

매우 유용한 답변 . ;-) –