このベースボード等の情報は次。
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 件のコメント:
コメントを投稿