<?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 Re: GPIO interrupt lose count from quadrature decoder in Kinetis Software Development Kit</title>
    <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414515#M1952</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;Did you resolve this?&amp;nbsp; If yes, how?&lt;/P&gt;&lt;P&gt;If no, you can always insert your ISR directly into the vector table (called a gorilla interrupt) that will preempt the RTOS.&lt;/P&gt;&lt;P&gt;This is OK as long as you do not make RTOS calls.&amp;nbsp; So use a global variable to keep track of count.&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;David &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 07 Nov 2015 16:15:46 GMT</pubDate>
    <dc:creator>DavidS</dc:creator>
    <dc:date>2015-11-07T16:15:46Z</dc:date>
    <item>
      <title>GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414512#M1949</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 a custom board equipped with K66 MCU, three quadrature decoders and other peripherals. Since three quadrature decoders, I am going to utilized FTM1, and 2 for two devices, and general gpio interrupt for the other. The software development is based on KDS3.0 and KSDK1.2. The first thing I would like to do is verifying the integrity of GPIO interrupt from encoder. I basically jump the FTM1_QD_PHA and FTM1_QD_PHB signals to PTE8, and PTE9, and a motor encoder signal connects to FTM1. Therefore, the same encoder signal should feed to both FTM1 and GPIO port E. When I test it with bare board and SDK platform only, the had pretty match count from both decoder. This gives me confirmation that FTM and GPIO interrupt and decoder algorithm are running OK. However, if I have similar code and utilize SDK with MQX, I am facing lose count on GPIO interrupt. For example I ran the motor about 3 seconds (the encoder signals tick in at 6.64kHz, 150us period), the FTM reads 61438 count, but GPIO interrupt counts 60967.&amp;nbsp; I am wondering if I miss something, or this is drawback of utilizing MQX. Does MQX take lots of CPU resource that cause losing interrupt? If you have any idea or recommendation please let me know. Thank you very much.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;main.c without MQX&lt;/P&gt;&lt;PRE class="c++" name="code"&gt;// Standard C Included Files #include &amp;lt;stdio.h&amp;gt; // SDK Included Files #include "board.h" #include "gpio_pins.h" #include "fsl_debug_console.h" #include "fsl_device_registers.h" #include "fsl_ftm_driver.h" #include "fsl_ftm_hal.h"&amp;nbsp; //----------------------------------------------------------------------- // Function Prototypes //----------------------------------------------------------------------- void gpio_Init(void); void encoderX_Init(void); void encoderZ_Init(void); void FlexTimer1_IRQHandler(void); uint8_t ScanEcn(uint8_t InputAB, uint8_t PreviousStateAB, int64_t *EncCnt); void BOARD_ENCZ_IRQ_HANDLER(void); int64_t GetEncXCnt(void);&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; //----------------------------------------------------------------------- // Typedefs //-----------------------------------------------------------------------&amp;nbsp; //----------------------------------------------------------------------- // Global Variables //----------------------------------------------------------------------- int64_t&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; EncXOF = 0; int64_t&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; PosX = 0; int64_t&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; PosZ = 0; int64_t&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; PosXPV = 0; int64_t&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; PosZPV = 0; volatile&amp;nbsp; uint8_t&amp;nbsp;&amp;nbsp; stateOld = 0;&amp;nbsp; //----------------------------------------------------------------------- // Main Function //----------------------------------------------------------------------- int main(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; /* Write your code here */ &amp;nbsp;&amp;nbsp;&amp;nbsp; // Init hardware &amp;nbsp;&amp;nbsp;&amp;nbsp; hardware_init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; dbg_uart_init();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PRINTF("\r\n\nRunning QEncIntTest example.");&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_Init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; encoderX_Init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; encoderZ_Init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; PosXPV = GetEncXCnt(); &amp;nbsp;&amp;nbsp;&amp;nbsp; PosXPV = PosZPV = PosZ;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /* This for loop should be replaced. By default this loop allows a single stepping. */ &amp;nbsp;&amp;nbsp;&amp;nbsp; for (;;) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PosX = GetEncXCnt();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (PosX != PosXPV || PosZ != PosZPV) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINTF("\r\nPosX = %ld, PosZ = %ld", (int32_t)PosX, (int32_t)PosZ); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PosXPV = PosX; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PosZPV = PosZ; &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; /* Never leave main */ &amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; }&amp;nbsp; void gpio_Init(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_output_pin_user_config_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outputPinConfig;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; outputPinConfig.pinName = kGpioE0; &amp;nbsp;&amp;nbsp;&amp;nbsp; outputPinConfig.config.outputLogic = 0; &amp;nbsp;&amp;nbsp;&amp;nbsp; outputPinConfig.config.slewRate = kPortSlowSlewRate; &amp;nbsp;&amp;nbsp;&amp;nbsp; outputPinConfig.config.isOpenDrainEnabled = false; &amp;nbsp;&amp;nbsp;&amp;nbsp; outputPinConfig.config.driveStrength = kPortLowDriveStrength; &amp;nbsp;&amp;nbsp;&amp;nbsp; GPIO_DRV_OutputPinInit(&amp;amp;outputPinConfig); }&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[BOARD_ENCX_FTM_INSTANCE]; &amp;nbsp;&amp;nbsp;&amp;nbsp; configure_ftm_pins(BOARD_ENCX_FTM_INSTANCE);&amp;nbsp; &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; = kFtmUseSoftwareTrig &amp;nbsp;&amp;nbsp;&amp;nbsp; }; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_Init(BOARD_ENCX_FTM_INSTANCE,&amp;amp;flexTimer1_InitConfig0);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_SetMod(ftmBase, ENCX_OVERFLOW-1); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_HAL_SetCounterInitVal(ftmBase, 0);&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_SetClock(BOARD_ENCX_FTM_INSTANCE, kClock_source_FTM_SystemClk, 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(BOARD_ENCX_FTM_INSTANCE, &amp;amp;flexTimer1_QdConfig0, &amp;amp;flexTimer1_QdConfig0, kFtmQuadPhaseEncode); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_SetTimeOverflowIntCmd(BOARD_ENCX_FTM_INSTANCE,true); &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_SetFaultIntCmd(BOARD_ENCX_FTM_INSTANCE,false); }&amp;nbsp; void encoderZ_Init(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; GPIO_DRV_Init(encoderZPins, NULL);&amp;nbsp;&amp;nbsp;&amp;nbsp; //configure QD_PHB and QD_PHB signal }&amp;nbsp; /* FTM1 IRQ handler that would cover the same name's APIs in startup code. */ extern void FTM_DRV_IRQHandler(uint32_t instance); void FTM1_IRQHandler(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; if((FTM1_QDCTRL &amp;amp; FTM_QDCTRL_TOFDIR_MASK) == 0) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncXOF--; &amp;nbsp;&amp;nbsp;&amp;nbsp; else &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncXOF++;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FTM_DRV_IRQHandler(1); }&amp;nbsp; uint8_t ScanEcn(uint8_t InputAB, uint8_t PreviousStateAB, int64_t *EncCnt) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (PreviousStateAB){ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0x0: &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; if(InputAB == 0x1){ &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; (*EncCnt)++; &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; }else if(InputAB == 0x2){ &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; (*EncCnt)--; &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; break; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0x1: &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; if(InputAB == 0x0){ &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; (*EncCnt)--; &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; }else if(InputAB == 0x3){ &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; (*EncCnt)++; &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; break; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0x2: &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; if(InputAB == 0x0){ &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; (*EncCnt)++; &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; }else if(InputAB == 0x3){ &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; (*EncCnt)--; &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; break; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0x3: &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; if(InputAB == 0x1){ &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; (*EncCnt)--; &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; }else if(InputAB == 0x2){ &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; (*EncCnt)++; &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; break; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default: break; &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; return InputAB; } /* PORTE IRQ handler that would cover the same name's APIs in startup code. */ void PORTE_IRQHandler(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (PORTE_PCR8 &amp;amp; PORT_PCR_ISF_MASK) {&amp;nbsp;&amp;nbsp;&amp;nbsp; //interrupt on A changing state &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE_PCR8 |= PORT_PCR_ISF_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear the flag &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state = (uint8_t)((GPIOE_PDIR &amp;amp; 0x00000300) &amp;gt;&amp;gt; 8); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stateOld = ScanEcn(state, stateOld, &amp;amp;PosZ); &amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (PORTE_PCR9 &amp;amp; PORT_PCR_ISF_MASK) {&amp;nbsp;&amp;nbsp;&amp;nbsp; //interrupt on B changing state &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORTE_PCR9 |= PORT_PCR_ISF_MASK;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear the flag &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; state = (uint8_t)((GPIOE_PDIR &amp;amp; 0x00000300) &amp;gt;&amp;gt; 8); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stateOld = ScanEcn(state, stateOld, &amp;amp;PosZ); &amp;nbsp;&amp;nbsp;&amp;nbsp; } }&amp;nbsp; int64_t GetEncXCnt(void) { &amp;nbsp;&amp;nbsp;&amp;nbsp; return ((ENCX_OVERFLOW * EncXOF) + FTM1_CNT); }&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 style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;main.c without MQX&lt;/P&gt;&lt;PRE class="c++" name="code"&gt;//----------------------------------------------------------------------- // Standard C/C++ Includes //----------------------------------------------------------------------- #include &amp;lt;stdio.h&amp;gt; #include "main.h"&amp;nbsp; void main_task(uint32_t param); void task_example(task_param_t param); void gpio_Init(void); void encoderX_Init(void); void encoderZ_Init(void); void FlexTimer1_IRQHandler(void); uint8_t ScanEcn(uint8_t InputAB, uint8_t PreviousStateAB, int64_t *EncCnt); void BOARD_ENCZ_IRQ_HANDLER(void); int64_t GetEncXCnt(void);&amp;nbsp; //----------------------------------------------------------------------- // Constants //----------------------------------------------------------------------- #define MAIN_TASK&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; 8U&amp;nbsp; const TASK_TEMPLATE_STRUCT&amp;nbsp; MQX_template_list[] = { &amp;nbsp;&amp;nbsp; { MAIN_TASK, main_task, 0xC00, 20, "main_task", MQX_AUTO_START_TASK}, &amp;nbsp;&amp;nbsp; { 0L,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0L,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0L,&amp;nbsp;&amp;nbsp;&amp;nbsp; 0L,&amp;nbsp; 0L,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0L } }; #define TASK_EXAMPLE_PRIO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6U #define TASK_EXAMPLE_STACK_SIZE&amp;nbsp;&amp;nbsp; 1024U&amp;nbsp; #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; //----------------------------------------------------------------------- // Global Variables //----------------------------------------------------------------------- int64_t&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; EncXOF = 0; int64_t&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; PosX = 0; int64_t&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; PosZ = 0; int64_t&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; PosXPV = 0; int64_t&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; PosZPV = 0; volatile&amp;nbsp; uint8_t&amp;nbsp;&amp;nbsp; stateOld = 0;&amp;nbsp; //----------------------------------------------------------------------- // Macros //----------------------------------------------------------------------- OSA_TASK_DEFINE(task_example, TASK_EXAMPLE_STACK_SIZE);&amp;nbsp; //----------------------------------------------------------------------- // Main Function //-----------------------------------------------------------------------&amp;nbsp; void main_task(uint32_t param) { &amp;nbsp;&amp;nbsp;&amp;nbsp; osa_status_t result = kStatus_OSA_Error; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf("\n\nRunning the KSDK_1_2_0_PCB58852 project.");&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_Init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; encoderX_Init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; encoderZ_Init(); &amp;nbsp;&amp;nbsp;&amp;nbsp; PosXPV = GetEncXCnt(); &amp;nbsp;&amp;nbsp;&amp;nbsp; PosZ = PosXPV; &amp;nbsp;&amp;nbsp;&amp;nbsp; PosZPV = PosXPV;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; OSA_Init(); //&amp;nbsp;&amp;nbsp;&amp;nbsp; result = OSA_TaskCreate(task_example, //&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; (uint8_t *)"example", //&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; TASK_EXAMPLE_STACK_SIZE, //&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; task_example_stack, //&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; TASK_EXAMPLE_PRIO, //&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; (task_param_t)0, //&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; 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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;task_example_task_handler); //&amp;nbsp;&amp;nbsp;&amp;nbsp; if (result != kStatus_OSA_Success) //&amp;nbsp;&amp;nbsp;&amp;nbsp; { //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Failed to create example task\r\n"); //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; //&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp; OSA_Start();&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; PosX = GetEncXCnt();&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (PosX != PosXPV || PosZ != PosZPV) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("\nPosX = %ld, PosZ = %ld", (int32_t)PosX, (int32_t)PosZ); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PosXPV = PosX; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PosZPV = PosZ; &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; OSA_TimeDelay(100);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //500ms delay &amp;nbsp;&amp;nbsp;&amp;nbsp; } } //----------------------------------------------------------------------- // Task Functions //----------------------------------------------------------------------- // //void task_example(task_param_t param) //{ //&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("\r\nHellow World.\r\n"); // //&amp;nbsp;&amp;nbsp;&amp;nbsp; while(1) //&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; } //}&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Oct 2015 13:47:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414512#M1949</guid>
      <dc:creator>petershih</dc:creator>
      <dc:date>2015-10-20T13:47:13Z</dc:date>
    </item>
    <item>
      <title>Re: GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414513#M1950</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;Is your GPIO input interrupt configured for edge or level (i.e. low level or high level) trigger?&lt;/P&gt;&lt;P&gt;An edge interrupt will remain valid until the ISR is cleared.&amp;nbsp; A level interrupt goes away if it reverts back to non-asserted level.&lt;/P&gt;&lt;P&gt;Are the FTM and GPIO interrupts the same or different priority level?&lt;/P&gt;&lt;P&gt;In summary:&lt;/P&gt;&lt;P&gt;Edge gpio is persistent.&lt;/P&gt;&lt;P&gt;Level gpio is non-persistent.&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;David &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Oct 2015 18:26:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414513#M1950</guid>
      <dc:creator>DavidS</dc:creator>
      <dc:date>2015-10-20T18:26:18Z</dc:date>
    </item>
    <item>
      <title>Re: GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414514#M1951</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi David:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The GPIO interrupt is edge interrupted. As you can see in the code, I clear the interrupt flag before reading the port for process. I didn't specified the interrupt priority for both. I will assume it stay the same as MQX specified in the default.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Since you mentioned about priority. I have tried declear GPIO interrupt priority NVIC_SetPriority(PORTE_IRQn, 2U); in the encoderZ_Init(). I see match reading in a very short time, after a while the software stopped. If I set priority to 4. it doesn't help! But the software continue run without problem. As my understanding, priority 2 is the highest priority in the MQX default. Let me know if any other though. Thanks!&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper" image-alt="pastedImage_0.png"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/23891i1A35B42506E09BB9/image-size/large?v=v2&amp;amp;px=999" role="button" title="pastedImage_0.png" alt="pastedImage_0.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;Peter Shih&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Oct 2015 20:00:58 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414514#M1951</guid>
      <dc:creator>petershih</dc:creator>
      <dc:date>2015-10-20T20:00:58Z</dc:date>
    </item>
    <item>
      <title>Re: GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414515#M1952</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;Did you resolve this?&amp;nbsp; If yes, how?&lt;/P&gt;&lt;P&gt;If no, you can always insert your ISR directly into the vector table (called a gorilla interrupt) that will preempt the RTOS.&lt;/P&gt;&lt;P&gt;This is OK as long as you do not make RTOS calls.&amp;nbsp; So use a global variable to keep track of count.&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;David &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 07 Nov 2015 16:15:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414515#M1952</guid>
      <dc:creator>DavidS</dc:creator>
      <dc:date>2015-11-07T16:15:46Z</dc:date>
    </item>
    <item>
      <title>Re: GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414516#M1953</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi David:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Appreciate your feedback. I am sorry replying so late. The problem is still not resolved yet. Actually, I was working with Freescale support group regarding this issue. However, I haven't receive any positive feedback yet.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You mentioned a good point. It's related with interrupt. As the source code enclosed, I though I did replace the port E interrupt with a custom interrupt service routine to process the count (PosZ), and the count is declared as a global variable. I am not sure if I understand your recommendation clearly. Could you give me more detail though or any sample code?&amp;nbsp; Thanks your feedback.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 11 Nov 2015 14:02:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414516#M1953</guid>
      <dc:creator>petershih</dc:creator>
      <dc:date>2015-11-11T14:02:48Z</dc:date>
    </item>
    <item>
      <title>Re: GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414517#M1954</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;Sorry for my delay.&lt;/P&gt;&lt;P&gt;I have had another customer with similar issue not using MQX.&amp;nbsp; When he dug into the cause it was disabling global interrupts for too long which caused the missing edges.&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;David &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 13 Nov 2015 22:39:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414517#M1954</guid>
      <dc:creator>DavidS</dc:creator>
      <dc:date>2015-11-13T22:39:46Z</dc:date>
    </item>
    <item>
      <title>Re: GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414518#M1955</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi David:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks your information. I don't have any global interrupt disabling in my code. Of cause, I don't have any idea if MQX does this.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Peter Shih&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 16 Nov 2015 16:14:47 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414518#M1955</guid>
      <dc:creator>petershih</dc:creator>
      <dc:date>2015-11-16T16:14:47Z</dc:date>
    </item>
    <item>
      <title>Re: GPIO interrupt lose count from quadrature decoder</title>
      <link>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414519#M1956</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Peter,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;" Due to the MQX RTOS interrupt handling mechanism, the names of the ISR entry functions must be different than those in the CMSIS startup code file (startup_&amp;lt;device&amp;gt;.S), otherwise the kernel ISR is not called when the corresponding interrupt triggers. "&lt;/P&gt;&lt;P&gt;These&amp;nbsp; words is from the DOC of my colleague Jorge Gonzalez&amp;nbsp; :&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/docs/DOC-104352"&gt;Interrupt handling with KSDK and Kinetis Design Studio&lt;/A&gt;&lt;/P&gt;&lt;P&gt;I think you can check this , maybe it can help you .&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope it helps&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;P&gt;Have a great day,&lt;BR /&gt;Alice&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 17 Nov 2015 02:28:42 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Software-Development-Kit/GPIO-interrupt-lose-count-from-quadrature-decoder/m-p/414519#M1956</guid>
      <dc:creator>Alice_Yang</dc:creator>
      <dc:date>2015-11-17T02:28:42Z</dc:date>
    </item>
  </channel>
</rss>

