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

Version 1

    Community Translated by MoTa_728816         Version: **

     

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

     

     

    質問:

    PSoC® 4 の UART (SCB) コンポーネントの内部割込み (Internal Interrupt) はどのように使用するのですか?

     

    回答:

    SCB の内部割込みが有効に設定されると、SCB_IRQ と呼ばれる内部 ISR コンポーネントが SCB コンポーネントに追加されます。PSoC Creator は自動的に、この ISR コンポーネント用の API を生成します。UART_SetCustomInterruptHandler(InterruptHandUart) API を使用して独自関数のベクタをこの割込みに設定することが可能です、ここで InterruptHandUart は独自割込み関数のユーザー定義ベクタです。

     

    001-pastedImage_2.png

    SCB コンポーネントの内部回路

     

    同時に SCB_IRQ 割込みは UART コンポーネントの内部で使用されます。デバイスは SCB_IRQ 割込みの中でソフトウェアバッファ管理のような内部処理を行います

    (コンポーネントデータシートによると:“割込みモードは自動的に内部(internal)に設定され、 RX FIFO not empty 割込みがデータを RX FIFO からソフトウェアによるリングバッファに移動するソフトウェアバッファ管理処理用に予約されます。”) 以下のコードを UART_SPI_UART_INT.c ファイル内の CY_ISR(UART_SPI_UART_ISR) 関数内に見ることができます。

     

    #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

     

    PSoC Creator で SCB UART コンポーネントの内部割込みを有効にすると、UART_SetCustomInterruptHandler(InterruptHandUart) API を使用して、割込みに独自の関数を追加することが可能です。この API はユーザー定義の関数をシステム定義の関数 (バッファ管理関数) の前に追加します。以下は UART_SPI_UART_INT.c ファイル内の CY_ISR(UART_SPI_UART_ISR) 関数内のコードです:

    (UART_SPI_UART_ISR は SCB_ISR 割込みに内部で使用されている割込みハンドラです。 UART_customIntrHanler はユーザー定義の関数です。)

     

    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();

    }

       ……

       ……

    }

     

    UART_UART.c ファイル内で  UART_SPI_UART_ISR 割込みベクタが SCB_ISR 割込みに以下のコードで設定されます、それは UART_SCB_IRQ_StartEx(UART_SPI_UART_ISR) と同じ意味になります:

     

    CyIntSetVector(UART_ISR_NUMBER, &UART_SPI_UART_ISR);

     

    UART_SCB_IRQ_StartEx(InterruptHandUart) API は UART_SCB_IRQ.c ファイル内にあります。この API は PSoC Creator によって自動生成されます。UART_SCB_IRQ_StartEx(InterruptHandUART) API を使用して割込みハンドラを設定すると、システム定義の UART_SPI_UART_ISR はユーザー定義の関数 InterruptHandUart に置き換えられます。この状態ではバッファ管理機能は実行されないので UART の誤動作につながる可能性があります。

     

    そのため、独自の機能を内部割込みに追加する場合には UART_SetCustomInterruptHandler(InterruptHandUart) API の使用が推奨されます。UART_SCB_IRQ_StartEx(InterruptHandUart) は使用しないでください。

     

    この API の使用方法は SPI や I2C 等、他の SCB でも同様です。

     

    より良い理解のために、以下のアプリケーションノートもご参照ください: http://www.cypress.com/documentation/application-notes/an90799-psoc-4-interrupts