[[FrontPage]]

2009/05/25 からのアクセス回数 &counter;

#contents

ARMは、CPUコアは同じでも周辺IOの処理が各社まちまちなのが難点でした。

ARMlibは、安価に使えるLPC2000やAT91シリーズのCPUをターゲットに
- タイマー
- RS232C通信
- I2Cマスター
- SPIインタフェース
- FATファイルシステム
- ネットワークライブラリ

を提供し、ARMの組み込み開発を容易にします。

** armlib [#f69648d7]
AVRlibを出しているProcyonから、
[[Procyon ARMlib>http://hubbard.engr.scu.edu/embedded/arm/armlib/index.html]]
が出ています。

最初は、LPC2000をベースに開発していたみたいですが、atmelのat91シリーズ、aduc7000も
不完全ながら、サポートしているみたいです。

** SAM7S256でarmlibを使う [#o18c7761]
ARMlibのサンプルでは、SAM7S256用のソースファイルがないので、この例題はAT91シリーズの
ARMlibのサンプルでは、SAM7S256用のサンプルがないので、この例題はAT91シリーズの
ユーザによい例になると思います。

*** ARMlibのインストール [#p31e65f9]
[[Procyon ARMlib>http://hubbard.engr.scu.edu/embedded/arm/armlib/index.html]]
のページにアクセスし、
- ARMlib including docs and examples (zip file, 1.3M , Monday November 06, 2006 )
をクリックするとZIPファイルがダウンロードされます。
- 適当な場所に解凍します、私は~/local/arm/armlibに入れました。
- 環境変数ARMLIBにarmlibの場所をセットします、私はターミナルで自動的にセットされるように.profileに
以下のように設定しました。
#pre{{
export ARMLIB=$HOME/local/arm/avrlib
}}

これで、インストール完了です。
詳しくは、
[[Installing ARMlib Manually>http://hubbard.engr.scu.edu/embedded/arm/armlib/docs/html/install.html]]
を見てください。

*** makefileの変更 [#o590ad91]
サンプルから、&ref(makefile); をコピーし、以下の項目を変更します。
- TRG : ターゲット名は、Armlibを使い慣れるまでmainを使います。&ref(script.ocd); やデバッグ時の設定が同じ方が操作を習得しやすいから。
- ARMLIB : armlibのインストール場所を設定します。
- ARMLIB_ARCH_SRC, ARMLIB_SRC : 使用するライブラリのソファイル名を指定します。
- LDFLAGS : リンクコマンドファイル名を指定します。

makefileの設定例を抜粋します。

#pre{{
	TRG	= main
	ARMLIB = $(HOME)/local/arm/armlib
	ARCH = at91
	ARMLIB_ARCH_SRC = processor.c uart.c 
	ARMLIB_SRC = rprintf.c
}}

Armlibを使った最初の、例題は、RS232C経由でターミナルにHello worldを表示するものです。
使用する評価ボードはOlimexの
[[AT91SAM7S256ボード>http://www.olimex.com/dev/sam7-p256.html]]
です。

- ARCH : at91を指定します
- ARMLIB_ARCH_SRC  : processor.c uart.cはCPUタイプに依存するので、ARMLIB_ARCH_SRCで指定します
- ARMLIB_SRC  : rprintf.cはライブラリ共通なので、ARMLIB_SRCで指定します
- LDFLAGS : at91sam7s256-rom.ldをリンクコマンドとして指定します

*** global.hを設定 [#j76b466a]
次に、必要なファイルは&ref(global.h);です。

最初はどうやって設定すればよいか分かりませんでした。
AT91SAM7S256のサンプルプログラムのコメントを頼りに、以下のように設定しました。

- F_CPU : 外付けクリスタルの周波数を設定します、ここでは18.432MHzなので47923200としました。
- OSC_DIV : サンプルのコメントでは、OSC_DIVを5としているので、ここでは5を使用しました。
- PLL_MUL : PLLとF_CPUの関係は以下のようになっています、この式からPLL_MULを25としました。
-- PLL = (18.432/OSC_DIV*(PLL_MUL+1) => 95.8464MHz
-- F_CPU = PLL/2 =>47.9232MHz

#pre{{
#ifndef GLOBAL_H
#define GLOBAL_H

// global ARMLIB defines
#include "armlibdefs.h"
// global ARMLIB types definitions
#include "armlibtypes.h"

// project/system dependent defines
// 18.432MHz Ex-Osc.
// PLL = (18.432/OSC_DIV*(PLL_MUL+1) => 95.8464MHz
// F_CPU = PLL/2 =>47.9232MHz
#define F_CPU	47923200
#define	OSC_DIV	5
#define	PLL_MUL	25

#endif
}}

*** main.c [#mff3a5c0]
最後に&ref(main.c);について説明します。
- インクルードファイル
-- global.h : 使用するボードの設定情報をインクルード(マシン依存する部分は、ここに押し込む)する
-- 使用するライブラリのヘッダファイルをインクルードする
- main関数
-- processorInit : 使用するCPUの初期設定を行う
-- uart0Init : RS232Cライブラリの初期設定を行う(ボーレート9600, 8ビット、ノンパリティ、ストップビット1)
-- rprintfInit : rprintf の初期設定を行う、rprintfで使用するライブラリの文字出力関数を設定する。
-- rprintf : hello world\nを出力する。

#pre{{
#include "global.h"			// include our global project settings
#include "processor.h"		// include processor initialization functions
#include "uart.h"			// include uart library functions
#include "rprintf.h"		// include printf library functions


int main(void)
{
	// initialize processor
	processorInit();
	// initialize uarts
	uart0Init(UART_BAUD(9600), UART_8N1);
	rprintfInit(uart0SendByte);
	
	// run the test
	rprintf("Hello World\n");

	return 0;
}
}}

** プログラムの書き込みと実行 [#yc6e1387]
[[arm/LED点灯の作成とデバッグ]]と同様に作成したプログラムをROMに書き込みます。
ROMへの書き込みには、script.ocdとopenocd-rom.cfgを使用します。

ターミナルで、プロジェクトディレクトリに移動した後、
#pre{{
$ make
$ openocd -f openocd-rom.cfg 
}}

書き込みが完了したら、
- RS232Cケーブルを接続し、
- 端末ソフトを起動、ここではjermを起動します。
- TAGライターをケーブルを外して、ボードの電源を入れ直してください。

#pre{{
$ jerm

hello world
}}
と出たら、成功です。

Armlibを使うととても簡単にRS232Cを使って端末ソフトと通信できます。
また、使用するARMのアーキテクチャをLPC等他のCPUに変えても、プログラムの変更は少なくてすみます。



** コメント [#qf94e4e2]
この記事は、

#vote(おもしろかった,そうでもない,わかりずらい)

皆様のご意見、ご希望をお待ちしております。

#comment_kcaptcha



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc