<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Quadrature decoder initialization with KSDK1.2 &amp; KDS3.0 in Kinetis Software Development Kit</title>
    <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Quadrature-decoder-initialization-with-KSDK1-2-KDS3-0/m-p/452997#M3153</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi :&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;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 &lt;/P&gt;&lt;P&gt;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!&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="86568_86568.png"&gt;&lt;IMG alt="86568_86568.png" src="https://community.nxp.com/t5/image/serverpage/image-id/120687iF1019297C217B559/image-size/large?v=v2&amp;amp;px=999" title="86568_86568.png" /&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="pastedImage_0.png"&gt;&lt;IMG alt="pastedImage_0.png" src="https://community.nxp.com/t5/image/serverpage/image-id/21730iE9CCB85DD8A99223/image-size/large?v=v2&amp;amp;px=999" title="pastedImage_0.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;main.c&lt;/P&gt;&lt;PRE class="c++" name="code"&gt;//----------------------------------------------------------------------- // Standard C/C++ Includes //----------------------------------------------------------------------- #include &amp;lt;stdio.h&amp;gt;&amp;nbsp; //----------------------------------------------------------------------- // KSDK Includes //----------------------------------------------------------------------- #include "main.h"&amp;nbsp; //----------------------------------------------------------------------- // Application Includes //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Constants //----------------------------------------------------------------------- #define&amp;nbsp;&amp;nbsp;&amp;nbsp; ENCX_OVERFLOW&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4000&amp;nbsp;&amp;nbsp;&amp;nbsp; //1000 CPR(cycle/rev) #define&amp;nbsp;&amp;nbsp;&amp;nbsp; ENCY_OVERFLOW&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4000&amp;nbsp;&amp;nbsp;&amp;nbsp; //1000 CPR(cycle/rev)&amp;nbsp; const gpio_input_pin_user_config_t encoderPins[] = { &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM1B0, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM1B1, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM2B18, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM2B19, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = GPIO_PINS_OUT_OF_RANGE, &amp;nbsp; } };&amp;nbsp; //----------------------------------------------------------------------- // Typedefs //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Global Variables //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Macros //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Function Prototypes //----------------------------------------------------------------------- void encoderX_Init(void); void configure_ftm1_pins(void);&amp;nbsp; //----------------------------------------------------------------------- // Main Function //----------------------------------------------------------------------- int main(void) {&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Configure board specific pin muxing &amp;nbsp;&amp;nbsp;&amp;nbsp; hardware_init();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize UART terminal &amp;nbsp;&amp;nbsp;&amp;nbsp; dbg_uart_init();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; encoderX_Init();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PRINTF("\r\nRunning the TwoLED_ProjGen project.\n");&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (;;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Forever loop &amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __asm("NOP"); &amp;nbsp;&amp;nbsp;&amp;nbsp; } }&amp;nbsp; void encoderX_Init(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_Type *ftmBase;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Configure FTM1,2 encoder pins &amp;nbsp;&amp;nbsp;&amp;nbsp; ftmBase = g_ftmBase[FTM2_IDX]; &amp;nbsp;&amp;nbsp;&amp;nbsp; configure_ftm1_pins(); &amp;nbsp;&amp;nbsp;&amp;nbsp; GPIO_DRV_Init(encoderPins, NULL);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM_DRV_QuadDecodeStop(FTM2_IDX); &amp;nbsp;&amp;nbsp;&amp;nbsp; //OSA_InstallIntHandler(FTM1_IRQn, FlexTimer1_IRQHandler); &amp;nbsp;&amp;nbsp;&amp;nbsp; ftm_user_config_t flexTimer1_InitConfig0 = { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tofFrequency&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0U, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .isWriteProtection = false,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable write protection &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .BDMMode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = kFtmBdmMode_11, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .syncMethod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0U &amp;nbsp;&amp;nbsp;&amp;nbsp; }; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_Init(FTM2_IDX,&amp;amp;flexTimer1_InitConfig0);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_SetMod(ftmBase, ENCX_OVERFLOW); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_SetCounterInitVal(ftmBase, 0);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_SetClock(FTM2_IDX, kClock_source_FTM_ExternalClk, kFtmDividedBy1);&amp;nbsp;&amp;nbsp;&amp;nbsp; //start the timer clock, source is the the phase A and B input signals &amp;nbsp;&amp;nbsp;&amp;nbsp; ftm_phase_params_t flexTimer1_QdConfig0 = { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .kFtmPhaseInputFilter = false, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .kFtmPhaseFilterVal = 0U, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .kFtmPhasePolarity = kFtmQuadPhaseNormal, &amp;nbsp;&amp;nbsp;&amp;nbsp; }; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_QuadDecodeStart(FTM2_IDX, &amp;amp;flexTimer1_QdConfig0, &amp;amp;flexTimer1_QdConfig0, kFtmQuadPhaseEncode); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_ClearTimerOverflow(ftmBase); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_SetTimeOverflowIntCmd(FTM2_IDX,true); }&amp;nbsp; void configure_ftm1_pins(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetMuxMode(PORTB,0UL,kPortMuxAlt6); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullMode(PORTB,0UL,kPortPullUp); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullCmd(PORTB,0UL,false); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetMuxMode(PORTB,1UL,kPortMuxAlt6); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullMode(PORTB,1UL,kPortPullUp); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullCmd(PORTB,1UL,false); }&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;gpio_pin.h&lt;/P&gt;&lt;PRE class="c++" name="code"&gt;enum _gpio_pins_pinNames{ &amp;nbsp; kGpioSW1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOC_IDX, 6U), &amp;nbsp; kGpioSW3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOA_IDX, 4U), &amp;nbsp; kGpioSdhc0Cd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 20U), &amp;nbsp; kGpioLED1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 6U), &amp;nbsp; kGpioLED2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 7U), &amp;nbsp; kGpioLED3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 8U), &amp;nbsp; kGpioLED4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 9U), &amp;nbsp; kGpioSdcardCardDetection&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(PORTD_IDX, 15U),&amp;nbsp; /* Connects the TWR_MEM, this's SPI Card detector pin */&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM1B0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 0U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM1_QD_PHA &amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM1B1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 1U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM1_QD_PHB &amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM2B18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 18U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM2_QD_PHA &amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM2B19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 19U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM2_QD_PHA };&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Peter Shih&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 02 Nov 2020 13:22:43 GMT</pubDate>
    <dc:creator>petershih</dc:creator>
    <dc:date>2020-11-02T13:22:43Z</dc:date>
    <item>
      <title>Quadrature decoder initialization with KSDK1.2 &amp; KDS3.0</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Quadrature-decoder-initialization-with-KSDK1-2-KDS3-0/m-p/452997#M3153</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi :&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;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 &lt;/P&gt;&lt;P&gt;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!&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="86568_86568.png"&gt;&lt;IMG alt="86568_86568.png" src="https://community.nxp.com/t5/image/serverpage/image-id/120687iF1019297C217B559/image-size/large?v=v2&amp;amp;px=999" title="86568_86568.png" /&gt;&lt;/SPAN&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="pastedImage_0.png"&gt;&lt;IMG alt="pastedImage_0.png" src="https://community.nxp.com/t5/image/serverpage/image-id/21730iE9CCB85DD8A99223/image-size/large?v=v2&amp;amp;px=999" title="pastedImage_0.png" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;main.c&lt;/P&gt;&lt;PRE class="c++" name="code"&gt;//----------------------------------------------------------------------- // Standard C/C++ Includes //----------------------------------------------------------------------- #include &amp;lt;stdio.h&amp;gt;&amp;nbsp; //----------------------------------------------------------------------- // KSDK Includes //----------------------------------------------------------------------- #include "main.h"&amp;nbsp; //----------------------------------------------------------------------- // Application Includes //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Constants //----------------------------------------------------------------------- #define&amp;nbsp;&amp;nbsp;&amp;nbsp; ENCX_OVERFLOW&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4000&amp;nbsp;&amp;nbsp;&amp;nbsp; //1000 CPR(cycle/rev) #define&amp;nbsp;&amp;nbsp;&amp;nbsp; ENCY_OVERFLOW&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4000&amp;nbsp;&amp;nbsp;&amp;nbsp; //1000 CPR(cycle/rev)&amp;nbsp; const gpio_input_pin_user_config_t encoderPins[] = { &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM1B0, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM1B1, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM2B18, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = kFTM2B19, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPullEnable = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.pullSelect = kPortPullUp, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isPassiveFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.isDigitalFilterEnabled = false, &amp;nbsp;&amp;nbsp;&amp;nbsp; .config.interrupt = kPortIntDisabled &amp;nbsp; }, &amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp; .pinName = GPIO_PINS_OUT_OF_RANGE, &amp;nbsp; } };&amp;nbsp; //----------------------------------------------------------------------- // Typedefs //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Global Variables //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Macros //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Function Prototypes //----------------------------------------------------------------------- void encoderX_Init(void); void configure_ftm1_pins(void);&amp;nbsp; //----------------------------------------------------------------------- // Main Function //----------------------------------------------------------------------- int main(void) {&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Configure board specific pin muxing &amp;nbsp;&amp;nbsp;&amp;nbsp; hardware_init();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize UART terminal &amp;nbsp;&amp;nbsp;&amp;nbsp; dbg_uart_init();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; encoderX_Init();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PRINTF("\r\nRunning the TwoLED_ProjGen project.\n");&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (;;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Forever loop &amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __asm("NOP"); &amp;nbsp;&amp;nbsp;&amp;nbsp; } }&amp;nbsp; void encoderX_Init(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_Type *ftmBase;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Configure FTM1,2 encoder pins &amp;nbsp;&amp;nbsp;&amp;nbsp; ftmBase = g_ftmBase[FTM2_IDX]; &amp;nbsp;&amp;nbsp;&amp;nbsp; configure_ftm1_pins(); &amp;nbsp;&amp;nbsp;&amp;nbsp; GPIO_DRV_Init(encoderPins, NULL);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM_DRV_QuadDecodeStop(FTM2_IDX); &amp;nbsp;&amp;nbsp;&amp;nbsp; //OSA_InstallIntHandler(FTM1_IRQn, FlexTimer1_IRQHandler); &amp;nbsp;&amp;nbsp;&amp;nbsp; ftm_user_config_t flexTimer1_InitConfig0 = { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tofFrequency&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0U, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .isWriteProtection = false,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable write protection &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .BDMMode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = kFtmBdmMode_11, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .syncMethod&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0U &amp;nbsp;&amp;nbsp;&amp;nbsp; }; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_Init(FTM2_IDX,&amp;amp;flexTimer1_InitConfig0);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_SetMod(ftmBase, ENCX_OVERFLOW); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_SetCounterInitVal(ftmBase, 0);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_SetClock(FTM2_IDX, kClock_source_FTM_ExternalClk, kFtmDividedBy1);&amp;nbsp;&amp;nbsp;&amp;nbsp; //start the timer clock, source is the the phase A and B input signals &amp;nbsp;&amp;nbsp;&amp;nbsp; ftm_phase_params_t flexTimer1_QdConfig0 = { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .kFtmPhaseInputFilter = false, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .kFtmPhaseFilterVal = 0U, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .kFtmPhasePolarity = kFtmQuadPhaseNormal, &amp;nbsp;&amp;nbsp;&amp;nbsp; }; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_QuadDecodeStart(FTM2_IDX, &amp;amp;flexTimer1_QdConfig0, &amp;amp;flexTimer1_QdConfig0, kFtmQuadPhaseEncode); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_ClearTimerOverflow(ftmBase); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_SetTimeOverflowIntCmd(FTM2_IDX,true); }&amp;nbsp; void configure_ftm1_pins(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetMuxMode(PORTB,0UL,kPortMuxAlt6); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullMode(PORTB,0UL,kPortPullUp); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullCmd(PORTB,0UL,false); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetMuxMode(PORTB,1UL,kPortMuxAlt6); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullMode(PORTB,1UL,kPortPullUp); &amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_HAL_SetPullCmd(PORTB,1UL,false); }&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;gpio_pin.h&lt;/P&gt;&lt;PRE class="c++" name="code"&gt;enum _gpio_pins_pinNames{ &amp;nbsp; kGpioSW1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOC_IDX, 6U), &amp;nbsp; kGpioSW3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOA_IDX, 4U), &amp;nbsp; kGpioSdhc0Cd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 20U), &amp;nbsp; kGpioLED1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 6U), &amp;nbsp; kGpioLED2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 7U), &amp;nbsp; kGpioLED3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 8U), &amp;nbsp; kGpioLED4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOE_IDX, 9U), &amp;nbsp; kGpioSdcardCardDetection&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(PORTD_IDX, 15U),&amp;nbsp; /* Connects the TWR_MEM, this's SPI Card detector pin */&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM1B0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 0U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM1_QD_PHA &amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM1B1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 1U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM1_QD_PHB &amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM2B18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 18U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM2_QD_PHA &amp;nbsp;&amp;nbsp;&amp;nbsp; kFTM2B19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GPIO_MAKE_PIN(GPIOB_IDX, 19U),&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //FTM2_QD_PHA };&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Peter Shih&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Nov 2020 13:22:43 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Quadrature-decoder-initialization-with-KSDK1-2-KDS3-0/m-p/452997#M3153</guid>
      <dc:creator>petershih</dc:creator>
      <dc:date>2020-11-02T13:22:43Z</dc:date>
    </item>
    <item>
      <title>Re: Quadrature decoder initialization with KSDK1.2 &amp; KDS3.0</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Quadrature-decoder-initialization-with-KSDK1-2-KDS3-0/m-p/452998#M3154</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, Peter,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;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&amp;nbsp; FTM_HAL_SetSyncMode() function.&lt;/P&gt;&lt;P&gt;BR&lt;/P&gt;&lt;P&gt;XiangJun Rong&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 14 Oct 2015 06:52:01 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Quadrature-decoder-initialization-with-KSDK1-2-KDS3-0/m-p/452998#M3154</guid>
      <dc:creator>xiangjun_rong</dc:creator>
      <dc:date>2015-10-14T06:52:01Z</dc:date>
    </item>
    <item>
      <title>Re: Quadrature decoder initialization with KSDK1.2 &amp; KDS3.0</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Quadrature-decoder-initialization-with-KSDK1-2-KDS3-0/m-p/452999#M3155</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi XiangJun:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;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!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Peter Shih&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 16 Oct 2015 16:11:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/Quadrature-decoder-initialization-with-KSDK1-2-KDS3-0/m-p/452999#M3155</guid>
      <dc:creator>petershih</dc:creator>
      <dc:date>2015-10-16T16:11:05Z</dc:date>
    </item>
  </channel>
</rss>

