I am trying to measure the percentage of a PWM signal on a FRDM-K64 board. I am using the FTM2 FlexTimer in dual edge capture mode on channels 0-1. I'm getting the interrupts both for the rising and falling edge of the pulses.But after entering the interrupt function, simply enter a rising edge of a subroutine, but there is no falling entered a subroutine, why is there such a situation
code:
#include "board.h" #include "fsl_debug_console.h" #include "pin_mux.h" #include "clock_config.h" #include "fsl_ftm.h" /******************************************************************************* * Definitions ******************************************************************************/ /* The Flextimer instance/channel used for board */ #define DEMO_FTM_BASEADDR FTM2 /* FTM channel pair used for the dual-edge capture, channel pair 0 uses channels 0 and 1 */ #define BOARD_FTM_INPUT_CAPTURE_CHANNEL_PAIR kFTM_Chnl_0 /* Interrupt number and interrupt handler for the FTM instance used */ #define FTM_INTERRUPT_NUMBER FTM2_IRQn #define FTM_INPUT_CAPTURE_HANDLER FTM2_IRQHandler /* Interrupt to enable and flag to read; depends on the FTM channel used for dual-edge capture */ #define FTM_CHANNEL0_INTERRUPT_ENABLE kFTM_Chnl0InterruptEnable #define FTM_CHANNEL1_INTERRUPT_ENABLE kFTM_Chnl1InterruptEnable #define FTM_CHANNEL0_FLAG kFTM_Chnl0Flag #define FTM_CHANNEL1_FLAG kFTM_Chnl1Flag /* Get source clock for FTM driver */ #define FTM_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_BusClk) /******************************************************************************* * Prototypes ******************************************************************************/ /******************************************************************************* * Variables ******************************************************************************/ volatile bool ftmIsrFlag = false; /******************************************************************************* * Code ******************************************************************************/ void FTM_INPUT_CAPTURE_HANDLER(void) { if ((FTM_GetStatusFlags(DEMO_FTM_BASEADDR) & FTM_CHANNEL0_FLAG) == FTM_CHANNEL0_FLAG) { PRINTF("\r\n/**********************rasing interrupt****************************\n"); FTM_ClearStatusFlags(DEMO_FTM_BASEADDR, FTM_CHANNEL0_FLAG); } if ((FTM_GetStatusFlags(DEMO_FTM_BASEADDR) & FTM_CHANNEL1_FLAG) == FTM_CHANNEL1_FLAG) { PRINTF("\r\n/**********************falling interrupt****************************\n"); FTM_ClearStatusFlags(DEMO_FTM_BASEADDR, FTM_CHANNEL1_FLAG); } } /*! * @brief Main function */ int main(void) { ftm_config_t ftmInfo; ftm_dual_edge_capture_param_t edgeParam; /* Board pin, clock, debug console init */ BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); /* Print a note to terminal */ PRINTF("\r\nFTM dual-edge capture example\r\n"); PRINTF("\r\nSYSTEM Clock:%d\r\n",CLOCK_GetFreq(kCLOCK_CoreSysClk)); PRINTF("\r\nBUS Clock:%d\r\n",CLOCK_GetFreq(kCLOCK_BusClk)); FTM_GetDefaultConfig(&ftmInfo); ftmInfo.prescale = kFTM_Prescale_Divide_128; /* Initialize FTM module */ FTM_Init(DEMO_FTM_BASEADDR, &ftmInfo); edgeParam.mode = kFTM_Continuous; //Set capture edges to calculate the pulse width of input signal edgeParam.currChanEdgeMode = kFTM_RisingEdge; edgeParam.nextChanEdgeMode = kFTM_FallingEdge; /* Setup dual-edge capture on a FTM channel pair */ FTM_SetupDualEdgeCapture(DEMO_FTM_BASEADDR, BOARD_FTM_INPUT_CAPTURE_CHANNEL_PAIR, &edgeParam, 0); /* Set the timer to be in free-running mode */ DEMO_FTM_BASEADDR->MOD = 0xffff; /* Enable channel interrupt when the second edge is detected */ FTM_EnableInterrupts(DEMO_FTM_BASEADDR, FTM_CHANNEL0_INTERRUPT_ENABLE); FTM_EnableInterrupts(DEMO_FTM_BASEADDR, FTM_CHANNEL1_INTERRUPT_ENABLE); /* Enable at the NVIC */ EnableIRQ(FTM_INTERRUPT_NUMBER); FTM_StartTimer(DEMO_FTM_BASEADDR, kFTM_SystemClock); while (1) { ; } }
Original Attachment has been moved to: main.c.zip