mbed NXP LPC1768

(Off site developmet w/ FreeRTOS)

IMAGE11.GIF - 980BYTES  概要
IMAGE11.GIF - 980BYTES   ハードウェア
IMAGE11.GIF - 980BYTES  ソフトウェア 
IMAGE11.GIF - 980BYTES  ソフトウェアソースコード
IMAGE11.GIF - 980BYTES  参考文献
IMAGE12.GIF - 2,801BYTES

変更履歴
2010年3月14日 新規作成
2010年3月21日 ソフトウェア部分追加

2010年9月11日 新ページに移行
LPC1768に関係する内容は
再構築してこちらにまとめました



変更履歴
2010年3月14日 新規作成
2010年3月21日 ソフトウェア部分追加

mbed上でFreeRTOSを動作させて、ネットワーク接続と
テキスト表示LCD(40文字x2行)を動作させた

















LPC1768 ----- 概要
IMAGE12.GIF - 2,801BYTES
TOP02_001.PNG - 934BYTES

PICのデータロガーではFreeRTOSを使っていたので、LPC1768の開発でも同じ環境を作れないか検討してみました。
mbedのホームページでFreeRTOSの検索をすると、早速Forumの一つにこの話題が取り上げられていました。
Andy C氏によってFreeRTOSをオフラインでコンパイル後に動作させる方法が、このスレッドで記述されています。

そこで、下記のトライアルを試みました。
















LPC1768 ----- ハードウェア
IMAGE12.GIF - 2,801BYTES
TOP02_001.PNG - 934BYTES

mbedのコネクタ40ピンには、当面このようにIOを配置することに決めました。

(1) LCDテキスト表示
ジャンク品で確かな仕様は不明ですが、日立製HD44780コンパチの入出力で接続して動作しています。
制御信号は、E、R/WそしてRSで、データは、DB7からDB4までの4本で接続しています。

(2) Ethernet接続
秋月で購入したパルストランス内蔵のコネクタ(RJ-45)を使用しました。
接続は、当初苦労したのですが何とか上手く接続出来ました。


(3) SDカード接続
これも以前、秋月で購入していた、SDカードを使用しました。


























LPC1768 ----- ソフトウェア
IMAGE12.GIF - 2,801BYTES
TOP02_001.PNG - 934BYTES

ソフトウェアに関して、下記をまとめました。





<Cortex-M3開発環境の構築>

Eclipseを用いた開発環境の構築を、ZUS氏のこのサイトで勉強させていただきました。
ARM Cortex-M3 開発環境構築方法;//2009.08.12変更

ZUS氏の記述は詳細に亘り、丁寧に説明されていますので問題ないと思いますが、2009年8月時点と比較するといくつかの変更点があります。ZUS氏のサイトと合わせて下記を参照ください。

1) ARM(gcc)がVersion-Upされていて、[Sourcery G++ Lite 2009q3-68 for ARM EABI]となっています。
2) Eclipse IDE for C/C++ DevelopppersもVersion-Upされています。ファイルは[eclipse-cpp-galileo-SR2-win32.zip]となっています。
   ZUS氏のサイトでは、GanymedeでしたがGalileoに代わっています。Ganymedeもここからダウンロード出来るようですが、私はGalileoを使用しました。
3) Zylin Embedded CDT(Plug-in for Eclipse)のプラグインが少し厄介で、ZUS氏のやり方とGalileoを使用すると違います。Eclipseで下記の操作で可能です。


尚、JTAG等の処理は今回未実施です。mbedのオンラインで作成したバイナリーファイルと同様に、オフラインで作成したバイナリーファイルをUSB経由でボード上のメモリーにコピーすれば、動作させることができます。




<FreeRTOSのインプリメント>

前述したように、Andy C氏によってFreeRTOSをオフラインでコンパイルして動作させる方法が、このスレッドで記述されており、その内容に従ってインプリメントしました。
先ず、FreeRTOSの入手ですが、最新版(2010/3/19現在)はV6.0.4ですが、私はV6.0.3を使用しました。
ディレクトリを含め、このリストにあるファイルを使用しました。色を付けていないファイルはオリジナルのまま使用しています(但し、USB機能は未確認です)。

main.c、LPCUSB、webseverなどは、下記のディレクトリから持ってきています。
..\FreeRTOS\Demo\CORTEX_LPC1768_GCC_RedSuite\src

Makefile/makedefsは、下記からコピーしてきます。
..\FreeRTOS\Demo\CORTEX_LM3S811_GCC

LCD制御(portlcd.c & portlcd.h)は、LPC2368のDEMOからの流用です。但し、IOポートの記述等を大幅に修正する必要があります。
..\FreeRTOS\Demo\ARM7_LPC2368_Eclipse\RTOSDemo\LCD

Eclipse上での展開は下記のようになります(クリックで拡大)。

LCD関係を除けば、Includeファイルのディレクトリー部分の変更等で内容を大幅に変更しなくてもエラーメッセージ解決だけで、動作が始まります。






<FreeRTOSの動作状況確認>

LCD表示を中心にタスクがちゃんと動作しているかチェックしてみました。
下記がロジアナを使って確認したLCD表示タスクによるLCD制御ラインの波形です。


上記の計測で、起動周期が999.9893mSということで、ほぼ1秒毎の起動が保たれています。
タスクの起動は下記のようになっています。

void vTask2 ( void *pvParameters ){
                   portTickType xLastCheckTime2;
                   portTickType xDelayTime2;
                   unsigned int i;
                   unsigned char bf[50];

                   i = 0;
                   vTaskDelay( 100 / portTICK_RATE_MS );                                      // Wait 0.1sec
                   LCD_init();                                                                                           // Initialize LCD
                   LCD_cur_off();
       LCD_cls();
       LCD_gotoxy( 1, 1 );
                   //        0        1         2         3         4
                   //        1234567890123456789012345678901234567890
                   LCD_puts(" This is a test program for FreeRTOS  ");
                   LCD_gotoxy( 1, 2 );
                   //        0        1         2         3         4
                   //        1234567890123456789012345678901234567890
                   LCD_puts("  by K.Arai/JH1PJL on March 14th,'10 ");
                   xDelayTime2 = 1000 / portTICK_RATE_MS;                               // 1 sec interval
                   xLastCheckTime2 = xTaskGetTickCount();
                   vTaskDelay( 2000 / portTICK_RATE_MS );                                 // Wait 2sec
        LCD_cls();
                  while(1){
                                     i += 1;
                           LCD_gotoxy( 1, 1 );
                                     //            0        1         2         3         4
                                     //            1234567890123456789012345678901234567890
                                     sprintf( bf, " LastCheckTime;    %d                  ", xLastCheckTime2 );
                                     LCD_puts(bf);
                                     LCD_gotoxy( 1, 2 );
                                     //            0        1         2         3         4
                                     //            1234567890123456789012345678901234567890
                                     sprintf( bf, "     Past Time;    %d seconds          ", i );
                                     LCD_puts(bf);
                                     vTaskDelayUntil( &xLastCheckTime2, xDelayTime2 );
                                     vParTestToggleLED( LED2 );
                   }
}

ロジアナ解析データから、一行の文字表示に約150mSかかっていることが判ります。
当初、Eクロック発生毎にDelay関数を呼び出していた為に2行40文字表示に1秒近くかかっていました。
それはそれで良いのですが、スピードアップのために細工をしました。
それは、Eクロック発生時に毎回FreeRTOSを介するのではなく、ループのDelayで約3μSの波形を作りました。
CPUの占有率が、IDLE状態として25%ありますので現状ではこれで良いですが、本来は表示時間がかかってもCPUの占有率を下げるためにはループ方法はよい方法とはいえません。
この辺りは、全体システムを構築した際のバランスを見てから決めるべきでしょう。

void Delay_E ( void ){
                   unsigned int i,j;

                   for ( i=0; i < 50 ; i++ ){
                                     j = GPIO0->FIOPIN;    // dummy read
                   }
}

void LCD_puts(char *sp){
                   char c;

                   /* Write data to LCD controller. */
                   lcd_wait_busy();
                   //FIO1DIR |= LCD_DATA | LCD_CTRL;
                   GPIO0->FIODIR  |= lcd_CTL_BITS;                                 // Control signal p0.x
                   GPIO2->FIODIR  |= lcd_DAT_BITS | LCD_RS;               // Data line p2.x + RS
                   //FIO1SET = LCD_RS;
                   GPIO2->FIOSET = LCD_RS;
                   GPIO0->FIOCLR = LCD_RW;
                   while (*sp)   {
                                     c = *sp++;
                                     GPIO2->FIOCLR = lcd_DAT_BITS;
                                     GPIO2->FIOSET = ((c >> 4) & 0x0f);
                                     GPIO0->FIOSET = LCD_E;
                                     //vTaskDelay(0);
                                     Delay_E();
                                     GPIO0->FIOCLR = LCD_E;
                                     //vTaskDelay(0);
                                     Delay_E();
                                     GPIO2->FIOCLR = lcd_DAT_BITS;
                                     GPIO2->FIOSET = (c & 0x0f);
                                     GPIO0->FIOSET = LCD_E;
                                     //vTaskDelay(0);
                                     Delay_E();
                                     GPIO0->FIOCLR = LCD_E;
                                     vTaskDelay(0);
                   }
                   return;
}










LPC1768 ----- ソフトウェアダウンロード
IMAGE12.GIF - 2,801BYTES
TOP02_001.PNG - 934BYTES






















LPC1768 -----  参考文献
IMAGE12.GIF - 2,801BYTES
TOP02_001.PNG - 934BYTES










































download.html