こんにちは、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」を使用した例を検索してみましたが、見つけられませんでした。
サンプルプログラムや記述方法についてご存じの方がいらっしゃいましたら、教えていただけますと助かります。
宜しくお願い致します。
わわいです
そこに書かれているポーリングというのは、あくまでも割り込みコントローラが割り込みを認識するときの手順を説明するもの、であって、ソフトウエアポーリングするためのもんではありません。
割り込みが使えない、というのであれば、わざわざ割り込みコントローラを介するのではなく、SCIデバイスの受信ステータス、送信ステータスをポーリングしましょう
わわい様
おはようございます、Masaです。
ご教示ありがとうございます。「割り込み要求のポーリングをする手順を…」の記載を見て、
・割り込みのポーリングができる・1~4の手順以外では実現できない
と判断してしまい、悩んでしまった次第です。わわい様がおっしゃられます通り、SCIのステータスを見て実現するコーディングも進めていましたので、そちらが正解と言うことで安心しました。大変助かりました。ありがとうございました。
問題は解消している様ですので、蛇足となりますが、参考まで。
元々、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フラグを見れば良いです。
ステータスレジスタではなく、割り込みフラグを見たい場面がある場合は使えるかとは思います。(ちょっと具体的な使用例が思い浮かびませんが)
#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++; } }
tf様
おはようございます。
レス遅くなり申し訳ありません。
IRフラグのポーリングでも可能の件、了解しました。
自分はSCI0を使用していますので、
if( R_ICU->IELSR_b[9].IR == 1 )
で試してみます。
ありがとうございました。