Renesas 組み込みモニタ 構築 [H8,Win]
WinXP 上にて Renesas 組み込みモニタ を構築し、AKI-H8/3069F
のフラッシュ ROM に書き込みます.
モニタを使ってサンプルプログラムを外部
DRAM にダウンロードし動作させます.
フラッシュ ROM の書き換え回数の制限を気にすることなく、DRAM
上にて存分にプログラム開発がおこなえるようになります.
printf 関数を使ったデバッグも行えます.
- 評価版 C/C++ 6.01 , HEW4 インストール
- 無償評価版 FDT インストール
- モニタ専用通信ソフト Hterm インストール
- Renesas 組み込みモニタ 3.0A 構築
- Renesas 組み込みモニタ 書き込み
- Sample1 : LED 点灯
- Sample2 : LED 点滅 (WDTimer割り込み版)
- 付録1 : Renesas C/C++, HEW が生成するセグメント
- 付録2 : AKI-H8/3069F メモリマップ
関係するドキュメント:
評価版 C/C++ 6.01 , HEW4 インストール
ルネサス社が提供している開発環境(評価版)をインストールします.
最初にコンパイルを実行した日から60日後にリンクサイズが64KBに制限される評価期限が付いています.
- ルネサス社HP (www.renesas.com/jpn/)
,[ホーム]-[製品]-[マイコン]-[開発環境]-[ダウンロード]-[無償評価版]
から
H8,H8S,H8SXファミリ用C/C++コンパイラパッケージ
Version 6.01 Release 00 ,MS-Windows XP,2000,NT4.0,98SE,ME
版
h8cv601r00_ev.exe (69.44MB) をダウンロード.
- h8cv601r00_ev.exe を実行しウィザートに従ってインストール.
AutoUpdate が実行され最新版にアップデートされる.(HEW
4.00.01 に update された)
無償評価版 FDT インストール
ルネサス社が提供しているフラッシュ書き込みツール
FDT 無償評価版をインストールします.
H8/3069F のフラッシュ書き込みは、Hterm
でも可能ですので FDT は必須ではありません.
- ルネサス社HP (www.renesas.com/jpn/)
,[ホーム]-[製品]-[マイコン]-[開発環境]-[ダウンロード]-[無償評価版]
から
Flash Development Toolkit Ver.3.3 無償評価版
, MS-Windows XP,2000,NT4.0,98SE,ME版
fdtv30300.exe (23.45MB) をダウンロード.
- fdtv30300.exe を実行しウィザードに従ってインストール.
USB drivers は不要.特定拡張子との関連付けも不要.
モニタ専用通信ソフト Hterm インストール
モニタプログラム専用通信ソフト Hterm をインストールします.
Hterm は、組み込みモニタと連携し簡易なC言語ソースデバッグ(ELF/DWARF2形式時)を可能にします.
H8/3069Fのような書き込み制御プログラム内蔵型へのフラッシュ書き込みも可能です.
- ルネサス社HP (www.renesas.com/jpn/)
,[ホーム]-[セミナー]-[サンプルプログラム]-[H8/300Hシリーズ]-[モニタプログラム]
から
専用通信ソフト ver.8.1 htermmdi.exe をダウンロード.
- htermmdi.exe を実行し、適当なフォルダ (c:/bin/hterm
など) に展開する.
Renesas 組み込みモニタ 3.0A 構築
簡易デバッグ機能を備えた組み込みモニタです.
Ver.3.0A からモニタが使用するSCI経由でprintf関数とscanf関数がサポートされます.
準備:
- ルネサスHP (www.renesas.com/jpn/)
,[ホーム]-[セミナー]-[サンプルプログラム]-[H8/300Hシリーズ]-[モニタプログラム]
から
H8/300H用モニタプログラムver.3.0A HEW3(C/C++
Ver.6.0)対応版 300hhew3.exe をダウンロード.
- 300hhew3.exe を実行し、HEW で作業するために適当なフォルダ
(d:/hew/h8300hmon/ など) に展開する.
HEW3 用のプロジェクトファイルが展開されます.
readme.htm 「組み込み型モニタのカスタマイズ方法」に従って
AKI-H8/3069F にカスタマイズしていきます.
- HEW4 を起動し、組み込みモニタのワークスペース
monitor.hws を開く.
- ユーザイニシャライズモジュール作成
ユーザイニシャライズモジュールは、monitor.c
か monitor.src に記述します.
monitor.c がプロジェクトに登録されていますが、ここでは
monitor.src を使用するので、
monitor.c をプロジェクトから削除し、monitor.src
を登録します.
DRAM アクセスを有効にするために下記を設定するコードを追加します.
( monitor.src )
P1DDR ( FEE000h ) = FFh
P2DDR ( FEE001h ) = 07h
P8DDR ( FEE007h ) = 04h
RTCOR ( FEE02Ah ) = 99 (10進数)
RTMCSR ( FEE028h ) = 0Fh
DRCRB ( FEE027h ) = 98h
DRCRA ( FEE026h ) = 3Ch
- リンケージコマンドファイル修正
monitor.sub の内容を AKi-H8/3069 に合わせて修正します.
( monitor.sub )
組み込みモニタをフラッシュROMに配置します.組み込みモニタの作業領域に
DRAM の最上位 1KB を割り当てます.
ユーザプログラムの仮想ベクタは、外部DRAMの先頭に配置します.
AKI-H8/3069 には COM0 と COM1 の2つのシリアルポートがありますが、組み込みモニタは
COM1 を 38400 [bps] にて使用するように設定します.
(COM1 は 3069 の SCI チャネル 1 , COM0
は SCI チャネル0 に接続されています.)
INPUT ADVANCED,MONITOR,LOWER ( printf関数、scanf関数 サポート )
LIBRARY ADVANCED, 3069 ( ライブラリファイル 3069 )
DEFINE $BRR=13 ( SCI 38400 [bps] @25MHz , 16進数 , 3069F データシート 表13.3 より選択)
DEFINE $STACK=600000 ( DRAM 最上位:ユーザプログラム初期SP値 )
START VECTOR/0,ROM,C/100 (組み込みモニタ ROM領域,C セクション追加)
,RAM/5FFC00 (DRAM 最上位 1KB: 組み込みモニタ RAM領域)
,USER/400000 (外部DRAM先頭: ユーザプログラムの仮想ベクタ領域)
,SCI/FFFFB8 (SCI チャネル1 SMR 番地: 組み込みモニタが使用するポート)
- モニタの機能選択
初期状態は Hterm と連携動作する機能設定になっていますのでそのまま採用します.
コマンド形式の monitor.bat プログラムを使って機能選択を行い不要な機能を削除することでモニタのサイズを小さくすることもできます.
- printf関数、scanf関数のサポート
[プロジェクト]-[ファイルの追加...] を選択し
monitor/lower.c をプロジェクトに追加する.
- ビルド実行
HEW4 の [ビルド]-[ビルド] を実行し、組み込みモニタをビルドします.
"o Errors, 0 Warnings" が表示され、Release/monitor.mot
が生成されます.
以上で Renesas 組み込みモニタ 3.0A 構築は完了です.
3.0A は組み込み向けの printf 関数と scanf
関数を提供します.
マップファイル monitor.map を開き __printf_lite
関数のアドレスと
__scanf_lite 関数のアドレスを調べます.そのアドレスを下記のように定義します.
このマクロを記述することで浮動小数点を除いた簡易型の
printf / scanf が
シリアルポートを介して利用できるようになります.
モニタのプログラムサイズは、printf/scanf関数サポートあり:
ROM=23KB/RAM=211bytes 、
サポートなし: ROM=32.3KB/RAM=287bytes となりました.
#define printf ((int (*)(const char *,...))0x002b86 )
#define scanf ((int (*)(const char *,...))0x002bd8 )
参考文献:
[1] hamayan 氏, 「H8/3068Fネットワークボード向けデバッグモニタ」 mon3068r20.zip (36KB , 2003-09-03)
Renesas 組み込みモニタ 書き込み
Hterm を使って AKI-H8/3069F にモニタを書き込みます.
- AKI-H8/3069F と PC を RS-232C で接続する.
USB-Serial 変換ケーブルでもOKです.デバイスマネージャを使って使用する
COM ポートを確認しておく.
- AKI-H8/3069F の DIP-SW を書き込み用(ブートモード7)にセットし、電源を入れる.
- Hterm を起動する.
"Console" ウィンドウが開いている場合は、[通信]-[切断]
コマンドによって一旦閉じる.
[ファイル]-[プロパティ] コマンドを実行し、通信ポート(使用するPCのポート番号:COM1/COM2/COM3
...)とビットレート(38400)を選択する.
[フラッシュ]-[ブートモード] コマンドを実行する.
動作周波数 25 [MHz]、書き込みマット: ユーザマット
を選択する.
書き込むロードモジュール : .../Release/MONITOR.MOT
を選択すると、フラッシュへの書き込みが実行される.
書き込み完了後、AKI-H8/3069F の電源を切る.
組み込みモニタの動作を確認します.
- Hterm を起動する.
- AKI-H8/3069F の DIP-SW を実行用(モード5)にセットし、電源を入れる.
- Hterm にモニタのオープニングメッセージが表示される.
プロンプトに "?" を入力すると下記の機能一覧が表示される.
: ?
Monitor Vector 000000 - 0000FF ← モニタのベクタテーブル
Monitor ROM 000100 - 00811F ← モニタプログラム (約32.3KB)
Monitor RAM 5FFC00 - 5FFD1F ← モニタのワークRAM (287bytes)
User Vector 400000 - 4000FF ← ユーザプログラムの仮想ベクタ
. : Changes contents of H8/300H registers.
A : Assembles source sentences from the keyboard.
B : Sets or displays or clear breakpoint(s).
D : Displays memory contents.
DA : Disassembles memory contents.
F : Fills specified memory range with data.
G : Executes real-time emulation.
H8 : Displays contents of H8/3069 peripheral registers.
L : Loads user program into memory from host system.
M : Changes memory contents.
R : Displays contents of H8/300H registers.
S : Executes single emulation(s) and displays instruction and registers.
:
フラッシュ書き込みは FDT を使ってもOKです.
- FDT を起動する.
- "新規プロジェクトワークスペースの作成"、
ワークスペース:"h83069f",プロジェクト:"h83069f",ディレクトリ:"d:/hew/fdt/h83069f"等適切に、
Select Device:"H8/3069F"、
Select port:"COM4"等適切に、
入力クロック:"25"Mhz、
Select Connection:"BOOT Mode"、
ボーレート(推奨): Use Default、
Protection:"Automatic"、
Messaging:"Advanced"
- [プロジェクト]-[ファイル追加] を実行し、組み込みモニタのロードモジュール
".../Release/MONITOR.MOT" を追加.
- AKI-H8/3069F と PC を RS-232C で接続する.
- AKI-H8/3069F の DIP-SW を書き込み用(ブートモード7)にセットし、電源を入れる.
- プロジェクトウィンドウに表示されている MONITOR.MOT
を右クリックし、[ダウンロード (user area)]
を実行すると書き込まれる.
Sample 1 :LED 点灯
テスト回路 CIR-H8-01 は、AKI-H8/3069F に LED を3つ接続する簡単な回路です.
3つの LED を順番に点滅させるサンプルプログラムを作成し、これを組み込みモニタで
DRAM に転送し、
DRAM 上で実行するテストを行います.
- HEW4 を起動し、"新規プロジェクトワークスペースの作成"
を選択.
- "Application" - ワークスペース名:"h83069test"、
プロジェクト名:"led_loop"、
ディレクトリ:"d:/hew/h83069test 等適切に、
CPU種別:"H8S,H8/300"、
ツールチェイン:"Hitachi H8S,H8/300 Standard"
を選択.
- ツールチェインバージョン:"6.1.0.0"、
CPUシリーズ:"300H"、
CPUタイプ:"3069R" を選択し、[完了]ボタンを押す.
- 自動生成された led_loop.c を開き、main 関数に下記を追加する.
( led_loop.c )
#define printf ((int (*)(const char *,...))0x002b86 )
#define scanf ((int (*)(const char *,...))0x002bd8 )
void main(void)
{
volatile unsigned int i ;
volatile unsigned char *pdr = (unsigned char *)0xffffd5 ; /* P6DR */
printf( "Hello, H8 world\n" );
*(unsigned char *)0xfee005 = 0x07 ; /* P6DDR */
while(1){
*pdr = (unsigned char)0x01 ;
for (i=0; i<20000; i++);
*pdr = (unsigned char)0x02 ;
for( i=0; i<20000; i++);
*pdr = (unsigned char)0x04 ;
for( i=0; i<20000; i++);
}
}
- 自動生成された "intprg.c" は不要なので、ファイルを選択した後右クリック[ビルドから除外]を実行し、ビルド対象から外す.
(intprg.c は __interrup(vect=nn) という特別の記述で
ROM 先頭に配置されるベクタテーブルを自動生成します.
組み込みモニタでは DRAM 上に配置する仮想ベクタを使用するので、intprg.c
は不要です.)
- 外部DRAMに配置するためにセクションを設定する
[ビルド]-[H8S,H8/300 Standard toolchain..]、
"最適化リンカ"タブ、カテゴリ:"セクション"、[編集ボタン]、マウスでAddress
の値を選択し[変更]を押し、下記のとおりアドレス値を変更する.
PIntPRG セクションは不要なので削除.
0x400100 : PResetPRG
0x400200 : P , C , C$DSEC , C$BSEC , D
0x400400 : B , R
0x401000 : S
- [ビルド]-[ビルド] を実行する.
( led_loop.abs , led_loop.map )
:
:
Phase OptLinker starting
License expires in 44 days
Phase OptLinker finished
Build Finished
0 Errors, 0 Warnings
と表示されればビルド完了.
.../led_loop/Debug/led_loop.abs が作成したロードモジュール(ELF/DWARF形式).
- Hterm を起動する.
- AKI-H8/3069F をRS-232Cで接続し、DIP-SW 実行モード(モード5)
で電源を入れる.
Hterm の Console に組み込みモニタのオープニングメッセージが表示される.
- [コマンド]-[Load] メニューを実行し、ファイル選択ダイアログで作成した
led_loop.abs を指定するとDRAMへのダウンロードが開始される.
- 転送終了後、"ソースプログラムを表示しますか?"
に[はい]を選択.
- Hterm のプロンプトに "G 400100" を入力するとサンプルプログラムが実行され、
Hterm のコンソールに "Hello, H8 world"
が表示された後、3つの LED が順番に点灯する.
- AKI-H8/3069F の電源を切る.
Sample 2 : LED 点滅 (WDTimer割り込み版)
テスト回路は Sample1 と同じ CIR-H8-01 で 3 つの LED が接続された簡単なものです.
ここでは LED を WDT (ウォッチドックタイマー)
をインターバルタイマとして使用し、
タイマ割り込みを使って点滅させます.
- HEW4 を起動し、Sample1 で作成したワークスペースを開く.
- [プロジェクト]-[プロジェクトの挿入]、
"新規プロジェクト"、
"Application"-プロジェクト名:"led_int",ディレクトリ:"d:/hew/h83069test/led_int"等適切に,CPU種別:"H8S,H8/300",ツールチェイン:"Hitachi
H8S,H8/300 Standard"、
ツールチェインバージョン:"6.1.0.0",CPUシリーズ:"300H",CPUタイプ:"3069R"、
[完了] でファイルが生成される.
- Project ウィンドウの "intprg.c" を選択し、右クリック-[ビルドから除外]
"intprg.c" は、__interrupt(vect=n) 記述を使って内蔵ROM
の先頭に配置する割り込みベクトルテーブルと割り込みハンドラを生成する.
組み込みモニタでは DRAM 上に仮想ベクタテーブルを作成するので、intprg.c
は使用しない.
- "resetprg.c" の PowerON_Reset() 関数定義についている
__entry(vect=0) を削除し、下記を追記する.
( resetprg.c )
#pragma interrupt(PowerON_Reset) /* 割り込みハンドラ 宣言 */
#pragma section VECT0 /* 仮想ベクタテーブルに配置するためにセクション定義 */
void(*const VECT_TABLE[])(void)={ /* PowerON_Reset ハンドラのアドレス登録 */
PowerON_Reset
};
- "led_int.c" に下記を追記する.( led_int.c )
void main(void)
{
*(unsigned char *)0xfee005 = 0x07 ; /* P6DDR : P60/P61/P62 を出力ポートに設定 */
/* WDT 設定 (インターバルタイマ モード, タイマー動作開始, 25/4096 [MHz] クロック) */
*(unsigned short *)0xffff8c = 0xa527 ; /* TCSR OVF=x, -IT=0, TME=1 , CKS= φ/4096 */
while(1) ;
}
#pragma interrupt(WDTimer) /* 割り込みハンドラ宣言 */
void WDTimer(void);
#pragma section VECT20 /* WDT の割り込み番号は 20 */
void(*const VECT_TABLE20[])(void)={ /* 割り込みベクタテーブルに登録.CVECT20 セクションを offset 50H に配置 */
WDTimer
};
#pragma section /* セクションを標準に戻す */
void WDTimer(void)
{
static char flag = 0 ;
static int count = 0 ;
volatile unsigned char uc ;
/* clear OVF : オーバフローフラグをクリアするにはダミーリードが必要 */
uc = *(unsigned char *)0xffff8c ; /* TCSR dummy read (最適化されないよう注意) */
*(unsigned short *)0xffff8c = 0xa527 ; /* TCSR OVF=0, -IT=0, TME=1 , CKS= o/4096 */
count ++ ;
if( count > 24 ){
count = 0 ;
if( flag == 0 ){
uc = 0x0 ;
flag = 1 ;
}
else{
uc = 0x1 ;
flag = 0 ;
}
*(unsigned char *)0xffffd5 = uc ; /* P6DR */
}
}
- 外部DRAMに配置するためにセクションを設定する
[ビルド]-[H8S,H8/300 Standard toolchain..]、
"最適化リンカ"タブ、カテゴリ:"セクション"、[編集ボタン]、マウスでAddress
の値を選択し[変更]を押し、下記のとおりアドレス値を変更する.
PIntPRG セクションは不要なので削除.CVECT0
と CVECT20 は仮想ベクタテーブルのために追加.
0x400000 : CVECT0
0x400050 : CVECT20
0x400100 : PResetPRG
0x400200 : P , C , C$DSEC , C$BSEC , D
0x400400 : B , R
0x401000 : S
- [ビルド]-[ビルド] を実行する.
( led_int.abs , led_int.map )
:
:
Build Finished
0 Errors, 1 Warning
と表示されればビルド完了.上記の warning
は無視してOK.
.../led_int/Debug/led_int.abs が作成したロードモジュール(ELF/DWARF形式).
- Hterm を起動する.
- AKI-H8/3069F をRS-232Cで接続し、DIP-SW 実行モード(モード5)
で電源を入れる.
Hterm の Console に組み込みモニタのオープニングメッセージが表示される.
- [コマンド]-[Load] メニューを実行し、ファイル選択ダイアログで作成した
led_int.abs を指定するとDRAMへのダウンロードが開始される.
- 転送終了後、"ソースプログラムを表示しますか?"
に[はい]を選択.
- Hterm のプロンプトに "G 400100" を入力するとサンプルプログラムが実行され、約1秒毎に
LED が点滅する.
- AKI-H8/3069F の電源を切る.
Hterm は組み込みモニタと連携し、簡易デバッグ機能を提供します.
- Hterm を起動し、AKI-H8/3069F に電源を入れ、led_int.abs
を DRAM へダウンロード.
- ダウロード完了後の "ソースプログラムを表示しますか?"
に [はい] を選択.
- [表示]-[led_int.c] を選択し、"led_int.c"
のソースコードを表示する.
- WDTimer() 関数の最初の行の番地の左をマウスでクリックし、●
を表示する.これがブレークポイントになる.
- プロンプトに G 400100 を入力しプログラムを実行すると、ブレークポイントまで実行し、一時停止する.
- [コマンド]-[Go] (F5) で実行再開、[コマンド]-[Step]
(F8) でステップ実行.
付録1 : Renesas C/C++ , HEW が生成するセグメント
HEW4 のウィザードで作成したプロジェクトで生成されるセグメントは以下のとおりです.
C/C++ Compiler が生成するもの(C/C++)とHEWウィザードが生成するもの(HEW)があります.
セグメント名 |
説明 |
PResetPRG |
(HEW) resetprg.c にて #pragma section で生成されるプログラムコード |
PIntPRG |
(HEW) intprg.c にて #pragma section で生成されるプログラムコード |
P |
(C/C++) : プログラムコード |
C |
(C/C++) : 定数 |
C$DSEG |
(HEW) dbsct.c の #pragma $DSEC にて生成される定数 |
C$BSEG |
(HEW) dbsct.c の #pragma $BSEC にて生成される定数 |
D |
(C/C++) 初期化データ |
B |
(C/C++) 未初期化データ |
R |
(C/C++) ROM 化支援で多重化された初期化データ |
S |
(HEW) stacksct.h の #pragma stacksize にて生成されるスタック領域 |
- HEW ウィザードが生成するセグメントは HEW
のフレームワークに沿って生成、利用されるものです.
- HEW は、割り込みハンドラのダミー関数作成、ベクタテーブルの生成と登録を
intprg.c で行います.
これらを自分で行う場合は intprg.c を削除し、xIntPRG
セクションも削除します.
(intprg.c にある __interrupt(vect=N) の記述は、ベクタテーブル生成とベクタテーブルへの登録を
LOCATE による ROM アドレス直接指定を使って生成します).
- HEW は、リセット起動した後のセクションの初期化は、resetprg.c
の PowerON_Reset() 関数の中で
_INITSCT() 関数を呼び出して実行します._INITSCT()
関数にセクション情報を与えるデータベースが
dbsct.c です.C$DSEG と C$BSEG セクションは
dbsct.c で作成される定数セクションです.
セクションの初期化を自分で行う場合は、dbsct.c
、C$DSEG と C$BSEG セクション、
resetprg.c の PowerON_Reset() 関数の _INITSCT()
関数呼び出しは不要です.
- resetprg.c の PowerON_Reset() 関数は、__entry(vect=0)
により
ROM の 000000H 番地に PowerON_Reset()
関数のアドレスを配置するコードが生成されます.
これはセクションではなく LOCATE 命令で直接的に行われるため配置を変更することはできません.
( モニタを使って仮想ベクタテーブルを用いる場合は、__entry(vect=n)
の記述は使用しません.)
付録2 : AKI-H8/3069F メモリマップ
AKI-H8/3069F の実行時(モード5)のメモリマップです.
内蔵ROM に Renesas 組み込みモニタを格納し、外部
DRAM に仮想ベクタテーブルとユーザプログラムを配置し、
DRAM 最上位 にモニタの作業領域を配置しました.
割り込み処理がクリティカルな開発の場合は、仮想ベクタテーブルを内蔵
RAM に配置した方がよいと思います.
参考文献
- 「C言語でH8マイコンを使いこなす」、鹿取祐二著、オーム社
ISBN4-274-07964-3、2003-10-10
組み込みモニタ、HEW 等Renesas 社ツールの使用方法、C/C++
の独自記述方法の説明があります.
Renesas 社が提供しているソフトウェアを用いて
H8 クロス開発環境を構築しました.
組み込みモニタと DRAM 転送、printf があれば楽しく
プログラム開発ができますね.
本稿は個人的なメモですので、いかなる責務も負いかねますが、少しでもお役に立てれば幸いです.