RTOS: UART

 ペリフェラルとしてUARTを理解する。 XDS110越しにPCと通信をする。

ここまで作ったプロジェクトをコピーし追記してゆく。

syscfgファイルを開く

TI DRIVERSの欄からUARTのプラスを押す。
Name:CONFIG_UART_0
Use Hardware : XDS110 UART
Data Direction: Send and Receive
Ring Buffer size 32
Interrupt Priority : 7
編集したら保存する。

各スレッドを記述しているcファイルを次に編集していく。
まず、ヘッダーファイル、デフォルトでコメントアウトしてるのではずすか、または#include <ti/drivers/UART.h>をつけ足す。

/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/UART.h>

スレッドとして以下を作る。
void *mainThread3(void *arg0)
{
    char        input;
    const char  echoPrompt[] = "Echoing:\n";
    UART_Handle uart;
    UART_Params uartParams;

      UART_init();

      /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode =UART_RETURN_NEWLINE; //UART_RETURN_NEWLINE;//UART_RETURN_FULL;
    uartParams.baudRate = 115200;

    /* OPEN UART */
    uart = UART_open(CONFIG_UART_0, &uartParams);
    UART_write(uart, echoPrompt, sizeof(echoPrompt));

    /* Loop forever echoing */
    while (1) {
        UART_read(uart, &input, 1);
        UART_write(uart, &input,1);

    }//end while
}
これも追記が完了した保存をする。

cfgファイルをひらいて、上記スレッドを登録する。
File-Saveで保存をする。
ビルトしてフラッシュする前に、設定をかえる。 XDS110越しにPCと通信をするが、
デバッグに入ったらすぐに110と接続を先にするように設定する。しないと”Target must be connected before loading program..."というメッセージのエラーがでる。
デバッグのましのマークの横の三角をクリックしてDebug Configrationsを選択する。
TargetのタブのしたにAuto Run and Lauch Option があるので、そのConnecto to the target on degugger set upにチェックをいれる。
ビルトしてフラッシュしてみる。


無事に動いているとPC側のシリアルモニター(ここではArduinoIDEのシリアルモニターを使ったがKtermとかで)
Enchoingの文字が出て、入力した文字がそのままエコーバックして表示される。

解説をする。
    char        input;
UARTは1文字づつ処理される。1文字だけを格納するcharをinputという名前で用意。
    UART_Handle uart;
    UART_Params uartParams;
で以下でUARTを使う際のハンドル名を定義、また各種のパラメーターを設定する構造体UART_Paramsとして、uartParamsを定義
      UART_init();

これはUARTを使う時はおまじないでこれを呼ぶ事で初期化がはいる。
 UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode =UART_RETURN_NEWLINE; //UART_RETURN_NEWLINE;//UART_RETURN_FULL;
    uartParams.baudRate = 115200;
の部分でパラメーターを設定する。基本的にはこのまででボーレートの変更ぐらいで問題はない。
    uart = UART_open(CONFIG_UART_0, &uartParams);
で上で定義したハンドル名で、UARTを開く。引数の部分は、syscfgで設定時に設定した名前を与える事でどのピンをUARTとするかを与えて、uartParamsの部分はアドレスの先頭を与える事でパラメーターを引き渡す。
UART_write(uart, echoPrompt, sizeof(echoPrompt));
で文字数分を書き込むことになる。
        UART_read(uart, &input, 1);
        UART_write(uart, &input,1);
の部分は解説はいらないと思うが、1文字読んでinputへ格納して、すぐに同じ文字をPCにエコーバックしている部分になる。
なので1文字タイプするごとのいこのスレッドが呼び出されて1文字

という具合で流れとしては、ハンドル名を決めて、パラメーター構造体の名前を決めて
パラーメータを設定しハンドル名で開いてあげるという感じ

これらをコードを改変していく。今度は1文字ではなくて、文字列の命令でLEDをつけたりけっしたりすることをめざす。
#include <string.h>
をまず冒頭に付け足す。文字列の比較strcmpやmemcpy(配列のコピー)を使うのでインクルードしておく。
スレッドを以下のように追記を行う。
void *mainThread3(void *arg0)
{
    char        input;
    const char  echoPrompt[] = "Echoing:\n";
    UART_Handle uart;
    UART_Params uartParams;

    GPIO_init();
    UART_init();

      /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode =UART_RETURN_NEWLINE; //UART_RETURN_NEWLINE;//UART_RETURN_FULL;
    uartParams.baudRate = 115200;

    /* OPEN UART */
    uart = UART_open(CONFIG_UART_0, &uartParams);

    UART_write(uart, echoPrompt, sizeof(echoPrompt));

    /* UART_RX variable */
     char UART_RX_buffer[32];
     char UART_RX_buffer_temp[32];
     uint8_t UART_RX_buffer_index=0;

    /* Loop forever echoing */
    while (1) {
        UART_read(uart, &input, 1);
        UART_write(uart, &input,1);

        UART_RX_buffer_temp[UART_RX_buffer_index]=input;
                memcpy (UART_RX_buffer, UART_RX_buffer_temp, sizeof(UART_RX_buffer_temp));
                if (input==0x0a){//renew buffer
                            memset(UART_RX_buffer_temp, 0x00, sizeof(UART_RX_buffer_temp));
                            UART_RX_buffer_index=0;
                            }
                        else{
                        UART_RX_buffer_index=UART_RX_buffer_index+1;
                        }

                char CMD1[] = "ON\n";
                char CMD2[] = "OFF\n";

                if (strcmp((const char *)UART_RX_buffer, CMD1) == 0)
                {
                    GPIO_write(CONFIG_GPIO_LED_2, CONFIG_GPIO_LED_ON);
                }
                else if  (strcmp((const char *)UART_RX_buffer, CMD2) == 0)
                {
                    GPIO_write(CONFIG_GPIO_LED_2, CONFIG_GPIO_LED_OFF);
                }

            }//end while
}

解説しておくと、0x0a改行が入ってくるまでbuffer_tempの配列に一文字づつ格納しindexをあげて格納先をひとつづらしていく。0x0aが入ってきたら、そこまでをRX_bufferにコピー。RX_bufferがあらかじめ登録しているCMD:コマンドと一致したらコマンドの内容を十実行する。ONならLEDをつけるし、OFFなら消す。


これで先ほどはスイッチでLEDをつけてけしてとしたが、PCからのコマンドでON、OFFする事ができた。




コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法