1stステップ 開発環境の作成

作成日:2011/10/16
最終更新日:2020/07/05

1stステップ 開発環境の作成

作成日:2011/10/16
最終更新日:2020/07/05

概要

本ステップではCQ_V850で動作するプログラムを開発するための環境作りと「Hello World」の作成をします。 また、動作確認のためブレッドボードでシリアルレベルコンバータを構築しサンプルプログラムがすべての シリアルインタフェースで動作することを確認しました。

開発環境

クロスコンパイラ

Langurは開発環境にFreeBSD 7.4※1を使用しています。 クロスコンパイラのVersionは12ステップ本[1]と同じものを使用します。

  • binutils 2.19.1
  • gcc 3.4.6

クロスコンパイラの作成手順は、12ステップ本とInterface 2007年 12月号の記事[2][3]を参考に以下の手順で作成しました。

binutils

コマンド1. binutils
$ cd ~/
$ tar xzf binutils-2.19.1.tar.gz
$ cd binutils-2.19.1
$ mkdir obj-v850e
$ cd obj-v850e
$ ../configure --target=v850e-elf --prefix=/usr/local/v850e-elf --disable-nls
$ gmake
$ su
# gmake install
# exit

gcc

コマンド2. gcc
$ cd ~/
$ tar xzf gcc-3.4.6.tar.gz
$ cd gcc-3.4.6
$ mkdir obj-v850e
$ cd obj-v850e
$ ../configure --target=v850e-elf --prefix=/usr/local/v850e-elf --disable-nls --disable-shared \
--disable-threads --enable-languages=c
$ gmake
$ su
# gmake install
# exit

prefixについてはLangurの好みで/usr/local/v850e-elfを指定しています。 このように指定しておくことで指定したターゲットのクロスコンパイラを/usr/local/v850e-elf以下にまとめることができ、 管理がLangurとしては楽になるからです。 デメリットとしては、クロスコンパイラごとにパスを通し直す必要があることくらいですかね。 事前に一般ユーザとrootのアカウントに/usr/local/h8300-elf/binへのパスを通してあるため、 上記手順にはパスを通す作業を含んでいません。 なお、rootで前述のパスを通しておかないとgccのgmake install時にbinutilsのツールを使用するためinstallに失敗します。

※1 2012/01/17にFreeBSD 9.0に移行しました。

FlashROMライタ

最終的に、Windows上で ChaN氏が作成されたsp850es.exe[4]を使用することにしました。 なので、「make write」には現時点では対応しません

Langurが見つけたV850用のFlashROMライタは以下の3つでした。

  • Windows版
    • FPL.exe ... Interface 2007年 5月号収録[5]
    • sp850es.exe ... ChaN氏作成
  • UNIX版
    • sp850es[6] ... arms22氏移植

当初は arms22氏がUNIX環境に移植されたsp850esを利用して開発環境をFreeBSDで完結させようと試みたのですが、 Langurの手元では書込みに失敗してしまいます。 MacOS X上では動作するとのことなので原因はLangurの環境にありそうです。 今回は移植が目的なので書込み手段は保留することにし、Windows上での書込みに妥協することにします。

次に王道としてInterface 2007年 5月号の付録CDに収録されていたFPL.exeを使用することを検討しました。 LangurのPCにInstallして使用しようとしたところ、CQ_V850を接続することで見えるはずのシリアルポートがFPL.exe上で認識されません。 同様の状況となった方をWeb上で見かけるのですが解決策を見つけることができませんでした。

これでダメだったら、本プロジェクトは失敗として別のターゲットボードへの移植を考えようと背水の陣で試したのが本家のsp850es.exeでした。 見事動作したのでこれを使用することにします。UNIX移植版へのリベンジを心に誓って...。

ソースコードの修正

機種依存の箇所、即ちアセンブラで記載された箇所及びレジスタを操作していた箇所はすべて修正します。 メモリマップについても見直す必要があります。 なお、関数のインタフェースは極力変更しない予定です。

[今回の成果物]

[今回追加するファイル]

  • register.h ... V850ES/JG2のレジスタ定義
  • pll.c ... 逓倍回路の処理
  • pll.h ... 逓倍回路の処理に関するヘッダ

[今回修正するファイル]

  • Makefile
  • main.c
  • serial.c
  • serial.h
  • ld.scr
  • startup.s

regster.h

V850ES/JG2[7]のレジスタの定義[8]をまとめます。 各種周辺機能の制御レジスタにアクセスする場合には、このヘッダファイルを#includeすることでアクセスを容易にします。

pll.[ch]

V850ES/JG2の内蔵逓倍回路の設定を行います。 CQ_V850において内蔵逓倍回路を有効にしない場合には5MHzで動作します[9][10]

Langurは逓倍回路を使用せずに20MHzでCPUが動作していると思い込んでいました。 シリアル通信のボーレートを9600bpsに設定しているつもりが2400bpsとなっていることに気付きしばらく悩んでいました。 そこで逓倍回路を動作させることで20MHzで動作することに気付きました。 ちゃんと仕様を把握した上で資料を読まないといけないと再確認しました。

Makefile

make writeに関する記述を除去します。また、ツール名をV850ES/JG2に対応させます。

main.c

CPUの初期化処理とPLLの有効化を行うようにします。

serial.[ch]

シリアル・デバイス・ドライバについてはH8/3069Fと互換性が無いためV850ES/JG2用に作り直す必要があります。 とはいえ、APIのインタフェースが同じであれば、同じ手順でシリアルインタフェースにアクセスできるため内部を作り直すことにします。

UARTA0とUARTA2については制御用のレジスタが同じものでのビットの位置が異なるため同じ値で一概にアクセスできません。 また、UARTA1についてはアクセスするための手順が異るため処理を分ける必要があります。 なお、UARTA0とUARTA2は排他で使用するコードとなっています。 Magic Numberで指定していますが、今回は目を潰り、次回以降で対応予定です。

V850ES/JG2において、ボーレート[bps]は以下の計算式で求められます[11]

\[ ボーレート = \frac{f_{xx}}{2^{m+1}k} \]
式1. ボーレート

\(f_{xx}\) はCPUの動作周波数です。 上記の式を解き、 \(m\) の値をUAnCTL1※2レジスタに、 \(k\) の値をUAnCTL2※2レジスタにそれぞれ格納します。

なお、代表的な\(m\)、 \(k\)の値はシリアル・ポートを使ったプログラミング[11]の P.128の表3に掲載されているので、その値を用いれば計算の手間が省けます。 なお、Langurは計算する手間を省くため、計算用のプログラム※3を組んで値を求めました。

※2 nには使用するシリアルインタフェース番号を入れてください。

※3 流石にコードが汚いので非公開です。

ld.scr

V850ES/JG2用に書き直します。 メモリ配置をあわせただけです。

startup.s

関数main()へ飛ぶようにします。 特殊なことはしていないつもりです。 本当はCPUの初期化処理をここで行わなければならないのかも。

確認方法

1stステップで確認したい点は、「PCのシリアルポートで「Hello World !」を受信できること。」即ち「ターゲットボードからシリアルインタフェース経由で「Hello World !」を送信できること。」です。 それぞれのシリアルインタフェースについてどうすれば確認できるかを考えます。

UARTA0

USB-シリアル変換IC経由で送受信することとなります。 また電源をUSBから供給している点と、USBに接続しなければPC上にシリアルポートを認識できない点から標準のmain.cでは電源投入時に文字列が流れてしまうため動作を確認できません。 確認するために、while文でputs()を回し続けることで確認することにします。

UARTA1、UARTA2

UARTA1とUARTA2はそのままでは確認することができません。 シリアルドライバの動作確認のためにブレッドボードにシリアルレベルコンバータを構成して動作確認も行うことにします[12]。 シリアルレベルコンバータにはADM3202AN[13]を使用しました。その際の回路図は以下の通りです。

UARTA1の接続例
図1. UARTA1の接続例
UARTA2の接続例
図2. UARTA2の接続例

結果

「Hello World!」と出力されることを確認しました。 ただし、どのシリアルインタフェースについても言えますが、電源投入時や連続して出力した場合に以下のように表示が化けることがあります。

文字化けした文字列
図3. 文字化けした文字列

考察

電源投入時にシリアルインタフェースの初期化前にシリアルポート経由でなんらかのゴミが出力されてしまっている可能性が考えられます。 また、連続して出力している場合に化ける際は、CPUが20MHzで動作しておりボーレートが9600bpsの場合0.16%の誤差が発生するためそれが原因となっている可能性が考えられます。

これらの問題点については今後の課題としたいと考えています。

参考文献

  1. 坂井弘亮, 12ステップで作る組込みOS自作入門, カットシステム, 2010
  2. 山際伸一, GNUツールを使ったクロス開発環境の構築, インタ-フェ-ス, vol. 33, no. 12, pp. 52-63, Dec. 2007
  3. 山際伸一, V850対応クロス開発環境の構築とその使い方, インタ-フェ-ス, vol. 33, no. 12, pp. 81-99, Dec. 2007
  4. ChaN, 78KとV850とNXPプログラマの製作, ELM, 2006
  5. 鈴木康之, 開発ツールのインストールと使い方, インタ-フェ-ス, vol. 33, no. 5, pp. 98-113, May. 2007
  6. arms22, sp850esをmacosxに移植, なんでも作っちゃう、かも。, 2007
  7. NEC Electronics Corporation, ユーザーズマニュアル V850ES/JG2 32ビット・シングルチップ・マイクロコントローラ ハードウェア編, NEC Electronics Corporation, 2005
  8. 那須雅樹, V850ES CPUコアのアーキテクチャ, インタ-フェ-ス, vol. 33, no. 5, pp. 67-77, May. 2007
  9. 吉田幸作, V850マイコン周辺回路の設計, インタ-フェ-ス, vol. 33, no. 5, pp. 78-87, May. 2007
  10. 石崎徳彦, V850ES/JG2 CPUの特徴と周辺機器, インタ-フェ-ス, vol. 33, no. 5, pp. 88-97, May. 2007
  11. 浅沼重保, シリアル・ポートを使ったプログラミング, インタ-フェ-ス, vol. 33, no. 5, pp. 122-133, May. 2007
  12. 島田義人, H8/Tinyマイコン完璧マニュアル, CQ出版, 2005
  13. ANALOG DEVICES, ADM3202 日本語データシート Rev 0, ANALOG DEVICES, 1999