割り込みのポーリングについて

Former Member
Former Member

こんにちは、Masaといいます。
お世話になっております。

割り込みのポーリングを行おうとしています。
RA2L1シリーズを使用して、シリアルコミュニケーションインタフェース(SCI)でデータを送受信します。
割り込みを使えない環境と言う状況で、割り込みのポーリングで送受信状況を判断した通信を考えています。

Renesas RA2L1 グループ ユーザーズマニュアル ハードウェア編(R01UH0853JJ0130 Rev.1.30 Feb 2023)の214ページ、215ページに
12.5.3 割り込みのポーリング
の項があり、下記手順が記載されています。

1. 割り込みクリア許可レジスタ (NVIC_ICER) を設定してください。
2. 割り込み要因として、IELSRn.IELS[4:0]ビットを設定してください。
3. スヌーズモードの解除(SELSR0.SELS[7:0]ビットの設定)、ソフトウェアスタンバイモードの解除(WUPEN
レジスタの設定)など、イベント要因に対する動作設定をしてください。
4. 割り込みセット保留レジスタ (NVIC_ISPR) をポーリングしてください。

上記手順の4での「割り込みセット保留レジスタのポーリング」の記述方法について調べても見つけられませんでした。
SCI0の送信バッファエンプティポーリングの場合
NVIC_SetPendingIRQ(IEL9_IRQn)
が割り込みセット保留レジスタの記述になるのではと想像しているのですが、ポーリングにあたりwhile文としての記述がわからない状態です。
いくつかのサンプルプログラム(RA2L1以外も)をダウンロードして「NVIC_SetPendingIRQ」を使用した例を検索してみましたが、見つけられませんでした。

サンプルプログラムや記述方法についてご存じの方がいらっしゃいましたら、教えていただけますと助かります。

宜しくお願い致します。

Parents
  • 問題は解消している様ですので、蛇足となりますが、参考まで。

    元々、Masaさまが考えていたのは、下記の様な処理かと思いました。(全然違っていたらスミマセン)

    SCI9の受信(RXI割り込み)を割り込みフラグでポーリングするプログラムです。(受信した文字をそのままエコーバックで表示)

     R_ICU->IELSR_b[4].IELS = 0x1E;

    0x1Eは、SCI9_RXI(機能毎に割り振られた番号)です。

    4は普通のRAでは好きな番号に出来ますが、RA2L1の場合は機能毎に割り当てられる番号がグループ化されており、SCI9_RXI場合は4,12,20,28のいずれかである必要があります。

    if (R_ICU->IELSR_b[4].IR == 1)

    割り込みのポーリングは、IRフラグを見れば良いです。

    ステータスレジスタではなく、割り込みフラグを見たい場面がある場合は使えるかとは思います。(ちょっと具体的な使用例が思い浮かびませんが)

    hal_entry.txt
    #include "hal_data.h"
    
    FSP_CPP_HEADER
    void R_BSP_WarmStart(bsp_warm_start_event_t event);
    FSP_CPP_FOOTER
    
    void sci_out(unsigned char c);
    void sci_out_str(char *c);
    
    /*******************************************************************************************************************//**
     * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
     * is called by main() when no RTOS is used.
     **********************************************************************************************************************/
    void hal_entry(void)
    {
        /* TODO: add your own code here */
    
        //SCI9ポート設定(TX:P109, RX:P110)
        R_PMISC->PWPR_b.B0WI = 0;
        R_PMISC->PWPR_b.PFSWE = 1;
    
        R_PFS->PORT[1].PIN[9].PmnPFS_b.PMR = 0;
        R_PFS->PORT[1].PIN[10].PmnPFS_b.PMR = 0;
    
        R_PFS->PORT[1].PIN[9].PmnPFS_b.PSEL = 0x5;
        R_PFS->PORT[1].PIN[10].PmnPFS_b.PSEL = 0x5;
    
        R_PFS->PORT[1].PIN[9].PmnPFS_b.PMR = 1;
        R_PFS->PORT[1].PIN[10].PmnPFS_b.PMR = 1;
    
        R_PMISC->PWPR_b.PFSWE = 0;
        R_PMISC->PWPR_b.B0WI = 1;
    
        //SCI9スタンバイ解除
        R_SYSTEM->PRCR = 0xA502;
        R_MSTP->MSTPCRB_b.MSTPB22 = 0;
        R_SYSTEM->PRCR = 0xA500;
    
        //SCI9初期設定
        R_SCI9->SMR = 0x00;
        R_SCI9->SCR = 0x00;
        R_SCI9->SEMR = 0x40;
        R_SCI9->BRR = 0x0C;         //115,200bps(err=0.16%) ABCS = 0、BDGM = 1;
    
        //SCI9_RXI 割り込みベクタ
        R_ICU->IELSR_b[4].IELS = 0x1E;
    
        //送信許可,受信許可,受信割り込み許可
        R_SCI9->SCR = 0x70;
    
        sci_out_str("\r\nSCI Receive polling test program\r\n");
    
        while (1)
        {
            if (R_ICU->IELSR_b[4].IR == 1)
            {
                //受信データあり
                R_ICU->IELSR_b[4].IR = 0;   //割り込みフラグクリア
                sci_out(R_SCI9->RDR);       //受信データはエコーバックさせる
            }
        }
    
    
    #if BSP_TZ_SECURE_BUILD
        /* Enter non-secure code */
        R_BSP_NonSecureEnter();
    #endif
    }
    
    /*******************************************************************************************************************//**
     * This function is called at various points during the startup process.  This implementation uses the event that is
     * called right before main() to set up the pins.
     *
     * @param[in]  event    Where at in the start up process the code is currently at
     **********************************************************************************************************************/
    void R_BSP_WarmStart(bsp_warm_start_event_t event)
    {
        if (BSP_WARM_START_RESET == event)
        {
    #if BSP_FEATURE_FLASH_LP_VERSION != 0
    
            /* Enable reading from data flash. */
            R_FACI_LP->DFLCTL = 1U;
    
            /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
             * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
    #endif
        }
    
        if (BSP_WARM_START_POST_C == event)
        {
            /* C runtime environment and system clocks are setup. */
    
            /* Configure pins. */
            R_IOPORT_Open (&g_ioport_ctrl, &IOPORT_CFG_NAME);
        }
    }
    
    #if BSP_TZ_SECURE_BUILD
    
    FSP_CPP_HEADER
    BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();
    
    /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
    BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
    {
    
    }
    FSP_CPP_FOOTER
    
    #endif
    
    void sci_out(unsigned char c)
    {
        R_SCI9->TDR = c;
        while ((R_SCI9->SSR & 0x04) != 0x04);
    }
    
    void sci_out_str(char *c)
    {
        while (*c != '\0')
        {
            sci_out((unsigned char)*c);
            c++;
        }
    }
    

Reply
  • 問題は解消している様ですので、蛇足となりますが、参考まで。

    元々、Masaさまが考えていたのは、下記の様な処理かと思いました。(全然違っていたらスミマセン)

    SCI9の受信(RXI割り込み)を割り込みフラグでポーリングするプログラムです。(受信した文字をそのままエコーバックで表示)

     R_ICU->IELSR_b[4].IELS = 0x1E;

    0x1Eは、SCI9_RXI(機能毎に割り振られた番号)です。

    4は普通のRAでは好きな番号に出来ますが、RA2L1の場合は機能毎に割り当てられる番号がグループ化されており、SCI9_RXI場合は4,12,20,28のいずれかである必要があります。

    if (R_ICU->IELSR_b[4].IR == 1)

    割り込みのポーリングは、IRフラグを見れば良いです。

    ステータスレジスタではなく、割り込みフラグを見たい場面がある場合は使えるかとは思います。(ちょっと具体的な使用例が思い浮かびませんが)

    hal_entry.txt
    #include "hal_data.h"
    
    FSP_CPP_HEADER
    void R_BSP_WarmStart(bsp_warm_start_event_t event);
    FSP_CPP_FOOTER
    
    void sci_out(unsigned char c);
    void sci_out_str(char *c);
    
    /*******************************************************************************************************************//**
     * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
     * is called by main() when no RTOS is used.
     **********************************************************************************************************************/
    void hal_entry(void)
    {
        /* TODO: add your own code here */
    
        //SCI9ポート設定(TX:P109, RX:P110)
        R_PMISC->PWPR_b.B0WI = 0;
        R_PMISC->PWPR_b.PFSWE = 1;
    
        R_PFS->PORT[1].PIN[9].PmnPFS_b.PMR = 0;
        R_PFS->PORT[1].PIN[10].PmnPFS_b.PMR = 0;
    
        R_PFS->PORT[1].PIN[9].PmnPFS_b.PSEL = 0x5;
        R_PFS->PORT[1].PIN[10].PmnPFS_b.PSEL = 0x5;
    
        R_PFS->PORT[1].PIN[9].PmnPFS_b.PMR = 1;
        R_PFS->PORT[1].PIN[10].PmnPFS_b.PMR = 1;
    
        R_PMISC->PWPR_b.PFSWE = 0;
        R_PMISC->PWPR_b.B0WI = 1;
    
        //SCI9スタンバイ解除
        R_SYSTEM->PRCR = 0xA502;
        R_MSTP->MSTPCRB_b.MSTPB22 = 0;
        R_SYSTEM->PRCR = 0xA500;
    
        //SCI9初期設定
        R_SCI9->SMR = 0x00;
        R_SCI9->SCR = 0x00;
        R_SCI9->SEMR = 0x40;
        R_SCI9->BRR = 0x0C;         //115,200bps(err=0.16%) ABCS = 0、BDGM = 1;
    
        //SCI9_RXI 割り込みベクタ
        R_ICU->IELSR_b[4].IELS = 0x1E;
    
        //送信許可,受信許可,受信割り込み許可
        R_SCI9->SCR = 0x70;
    
        sci_out_str("\r\nSCI Receive polling test program\r\n");
    
        while (1)
        {
            if (R_ICU->IELSR_b[4].IR == 1)
            {
                //受信データあり
                R_ICU->IELSR_b[4].IR = 0;   //割り込みフラグクリア
                sci_out(R_SCI9->RDR);       //受信データはエコーバックさせる
            }
        }
    
    
    #if BSP_TZ_SECURE_BUILD
        /* Enter non-secure code */
        R_BSP_NonSecureEnter();
    #endif
    }
    
    /*******************************************************************************************************************//**
     * This function is called at various points during the startup process.  This implementation uses the event that is
     * called right before main() to set up the pins.
     *
     * @param[in]  event    Where at in the start up process the code is currently at
     **********************************************************************************************************************/
    void R_BSP_WarmStart(bsp_warm_start_event_t event)
    {
        if (BSP_WARM_START_RESET == event)
        {
    #if BSP_FEATURE_FLASH_LP_VERSION != 0
    
            /* Enable reading from data flash. */
            R_FACI_LP->DFLCTL = 1U;
    
            /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
             * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
    #endif
        }
    
        if (BSP_WARM_START_POST_C == event)
        {
            /* C runtime environment and system clocks are setup. */
    
            /* Configure pins. */
            R_IOPORT_Open (&g_ioport_ctrl, &IOPORT_CFG_NAME);
        }
    }
    
    #if BSP_TZ_SECURE_BUILD
    
    FSP_CPP_HEADER
    BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();
    
    /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
    BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
    {
    
    }
    FSP_CPP_FOOTER
    
    #endif
    
    void sci_out(unsigned char c)
    {
        R_SCI9->TDR = c;
        while ((R_SCI9->SSR & 0x04) != 0x04);
    }
    
    void sci_out_str(char *c)
    {
        while (*c != '\0')
        {
            sci_out((unsigned char)*c);
            c++;
        }
    }
    

Children
  • Former Member
    Former Member in reply to tf

    tf様

    おはようございます。

    レス遅くなり申し訳ありません。

    IRフラグのポーリングでも可能の件、了解しました。

    自分はSCI0を使用していますので、

    if( R_ICU->IELSR_b[9].IR == 1 )

    で試してみます。

    ありがとうございました。