お世話になります。
表題のとおり、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を実行するコードを追加すると、途中で実行に失敗(?)して以降正常な動作ができない状況に陥っているようです。(デバッガで停止すると、逆アセンブルコードの無いアドレスを実行している。。
一文字とはいえ出力はできているので、設定はできていると思いますが、割り込みの設定の仕方に問題があるような気がしています。うまく動作しないのは、存在しない割り込みが発生しているためではないか、、等と考えて調査中です。
ご意見等いただけましたら幸いです。
直接の原因かは分かりませんがとりあえず
/*******************************************************************************/ /** @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 で指定している割り込み関数と関数の名前が対応していないですね。