我正在尝试使用 FTM 计时器来获取 10us 长的信号的脉冲宽度。
但是我的计数器值溢出了。附上我的实现,以便有人可以告诉我我犯了什么错误。
/* The Flex
timer instance/channel used for board */
#define DEMO_FTM_BASEADDR FTM1
/* FTM channel used for the capture */
#define BOARD_FTM_INPUT_CAPTURE_CHANNEL kFTM_Chnl_1
/* Interrupt to enable and flag to read; */
#define FTM_CHANNEL_INTERRUPT_ENABLE kFTM_Chnl1InterruptEnable
#define FTM_CHANNEL_FLAG kFTM_Chnl1InterruptEnable
static volatile u32 FTM_Timercountervalue = 0u;
static volatile s32 pulseWidth = 0u;
void TIMER_ConfigureFTM1_v(void)
{
FTM_SetWriteProtection(FTM1, false);
CLOCK_EnableClock(kCLOCK_Ftm1);
FTM_SetupInputCapture(DEMO_FTM_BASEADDR, BOARD_FTM_INPUT_CAPTURE_CHANNEL, kFTM_RiseAndFallEdge, 0);
FTM1->CNT = 0;
FTM0->SC |= FTM_SC_PS(1U);// system clock, divide by 1
FTM_EnableInterrupts(FTM1, kFTM_TimeOverflowInterruptEnable);
EnableIRQ(FTM1_IRQn);
NVIC_SetPriority(FTM1_IRQn, 2);
InstallIRQHandler(FTM1_IRQn, (u32)(&HALUSER_TIMER_FTM1TimeOverflow_vi));
}
static void HALUSER_TIMER_FTM1TimeOverflow_vi(void)
{
pulseWidth = ((u32)(FTM1->CONTROLS[BOARD_FTM_INPUT_CAPTURE_CHANNEL].CnV) - (u32)FTM_Timercountervalue ) ;
FTM_Timercountervalue = (u32) FTM1->CONTROLS[BOARD_FTM_INPUT_CAPTURE_CHANNEL].CnV;
FTM1->CONTROLS[BOARD_FTM_INPUT_CAPTURE_CHANNEL].CnSC &= ~FTM_CnSC_CHF_MASK;
FTM_ClearStatusFlags(FTM1, kFTM_TimeOverflowFlag);
NVIC_ClearPendingIRQ(FTM1_IRQn);
}