2009年5月1日金曜日

悪戦苦闘 LPC2388

このベースボード等の情報は次。
http://www.ac.auone-net.jp/~w-cloud/Index.htm



CQ出版 Interface 2009/5 付録のARM(LPC2388)基板を試しています。

備忘録的に記します。

開発環境 GNU
gcc 4.3.0 newlib 1.17.0 binutils 2.19.1 mpfr 2.4.1 gmp 4.2.4
開発UI Cygwin   GNU bash, version 3.2.48(21)-release (i686-pc-cygwin)

過去のV850で試したプログラムが100KByte超えのため、IAR Embededd Workbenchの利用は見送りました。

0.フェーズ0.(準備)
  付録基板の部品組み付け。

  [ドジ]
    CN5,CN6,CN7のUSBのコネクタを間違えて裏面に装着。CN5のみ表に付け替え。
一旦取り付けたコネクタを外すのはなかなか困難。

  [不具合]
   1) FlashMagicによる、書き込み失敗。
    ・Interface誌サイトからダウンロードしたサンプルプログラム(gcc版)をLPC2388
     に書き込む。
    ・このサンプルプログラムを再コンパイルし、LPC2388(No.1基板)に書き込む。
            書き込み不能になる。
   2) 対処
    ・LPC2388のダウンローダーがつぶれたと思い、I誌2冊目を購入(No.2基板)
    ・前述、再コンパイルのプログラムをNo.2基板に書き込む。
    ・再度、No.2基板に書き込む。
            書き込み不能になる。
      <ほとんど諦め気分>
    ・数日後 再挑戦、なぜか、No.2基板に書き込む。
            書き込み成功。
    ・あれやこれやと試す。 再び書き込み不能に。。。。
    ・基板JP2のコネクタを抑えながら(奥に・手前に)押しながらリセットボタン(JP1)
を押し、FlashMagicによる書き込みを試行。
           書き込み成功。
      結局のところ、JP2のピンヘッダーの半田付け不良が原因。
      基板No.1、No.2とも半田付けをやり直し。で解決。

      CN1,CN2,,等の他のコネクタの半田付け不良は今のところありません。
      2つの基板で両方ともJP2の半田付けに ミス るとは、。。。(無念)

1.フェーズ1.GPIOテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8
  TIMER: TIMER_0
 
各GPIOににLEDを接続し(GPIO_1 Pin_18は基板LED1) TIMER_0 の インターバル割り込みでLEDを点滅。

 [Tech.Memo ]
  1)TIMER割り込みについて。    
    IRQ割り込みを使用、無条件でTIMER_0の割り込みとして利用
  2)LEDについて。
    +3.3V --(R200Ω)-- LED -- GPIO_n Pin_n で接続 GPIO Lowレベルで LED点灯   
  
2.フェーズ2 TIMERテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8
  TIMER: TIMER_0 TIMER_1 TIMER_2 TIMER_3

 TIMER_0 で GPIO_0 Pin_27 (LED0)、TIMER_1 で GPIO_1 Pin_19 (LED2)、TIMER_2 で GPIO_1 Pin_22 (LED3)、TIMER_3 で GPIO_2 Pin_19 (LED4)のLEDを点滅。
 [Tech.Memo]
   1)TIMER割り込みについて。
       IRQ割り込みを使用、レジスタ VICIRQStatus で TIMER_0~3の割り込みを判断
      する。
      ex. TIMER_0の割り込みはVICIRQStatusと ((u32)0x00000010)でANDをとり、割り込
        みの有無を判定。
   2)TIMER_2,3の利用について。
     パワーコントロールレジスタ(PCONP)の設定が必要。
 [不具合]
   1)現象 複数のタイマーを稼動させると一定時間で LPC2388はハングする。
     タイマーインターバルに比例して停止までの時間は変化、インターバルの組み合わせでも変化
     する。
   2)対処 ・・未解決
     VICVectAddr4 VICVectPriority4(TIMER_0の場合)を適当に設定するが改善せず。
     そもそもこれらのレジスタの使い方、割り込み(IRQ)理解度が不足。

3.フェーズ3 KeyInテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8 (LED用)
      GPIO_0 Pin_0 Pin_1 Pin_10 Pin_11 Pin_17  (Key入力用)
  TIMER: TIMER_0(Heat Beet用)  TIMER_3(Key Scan用)

 GPIO_0 Pin_0...に接続した、タクトスイッチのON/OFFをTIMER_3のインターバルでチェックし、押されたスイッチにより、各LEDの点灯を切り替える。
 
 [Tech.Memo]
   1)キー入力について。
    GPIO_0 Pin_0,1,,,には、3.3V(100KΩ+1KΩ)で接続、スイッチONでGRND(1KΩ)に接続。  
 [不具合]
   1)現象 2.フェーズ2と同様に一定時間後、LPC2388はハングする。
   2)対処 未解決
    (6/25)解決 割り込み時にVICVectAddrにセットされるアドレスを使って割り込みハンドラー関数を起動させることで解決。

 [不具合2]
   1)FlashMagic書き込みエラー発生。
    「Error Programing the Hex file RAM locations 0x40000120 to 0x400001FF are...」
   2)対処
    リンクスクリプトファイルの「.data 0x40000000: {」を「.data 0x40000200: {」に変更


4.フェーズ4 LCDテスト
  GPIO: GPIO_0 Pin_27 GPIO_1 Pin_18,19,22  GPIO_2 Pin_8 (LED用)
      GPIO_0 Pin_0 Pin_1 Pin_10 Pin_11 Pin_17  (Key入力用)
      GPIO_2 Pin_0,1,2,3,4,5,6,7 GPIO_4 Pin_24,25,28,29,30,31  (LCD用)
  TIMER: TIMER_0(Heat Beet用) TIMER_1(LCDリフレッシュ用) TIMER_3(Key Scan用)

 グラフィカルLCD SG12864 に キー操作にあわせ文字列を表示する。
 [不具合]
   1)現象 2.フェーズ2と同様に一定時間後、LPC2388はハングする。
   2)対処 未解決
      使用タイマをTIMER_0のみに変更  タイマカウンタ数で各機能を振り分け。
    (6/25)解決 前述

5.フェーズ5 LCDグラフィカルテスト。
 LCDにチャートを描画する。グリッドと、グラフ(サンプルデータによる。)の描画。
 [不具合]
   1)現象 描画位置決めの、座標計算(float)でハングする。
   2)対処 未解決。
   (7/9)解決 GCCのインストールのやり直し、インストールのオプション指定を変更。
[不具合]
   1)現象 基板のUSBケーブルを一旦外すと、次のプログラム起動でハングする。
         (電源OFFで書き込まれたプログラムの一部が消えた。。と考え勝ちな現象)  
   2)対処 リンクスクリプトファイルを変更するが変わらず。 未解決。
    解決(6/24)の 3.リンクスクリプトファイル         
6.フェーズ6 UARTテスト。
  UART: UART1
 PC Windows/アクセサリ/通信/ハイパーターミナル でCOM1接続 ハイパーターミナル キー入力を基板側LCD表示、基板側スイッチ操作で文字列をUART出力、ハイパーターミナルで表示。

 [Tech.Memo]
   1)RS232CドライバIC ANALOG DEVICES ADM3202AN について。
    GPIO_0 Pin_15をUART1 TX、同 Pin_16を UART1 RXとして使用。
   2)UART割り込み設定(IRQ)。
    
 [不具合]    
   1)現象 PCからキーニュー力データを受けた時にハング(50%前後の割合でハング)
        UARTの割り込みが前述のタイマ割り込み同様な原因と思う。
   2)対処 未解決。
    (6/25)解決

※ ここまでの試行で、割り込み、各タスク等のスケジュール、マイコン資源、、、等の管理が必要と思いRTOSの導入が必要と思うようになる。

7.フェーズ7 RTOS 導入テスト
 7-1.Toppers ASPを調べる。 まったく手が出せない。
 7-2.FreeRTOSを調べる。
   1)導入 SOURCEFORCE.NET 「FreeRTOS Real Time Kernel」 から FreeRTOSV5.2.0.zip
     をダウンロード (The FreeRTOS.org Project)
   2)サンプルコードを調べる。   
     Demo\ARM7_LPC2368_Eclipse\RTOSDemo\main.c を調べる。
   3)サンプルコードを改造
    ・全般 Ethernet関連のコードをコメント化、または、ダミー化
        TIMER0をFreeRTOS専用に(サンプルコードに従い)
    ・main.cの改造 関数xTaskCreate( vuIP_Task, ,,をコメント化、同関数で指定さ
れる vLCDTaskの内容 を LED点滅の簡単なものに改造。
    ・lpc2368.ld(リンクスクリプト)の改造
         ram, __stack_end__のアドレス、サイズ等を修正。
    ・Makefileの改造 Ethernet関連のファイル指定を削除。
    ・・・
   4)結果
     ・main()内の vTaskStartScheduler()まで正常終了本来、この関数で待機する
はずが終了してしまう。
     ・TIMER_0の割り込みが不調 タイマの稼動自体不明。。。

    ただ単にプログラムがハングしているのか不明。
    
    <プログラム概要>
     元プログラム  
        Ethernetの機能タスクの構成 => LCD関連の環境構成 => LCD機能タスクの
        構成  => タスクスケジューラの起動
              で
        Ethernetの機能、LCDの機能の稼動。
     改造プログラム
        LED点灯のタスクの構成 => タスクスケジューラの起動
              で
        LEDが点滅するハズだった。 

「その他 課題」
 * ADC での 値表示を試そうとして、C言語関数 sprintf()を使うと即座にプログラムはハングする。 (リンクスクリプトを修正しないと、リンクは通らない。エラーメッセージにある「‘end」をリンクスクリプト追加するが、その正誤もわからない。)
  解決(7/10)newlibのインストールのやり直し。

 * float,doubleの計算でプログラムがハングするケースが多い。
 * タイマー等の割り込みを使いながら、main()内のwhile(1)ループで何かをさせると。プログラムはハングする。
   

     
※本Blogは、組み込み素人の、趣味レベルの内容です。電子ブロック世代(発売当時)でITエンジニアが、近年、たまたま、Interfaceの付録基板に出会ってはまってしまった、そんな中年男が暇をみて書き込んでいます。 エキスパートの皆様からみて、内容に間違いも多いと思いますがご容赦願います。
 誤字脱字等、乱文、書きかけ等、も併せてご容赦願います。

0 件のコメント:

コメントを投稿