NXP MCU 技术论坛
直播中

张娟

8年用户 2224经验值
私信 关注
[问答]

使用FTM计时器来获取10us长的信号的脉冲宽度,计数器值溢出了的原因?

我正在尝试使用 FTM 计时器来获取 10us 长的信号的脉冲宽度。
但是我的计数器值溢出了。附上我的实现,以便有人可以告诉我我犯了什么错误。

/* The Flextimer 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);


}
                                       
              

更多回帖

发帖
×
20
完善资料,
赚取积分