써큘러 모드 및 노말모드 둘다 모두 들어가 있습니다.
// 완료 콜백
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
// DMA 방식
uint32_t diff;
uint32_t ic_Value0;
uint32_t ic_Value1;
if(htim->Instance == TIM2)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
// DMA 방식
// 1. 값 복사 및 즉시 DMA 재시작 (신호 누락 방지)
ic_Value0 = Cap_Value[0];
ic_Value1 = Cap_Value[1];
// DMA Normal Mode만 적용됨
//HAL_TIM_IC_Start_DMA(htim, TIM_CHANNEL_1, Cap_Value, 2); // &htim2 대신 htim 사용
// 2. 주파수 계산을 위한 차이값 구하기
// unsigned 32비트 연산 특성상 롤오버(오버플로우)가 발생해도 자동으로 정확한 차이가 계산됩니다.
diff = ic_Value1 - ic_Value0;
// 3. 주파수 계산 (0 나누기 방지)
if (diff != 0)
{
// 입력 캡처 타이머의 클럭 주파수가 1MHz(1,000,000Hz)로 분주(Prescaler)되어 있다고 가정함
freq = 1000000UL / diff;
printf("FREQ = %.2f Hz, T= %.3f ms \r\n", freq, (1/freq));
}
//---------------------------------------------
}
}
}