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する事ができた。
コメント
コメントを投稿