V850E2/FK4でUARTドライバ

お世話になります。

表題のとおり、V850E2/FK4を利用して調歩同期通信(UART)ドライバを作成していますが、うまく動作せず、皆様のご意見をいただければと思い、投稿させていただきます。
ソースは→におきました。 https://gitlab.com/snippets/1661521

# 簡単な経緯

既存のプロジェクトで使っていた基板を流用して性能テストをやろうという話になり、テストのためには対話的なインターフェースが欲しいね、ということでUARTを載せることになりました。

# 設計方針

V850E2/FK4の場合、RenesasのホームページにUARTのサンプルコードが存在せず、ハードウェアマニュアルを見ながら作成しました。
UARTはUARTEのみで、LINコントローラと結合しているようで非常に分かりづらかったのですが、なるべくLINに触らないようにと思い、LINコントローラでいうUARTスルーモードとして設定することにしています。

# 現状の動作

既存プロジェクトに添付のコードを入れて動作させましたが、d_uart_putcで出力すると最初の一文字だけ出力され、以降出力されない状況です。
期待する動作としては、d_uart_putcの実行時に送信割り込み(URTE11TIT)が発生するつもりだったのですが、割り込み関数でブレークを張ってもここには到達しない状況です。
当然ながら、d_uart_getcで入力待ちしても、同様に割り込みが発生しないため受信は一切動作していません。
PCから入力して、マイコンの足まで波形が届くか等、ハードウェア的な動作は確認できています。

また、d_uart_putcを実行するコードを追加すると、途中で実行に失敗(?)して以降正常な動作ができない状況に陥っているようです。
(デバッガで停止すると、逆アセンブルコードの無いアドレスを実行している。。

一文字とはいえ出力はできているので、設定はできていると思いますが、割り込みの設定の仕方に問題があるような気がしています。
うまく動作しないのは、存在しない割り込みが発生しているためではないか、、等と考えて調査中です。

ご意見等いただけましたら幸いです。

Parents
  • 直接の原因かは分かりませんがとりあえず

    /*******************************************************************************/
    /** @brief      UARTE11送信割り込み
     *
     *  @par            Refer
     *  -  参照するグローバル変数 g_urte11_txflg
     */
    /*******************************************************************************/
    #pragma interrupt INTLMA11IT interrupt_uart11_tx
    void interrupt_uarte11_tx(void){
        RFLMA11IT = 0;
        g_urte11_txflg = 1;
    }
    /*******************************************************************************/
    /** @brief      UARTE11受信割り込み
     *
     *  @par            Refer
     *  -  参照するグローバル変数 g_urte11_rxflg
     */
    /*******************************************************************************/
    #pragma interrupt INTLMA11IR interrupt_uart11_rx
    void interrupt_uarte11_rx(void){
        RFLMA11IR = 0;
        if(RING_BUF_get_writable_size(&uarte11_rxbuf)>0){
            RING_BUF_put(&uarte11_rxbuf, (const char*)&URTE11RX, 1);
        }
    }
    /*******************************************************************************/
    /** @brief      UARTE11エラー割り込み
     *
     */
    /*******************************************************************************/
    #pragma interrupt INTLMA11IS interrupt_uart11_error
    void interrupt_uarte11_error(void){
        RFLMA11IS = 0;
        d_uart_terminate();
        return;
    }
    

    #pragma で指定している割り込み関数と関数の名前が対応していないですね。

Reply
  • 直接の原因かは分かりませんがとりあえず

    /*******************************************************************************/
    /** @brief      UARTE11送信割り込み
     *
     *  @par            Refer
     *  -  参照するグローバル変数 g_urte11_txflg
     */
    /*******************************************************************************/
    #pragma interrupt INTLMA11IT interrupt_uart11_tx
    void interrupt_uarte11_tx(void){
        RFLMA11IT = 0;
        g_urte11_txflg = 1;
    }
    /*******************************************************************************/
    /** @brief      UARTE11受信割り込み
     *
     *  @par            Refer
     *  -  参照するグローバル変数 g_urte11_rxflg
     */
    /*******************************************************************************/
    #pragma interrupt INTLMA11IR interrupt_uart11_rx
    void interrupt_uarte11_rx(void){
        RFLMA11IR = 0;
        if(RING_BUF_get_writable_size(&uarte11_rxbuf)>0){
            RING_BUF_put(&uarte11_rxbuf, (const char*)&URTE11RX, 1);
        }
    }
    /*******************************************************************************/
    /** @brief      UARTE11エラー割り込み
     *
     */
    /*******************************************************************************/
    #pragma interrupt INTLMA11IS interrupt_uart11_error
    void interrupt_uarte11_error(void){
        RFLMA11IS = 0;
        d_uart_terminate();
        return;
    }
    

    #pragma で指定している割り込み関数と関数の名前が対応していないですね。

Children
  • fujita様

    ご回答ありがとうございます。
    初歩的なミスで申し訳ありませんでした。
    なぜ気がつかなかったのか。。

    ご指摘を修正したところ、一通り動作するようになりました。
    ありがとうございました。
  • おはようございます。NAKAといいます。

    整理のため少し確認させてください。

    fujita nozomu先生が uart11_ と uarte11_ が違ってますと指摘されて、添付されたソースは既に修正済なんですよね?僕も何年か前にV850E2を使いましたが、設定箇所が少なくてその後に使ったRL78よりずいぶん簡単に使えるなぁとう印象でした。ちょっとだけつまずいたのは受信側にデフォルトでフィルタが入っていて、フィルタを無効化しないと受信できない部分でした。
    ⇒FCLA27CTL0 = 0x80; // URTE2のRX端子のフィルタ回路をバイパスする

    こんな感じで作りました。
    //*******************************************************************************
    // 割り込みベクタ
    //*******************************************************************************
    extern void SCI2_TX_INT();// SCI2 送信割込み
    extern void SCI2_RX_INT();// SCI2 受信割込み

    #pragma interrupt INTLMA2IT UARTE2_TX_INT // INTUAE2TIT = INTLMA2IT? UARTE2 送信割り込み処理
    #pragma interrupt INTLMA2IR UARTE2_RX_INT // INTUAE2TIR = INTLMA2IR? UARTE2 受信割り込み処理
    #pragma interrupt INTLMA2IS UARTE2_ST_INT // INTUAE2TIS = INTLMA2IS? UARTE2 エラー割り込み処理

    void UARTE2_TX_INT( void )
    {
    SCI2_TX_INT(); // 送信完了割り込み関数
    }

    void UARTE2_RX_INT( void )
    {
    SCI2_RX_INT(); // 受信割り込み関数
    }

    /*******************************************************************************
    // 関数名 : fn_Init_Port(void)
    // 動作 : ポートの初期化
    // 引数 :
    // 作成 : NAKA 14.03.18~
    // ****************************************************************************/
    void fn_Init_Port(void)
    {
    // P4_0 - P4_10設定
    // all :PORT出力(Lo)
    P4 = 0x0000; //all:Lレベル出力
    PIBC4 = 0x0000; //all:入力バッファ禁止
    PBDC4 = 0x0000; //all:双方向モード禁止(初期値)
    PU4 = 0x0000; //all:内蔵プルアップ抵抗と接続しない(初期値)
    PD4 = 0x0000; //all:内蔵プルダウン抵抗と接続しない(初期値)
    PIS4 = 0x0000; //all:入力バッファ特性をタイプ1COMSに指定(初期値)
    PISE4 = 0x0000; /* all:入力バッファ特性をタイプ1COMSに指定(初期値)
    //この順番推奨!  UM-P127に記載
    PFC4 = 0x0006; //P4-1.P4-2 兼用モード(URTE2) other-PORT
    PFCE4 = 0x0006; //P4-1.P4-2 兼用モード(URTE2) other-PORT
    PIPC4 = 0x0000; //all:入出力モードはPMにより行う
    PMC4 = 0x0006; //P4-1.P4-2 兼用モード(URTE2) other-PORT
    PM4 = 0x0002; //P4-1:IN P4-2:OUT other-PORT

    // URTE2 使用時の設定 // UM-P113に記載あり "必須!!!"
    FCLA27CTL0 = 0x80; // URTE2のRX端子のフィルタ回路をバイパスする
    }

    /*******************************************************************************
    // 関数名 : fn_Init_URTE2(void)
    // 動作 : URTE2の初期化
    // 引数 :
    // 作成 : NAKA 14.03.21
    // 備考 :
    // ****************************************************************************/
    void fn_Init_URTE2(void)
    {

    URTE2CTL0 = 0x80;

    //ボーレート設定
    URTE2CTL2 = 0x0187; //URTE2PRS:0x0:PCLK/1=30MHz
    //URTE2BRS:0x30D:30MHz/(2*38400)bps≒390.625≒0x187
    // 115200:0x082(1.6%)
    //* 38400:0x187(0.9%)
    // 9600:0x61B(0.3%)
    //フォーマット設定
    URTE2CTL1 = 0x0103; //URTE2CLG:1:8ビット長
    //URTE2SLP:00:パリティ無し
    //URTE2SLG:0:1ストップビット
    //URTE2SLD:1:LSBファースト
    //URTE2SLIT:1:送信完了時に割り込み要求
    //動作設定
    URTE2CTL0 = 0xE0; //URTE2PW:1:UARTE2の動作許可
    //URTE2TXE:1:送信動作許可
    //URTE2RXE:1:受信動作許可
    //URTE2SLDC:0:データ一貫性チェック無効

    //UARTE2=LMA2送信割込み許可、ICLMA2IT
    ICLMA2IT = 0x0003; //EIMK_0 = 0:割込み処理を許可(IMR1EIMK91 = 0;)
    //EIP2-1 = 010:プライオリティ設定(000:MAX 111:MIN)
    //UARTE2=LMA2受信割込み許可、ICLMA2IT
    ICLMA2IR = 0x0003; //EIMK_0 = 0:割込み処理を許可(IMR1EIMK90 = 0;)
    //EIP2-1 = 010:プライオリティ設定(000:MAX 111:MIN)
    //UARTE2=LMA2エラー割込み許可、ICLMA2IT
    ICLMA2IS = 0x0003; //EIMK_0 = 0:割込み処理を許可(IMR1EIMK90 = 0;)
    //EIP2-1 = 010:プライオリティ設定(000:MAX 111:MIN)

    }

    /*******************************************************************************
    // 関数名 : SCI2_TX_INT(void)
    // 動作 : URTE2送信完了割込み
    // 備考 :
    // 作成 : NAKA 14.03.21
    // ****************************************************************************/
    void SCI2_TX_INT(void)
    {
    if(SCI2_Tx_WP != SCI2_Tx_RP) //データ溜まってなかったら
    {
    URTE2TX = SCI2_TxBuf[SCI2_Tx_RP++]; // 送信レジスタにセット
    SCI2_Tx_RP %= SCI2_TxBuf_SIZE; // 残りデータ計算
    }
    }

    P.S.
    ちょっと心配なことがあります。置かれているソースにあまり出さない方が良い情報があるような気がします。
    とりこし苦労なら良いのですが..........(実はここが一番お伝えしたかった事です。)
  • NAKA様

    返答に対して時間が空いて申し訳ありません。

    公開したコードは開発品に使っているコードではなく、一応許可はもらっていたのですが、そういった心配をおかけする可能性もあるので一応Copyright等削除しました。

    ただ、同じような問題にあたった方のために別途公開しておきます。
    gitlab.com/.../1667508

    ご指摘いただきありがとうございます。