Hi :
I am working on quadrature decoder on FTM with TWR-K64F120M by using KDS3.0 and KSDK1.2. I have encoder connected to PTB0 and PTB1 and declare as
FTM1_QD_PHA and FTM1_QD_PHB, and able to see the signal on the scope. However, I am not able to initialize the FTM1 properly. The initialization always get stuck at FTM_HAL_SetSyncMode() in FTM_DRV_Init(). Please let me know if you have any idea or recommendation for me to clear the problem. Thanks!
main.c
//----------------------------------------------------------------------- // Standard C/C++ Includes //----------------------------------------------------------------------- #include <stdio.h> //----------------------------------------------------------------------- // KSDK Includes //----------------------------------------------------------------------- #include "main.h" //----------------------------------------------------------------------- // Application Includes //----------------------------------------------------------------------- //----------------------------------------------------------------------- // Constants //----------------------------------------------------------------------- #define ENCX_OVERFLOW 4000 //1000 CPR(cycle/rev) #define ENCY_OVERFLOW 4000 //1000 CPR(cycle/rev) const gpio_input_pin_user_config_t encoderPins[] = { { .pinName = kFTM1B0, .config.isPullEnable = false, .config.pullSelect = kPortPullUp, .config.isPassiveFilterEnabled = false, .config.isDigitalFilterEnabled = false, .config.interrupt = kPortIntDisabled }, { .pinName = kFTM1B1, .config.isPullEnable = false, .config.pullSelect = kPortPullUp, .config.isPassiveFilterEnabled = false, .config.isDigitalFilterEnabled = false, .config.interrupt = kPortIntDisabled }, { .pinName = kFTM2B18, .config.isPullEnable = false, .config.pullSelect = kPortPullUp, .config.isPassiveFilterEnabled = false, .config.isDigitalFilterEnabled = false, .config.interrupt = kPortIntDisabled }, { .pinName = kFTM2B19, .config.isPullEnable = false, .config.pullSelect = kPortPullUp, .config.isPassiveFilterEnabled = false, .config.isDigitalFilterEnabled = false, .config.interrupt = kPortIntDisabled }, { .pinName = GPIO_PINS_OUT_OF_RANGE, } }; //----------------------------------------------------------------------- // Typedefs //----------------------------------------------------------------------- //----------------------------------------------------------------------- // Global Variables //----------------------------------------------------------------------- //----------------------------------------------------------------------- // Macros //----------------------------------------------------------------------- //----------------------------------------------------------------------- // Function Prototypes //----------------------------------------------------------------------- void encoderX_Init(void); void configure_ftm1_pins(void); //----------------------------------------------------------------------- // Main Function //----------------------------------------------------------------------- int main(void) { // Configure board specific pin muxing hardware_init(); // Initialize UART terminal dbg_uart_init(); encoderX_Init(); PRINTF("\r\nRunning the TwoLED_ProjGen project.\n"); for (;;) // Forever loop { __asm("NOP"); } } void encoderX_Init(void) { FTM_Type *ftmBase; // Configure FTM1,2 encoder pins ftmBase = g_ftmBase[FTM2_IDX]; configure_ftm1_pins(); GPIO_DRV_Init(encoderPins, NULL); //FTM_DRV_QuadDecodeStop(FTM2_IDX); //OSA_InstallIntHandler(FTM1_IRQn, FlexTimer1_IRQHandler); ftm_user_config_t flexTimer1_InitConfig0 = { .tofFrequency = 0U, .isWriteProtection = false, // Disable write protection .BDMMode = kFtmBdmMode_11, .syncMethod = 0U }; FTM_DRV_Init(FTM2_IDX,&flexTimer1_InitConfig0); FTM_HAL_SetMod(ftmBase, ENCX_OVERFLOW); FTM_HAL_SetCounterInitVal(ftmBase, 0); FTM_DRV_SetClock(FTM2_IDX, kClock_source_FTM_ExternalClk, kFtmDividedBy1); //start the timer clock, source is the the phase A and B input signals ftm_phase_params_t flexTimer1_QdConfig0 = { .kFtmPhaseInputFilter = false, .kFtmPhaseFilterVal = 0U, .kFtmPhasePolarity = kFtmQuadPhaseNormal, }; FTM_DRV_QuadDecodeStart(FTM2_IDX, &flexTimer1_QdConfig0, &flexTimer1_QdConfig0, kFtmQuadPhaseEncode); FTM_HAL_ClearTimerOverflow(ftmBase); FTM_DRV_SetTimeOverflowIntCmd(FTM2_IDX,true); } void configure_ftm1_pins(void) { PORT_HAL_SetMuxMode(PORTB,0UL,kPortMuxAlt6); PORT_HAL_SetPullMode(PORTB,0UL,kPortPullUp); PORT_HAL_SetPullCmd(PORTB,0UL,false); PORT_HAL_SetMuxMode(PORTB,1UL,kPortMuxAlt6); PORT_HAL_SetPullMode(PORTB,1UL,kPortPullUp); PORT_HAL_SetPullCmd(PORTB,1UL,false); }
gpio_pin.h
enum _gpio_pins_pinNames{ kGpioSW1 = GPIO_MAKE_PIN(GPIOC_IDX, 6U), kGpioSW3 = GPIO_MAKE_PIN(GPIOA_IDX, 4U), kGpioSdhc0Cd = GPIO_MAKE_PIN(GPIOB_IDX, 20U), kGpioLED1 = GPIO_MAKE_PIN(GPIOE_IDX, 6U), kGpioLED2 = GPIO_MAKE_PIN(GPIOE_IDX, 7U), kGpioLED3 = GPIO_MAKE_PIN(GPIOE_IDX, 8U), kGpioLED4 = GPIO_MAKE_PIN(GPIOE_IDX, 9U), kGpioSdcardCardDetection = GPIO_MAKE_PIN(PORTD_IDX, 15U), /* Connects the TWR_MEM, this's SPI Card detector pin */ kFTM1B0 = GPIO_MAKE_PIN(GPIOB_IDX, 0U), //FTM1_QD_PHA kFTM1B1 = GPIO_MAKE_PIN(GPIOB_IDX, 1U), //FTM1_QD_PHB kFTM2B18 = GPIO_MAKE_PIN(GPIOB_IDX, 18U), //FTM2_QD_PHA kFTM2B19 = GPIO_MAKE_PIN(GPIOB_IDX, 19U), //FTM2_QD_PHA };
Peter Shih
解決済! 解決策の投稿を見る。
Hi XiangJun:
As you mentioned, I don't need to call FTM_HAL_SetSyncMode() function. However, it is called from FTM_DRV_Init(). Since I am using KSDK, I have no choice to avoid it except modifing source code. Actually, I set .syncMethod to "kFtmUseSoftwareTrig" instead of "0", and It works OK. I think this is what I am going to use for now. Thanks your help!
Peter Shih
Hi, Peter,
I hope you can attach your project to the community so that we can test your project on my K64 board. If you use FTM to count the phaseA and phaseB signals from encoder, I do not think it is necessary to call the FTM_HAL_SetSyncMode() function.
BR
XiangJun Rong
Hi XiangJun:
As you mentioned, I don't need to call FTM_HAL_SetSyncMode() function. However, it is called from FTM_DRV_Init(). Since I am using KSDK, I have no choice to avoid it except modifing source code. Actually, I set .syncMethod to "kFtmUseSoftwareTrig" instead of "0", and It works OK. I think this is what I am going to use for now. Thanks your help!
Peter Shih