How to Use the Internal Interrupt of the SCB Component in PSoC 4 - KBA222371

Version 2

    Version: **

     

    Translation - English: PSoC 4  SCB コンポーネントの内部割込みの使用方法 - KBA222371- Community Translated (JA)

     

    Question:

    How to Use the Internal Interrupt of the UART (SCB) Component in PSoC® 4?

     

    Answer:

    When the internal interrupt of the SCB is enabled, the SCB Component adds an internal ISR Component, which is called SCB_IRQ. PSoC Creator will generate the corresponding APIs for this ISR Component automatically. You can use the UART_SetCustomInterruptHandler(InterruptHandUart) API to set the vector of your own function to this interrupt, where InterruptHandUart is the user-defined vector for your own interrupt function.

     

                                       The internal schematic of the SCB component

     

    At the same time, the SCB_IRQ interrupt is internally used for the UART Component. The device performs internal functions such as software buffer management in the SCB_IRQ interrupt (see the Component datasheet: “The interrupt mode is automatically set to internal and the RX FIFO not empty interrupt source is reserved to manage software buffer operation: move data from the RX FIFO into the circular software buffer.”) You can also find the following code in the CY_ISR(UART_SPI_UART_ISR) function in the UART_SPI_UART_INT.C file.

     

    #if (UART_CHECK_RX_SW_BUFFER)

        {

            if (UART_CHECK_INTR_RX_MASKED(UART_INTR_RX_NOT_EMPTY))

            {

                ……

                ……

    UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY);

            }

        }

    #endif

     

    #if (UART_CHECK_TX_SW_BUFFER)

        {

            if (UART_CHECK_INTR_TX_MASKED(UART_INTR_TX_NOT_FULL))

            {

                ……

                ……

    UART_ClearTxInterruptSource(UART_INTR_TX_NOT_FULL);

            }

    }

    #endif

     

    If you enable the internal interrupt for the SCB UART Component, you can add your own function in the interrupt by using the UART_SetCustomInterruptHandler(InterruptHandUart) API in PSoC Creator. The API adds the user-defined function to the interrupt routine in front of the system-defined function (the buffer management function). You can find the code in the CY_ISR(UART_SPI_UART_ISR) function in the UART_SPI_UART_INT.c file as follows:

     

    (The UART_SPI_UART_ISR is the internal used interrupt handler for the SCB_ISR interrupt. The UART_customIntrHandler is the userdefined function.

     

    CY_ISR(UART_SPI_UART_ISR)

    {

    #if (UART_INTERNAL_RX_SW_BUFFER_CONST)

        uint32 locHead;

    #endif /* (UART_INTERNAL_RX_SW_BUFFER_CONST) */

    #if (UART_INTERNAL_TX_SW_BUFFER_CONST)

        uint32 locTail;

    #endif /* (UART_INTERNAL_TX_SW_BUFFER_CONST) */

    #ifdef UART_SPI_UART_ISR_ENTRY_CALLBACK

        UART_SPI_UART_ISR_EntryCallback();

    #endif /* UART_SPI_UART_ISR_ENTRY_CALLBACK */

        if (NULL != UART_customIntrHandler)

        {

            UART_customIntrHandler();

    }

       ……

       ……

    }

     

    The interrupt vector UART_SPI_UART_ISR is set to the SCB_ISR interrupt in the UART_UART.c file with the following code which has the same meaning as UART_SCB_IRQ_StartEx(UART_SPI_UART_ISR):

    CyIntSetVector(UART_ISR_NUMBER, &UART_SPI_UART_ISR);

    You can find the UART_SCB_IRQ_StartEx(InterruptHandUart) API in the UART_SCB_IRQ.c file. This API is automatically generated by PSOC Creator. If you use the UART_SCB_IRQ_StartEx(InterruptHandUart) API to set the interrupt handler, the system-defined function UART_SPI_UART_ISR will be replaced by the user-defined function InterruptHandUart. In this condition, the buffer management function will not be executed which may lead to a faulty operation of the UART.

    Therefore, it is recommended that you use the UART_SetCustomInterruptHandler(InterruptHandUart) API to add your own function to the internal interrupt. The UART_SCB_IRQ_StartEx(InterruptHandUart) should not be used.

    The usage of the APIs is the same with other SCBs such as SPI and I2C.

    See the following application note for a better understanding: http://www.cypress.com/documentation/application-notes/an90799-psoc-4-interrupts