Rev 1.00.00

ROM レス品種にて、外付けシリアル FlashROM 品種を追加する場合の説明（パケット通信対応版）
１．対象 MCU・ROM レス品種が対象です。(SH7262 / 7264 / 7266 / 7267 / 7268 /7269 )２．機能
・Hew4 にてシリアル FlashROM の品種追加が出来るよう対応する。
・FlashROM 仕様にあわせたセクターイレーズとバイト書き込みをプログラミングするだけで追加が可能になるよう対応する。
・FlashROM 対応ソフトをターゲットの内臓 RAM に流し込むために、H-debugger と通信させるポートを MCU 品種ごとに用意する。
３．品種追加前の準備
３－１）AH8000 コントロールソフト(DEF8K)のインストール DIR にあるワークスペースを開く。
(SH7268 での追加例)<default directory>"c:¥Aone¥DEF8K¥rom-custom¥SH7268"

1３－２）プロジェクト名「_NewSF_Writer」をアクティブプロジェクトにする。

３－３）「プロジェクトタイプの作成」を指定する。

2３－４）追加 FlashROM の新プロジェクトタイプを作成する。

新プロジェクトタイプ名を指定
タイプ名に関しては必要に応じて自由に名前を付けて下さい。

3

４．シリアル FlashROM 品種の追加
４－１）新規プロジェクトの挿入

4新規プロジェクト名

新規作成したプロジェクトタイプ

5４－２）シリアル FlashROM 品種の定義およびプログラムを作成する。
１）「FromTemp.c」を開く

２）「FromTemp.h」の#define を定義する。

「SECTOR_MAX」に最大セクター数を定義する。

6３）シリアル FlashROM のセクター情報を定義する。
必ず先頭に定義する。
(SECTOR_MAX | EXP_PACKET)EXP_PACKET を OR 定義することにより拡張パケット通信が有効になる。

変数「SectorTopAdr[]」に、セクター（ブロック）数ごとの先頭アドレスを定義する。

最後にフラッシュＲＯＭの最終アドレス＋１したアドレスを定義する。

7

４）「オープン」関数を確認または変更する。

関数「FromOpen()」は、ターゲット RAM に、ダウンロード時の最初に 1 回コール(Call)する。このプログラム例は、「FRQCR」の設定「キャッシュ無効」を定義する。
「IoInitSPIBSC()」RSPI0 の初期化
「sFlashSetMode()」QUAD モード「sFlashUnProtect()」プロテクト解除（アンロック）
必要無い場合は、「return(Ok);」のみ記述する。

５）「クローズ」関数を確認または変更する。

関数「FromClose()」は、フラッシュ ROM に全データ書き込み終了後の最後に 1 回コール(Call)する。このプログラム例は「sFlashProtect()」プロテクト（ロック）必要無い場合は、「return(Ok);」のみ記述する。

8

６）「セクターイレーズ」関数を確認または変更する。

関数「FromSectorEraseProc(UCHAR *cmd)」には、セクターごとのイレーズプログラムを記述する。デバッガとの通信完了後、サムチェック正常の場合、この関数をコール(Call)する。
（サム異常時はコールなし）＜引数の仕様＞
char cmd[];
cmd[0] == '%' // ヘッダー
cmd[1] == 0 // 予備
cmd[2] == 4 // コマンドサイズ cmd[3]->[Sum]までのサイズ
cmd[3] == 'D' // コマンド
cmd[4] == 0xn // 消去するセクター番号の H 数 最大 HIGH(1024)
cmd[5] == 0xn // 消去するセクター番号の L 数 最大 LOW(1024)
cmd[6] == 0xn // サム cmd[3]->[5]の加算値＜備考＞
全イレーズ処理にしたい場合は、セクター番号ゼロ「０」のときのみ実施して、他ののセクターの場合は、「return(Ok);」にすれば代用できる。
「sflashrom.c¥ sFlashSectorErase()」セクターイレーズ関数

9７）「書き込みプログラム」関数を確認または変更する。

書き込みアドレスの算出

関数「FromWriteProc(UCHAR *cmd)」には、128 バイトごとの書き込みプログラムを記述する。デバッガから書き込みデータ 128 バイト)固定でデータを受信し完了後、サムチェック正常の場合、この関数をコール(Call)する。
（サム異常時はコールなし）＜引数の仕様＞
char cmd[];
cmd[0] == '%' // ヘッダー
cmd[1] == 0 // 予備
cmd[2] == 134 // コマンドサイズ cmd[3]->[Sum]までのサイズ
cmd[3] == 'W' // コマンド
cmd[4] == 0xn // 書き込みアドレス(HH)
cmd[5] == 0xn // 書き込みアドレス(MH)
cmd[6] == 0xn // 書き込みアドレス(ML)
cmd[7] == 0xn // 書き込みアドレス(LL)
cmd[8] == 0xn // 書き込みデータ[0]""cmd[135]== 0xn // 書き込みデータ[127] 固定 余分エリアは(0xff)cmd[136]== 0xn // サム cmd[3]->[135]の加算値＜備考＞
このプログラム例は、128 バイトの書き込み終了後、ベリファイテストを実施している。
[sflashrom.c ¥sFlashByteProgram()]バイト書き込み関数[sflashrom.c ¥sFlashByteRead()]バイト読み出し関数
10８）「フルステータスチェック」関数を確認または変更する。

関数「FullStatusCheck(USHORT *adr,USHORT data,UCHAR cmd」には、フラッシュROM 特有のステータスチェックプログラムを記述する。この関数は、上記の作成関数からのみコール(Call)される。よって、内部処理は自由に記述可能です。
＜引数の仕様＞
Ushort *adr; // 処理しているフラッシュ ROM のアドレス
char cmd; // 処理しているコマンド// ''O' = オープンコマンド// ''C' = クローズコマンド// ''D' = イレーズコマンド// ''W' = 書き込みコマンド// ''R' = ベリファイコマンド＜備考＞
関数「FromErrorSet(..)」は、関数デバッグ時のエラー情報を見るための一例としての関数のため、仕様に関してはルールが無いので、自由に作成して下さい。

11４－３）シリアル FlashROM に依存した定義およびコマンドプログラムを作成する。
１）「sflashrom.h」を開く

２）「sflashrom.h」の#define を定義する。
「SFMAX_SIZE」にシリアル FlashROM の最大サイズ（バイト）を定義する。

３）を参照

12

３）
「sflashrom.h」の#define の定義説明。
シリアル FlashROM の各コマンドを定義します。
定義名
コマンド
機能
SF_CHIP_ERASE
0xC7
チップイレーズ
SF_SECTOR_ERASE
0xD8
セクターイレーズ
SF_BYTE_PROGRAM
0x02
データの書き込み（バイト）
SF_BYTE_READ
0x0B
データの読み出し（バイト）
SF_DUAL_READ
0x3B
データの読み出し（DUAL）
SF_QUAD_READ
0x6B
データの読み出し（QUAD）
SF_DUAL_IO_READ
0xBB
DUAL I/O 高性能読み取り
SF_QUAD_IO_READ
0xEB
QUAD I/O 高性能読み取り
SF_WRITE_ENABLE
0x06
Write 許可
SF_READ_STATUS
0x05
ステータスリード
SF_READ_CONFIG
0x35
コンフィグレーションリード
SF_WRITE_STATUS
0x01
ステータスライト
SF_QUAD_PROGRAM
0x32
データの書き込み（QUAD）
CFREG_QUAD_BIT
0x02
QUAD モードビット（Configuration）
CFREG_FREEZE_BIT
0x01
フリーズビット（Configuration）
STREG_BPROTECT_BIT 0x1C
プロテクトビット（Status）
この例は、Spansion の「S25FL032P」のコマンドです。コマンド仕様は各デバイスメー
カーによって異なります。使用するデバイスのデータシートを参照して下さい。

４）「sflashrom.c」を開く

13５）「sFlashSetMode()」開数を確認または変更する。
【機能】QUAD モードに設定する。

６）「sFlashUnProtect ()」開数を確認または変更する。
【機能】プロテクトを解除する。

７）「sFlashProtect ()」開数を確認または変更する。
【機能】プロテクトする。

８）「sFlashReadStatus ()」開数を確認または変更する。
【機能】ステータスをリードする。

14

９）「sFlashChipErase ()」開数を確認または変更する。
【機能】チップをイレーズする。

１０）「sFlashSectorErase ()」開数を確認または変更する。
【機能】セクターをイレーズする。

15

１１）
「sFlashByteProgram ()」開数を確認または変更する。
【機能】指定バイトを QUAD モードで書き込み（プログラミング）する。

16

１２）
「sFlashByteRead ()」開数を確認または変更する。
【機能】指定バイトを QUAD モードで読み出しする。

17４－４）作成したシリアル FlashROM プログラムをビルドする。
１）セクションの確認＜ルール１＞
セクター情報定義のセクション名「SectTbl」の、ロケートは必ず、実行プログラムアドレス(TopAdr)の「+0x800」に割付る。
＜ルール２＞
セクション「SectTbl」のデータ配置にルールがある。
const
long SectorMax;// セクター数
constlong SectorTopAdr[SectorMax+1];// セクター毎 Top ア
ドレス
この順番に配置されることが条件になる。
＜ルール３＞
最大セクター(ブロック)数は、「1024」です。
＜ルール４＞
スタックまで含めたオブジェクトサイズは「0x4000」16KB までです。
＜ルール５＞#define OK
0#define NG0xee
数値変更しないで下さい。

// 変更不可// 変更不可＜ルール６＞
下記 4 関数は、名称・引数・戻り値等の仕様変更は不可です。
1)INT
FromOpen(void);
2)INT
FromClose(void);3)INT
FromSectorEraseProc(UCHAR *cmd);
4)INT
FromWriteProc(UCHAR *cmd);
以上のルールは厳守して下さい。

18

２）ビルドの実施「0 Errors, 0 Warnings」を確認する。

19

５．シリアル FlashROM プログラムのデバッグ方法
５－１）ターゲット基板側のモード設定
デバッグ中は、「ブートモ－ド０」（CS0 空間に接続されたメモリからブートする）にして下さい。理由は、「ブートモード３」（シリアルフラッシュメモリからブートする）のままですとリセット解除後、ブートプログラムが起動され内蔵 RAM の先頭から「0x2000」エリアにローダプログラムがロードされてしまうからです。
５－２）デバッグの準備のため「main.c」を開きビルドする。

「FROM_TEST」のコメントを外して、＜ビルド＞―＜ビルド＞でビルドする。

「0 Errors, 0 Warnings」を確認する。

デバッガ使用の通信ポートと、FlashROM プログラム使用の通信ポートと兼用させているため、通常のデバッグ操作でのデバッグは出来ません。
対策として、上記「#define FROM_TEST」のコメントを外すことにより、通信ポートを使用せず、内部メモリ操作のみで各関数のテストできるように用意してあります。

20

５－３）
「DEF8K」の「CPU 設定」にデバッグ環境を設定する。

作成した「FlashROM」プログラム
は、ターゲットの内臓 RAM に転送して実行させますので「RAM」側を選択して先頭アドレスとサイズを設定する。
SH7268 の場合
開始 0xfff8_0000 サイズ 0x10000になる。

ターゲット側の基板構成によるデバッグ時は、「Sof-TAP」を指定する。

作成した「FlashROM」プログラムのデバッグに BSC 設定が必要な場合は、スクリプトファイルを指定する。
SH7268 の場合"c:s¥Aone¥DEF8K¥rom-custom¥SH7268"に、例として「SH7268-BSC.log」を用意してあるので、目的ターゲット基板にカスタマイズして下さい。

21５－４）「DEF8K」でデバッグを開始する。
１）ターゲットと接続する。

②ターゲト基板をリセットする。

①「Start」をクリック

22２）シリアル FlashROM プログラムをダウンロードする。

23

３）「RstMon」をクリックする。

「RstMon」をクリック「void PowerON_Rest_PC」関数の先頭の PC 値になっている事を確認する。

SP 値が内蔵 RAM のボトム位置になっていることを確認する。

「Reg」をクリック
24４）「main.c::TestMain()」にブレークポイントを設定後、実行する。

①BP1:「stat = FromOpen()」にブレーク設定する。

②BP2:「while(1){}」にブレーク設定する。
エラー発生時ここで停止する。

③「Go」をクリックする。

①「stat = FromOpen()」の位置で停止していることを確認する。
（紫帯が停止している意味）②「CTrac」をクリック

25５）オープン「FrormOpen()」を確認する。

「FromOpen()」関数内に PC 値が移動したことを確認する。
①「main.c」に戻るまで「CStep」をクリックする。

「main.c」に戻ったのを確認する。

26

６）デバッグを進めるため準備するため「Watch」画面を開く。

①「Watch」をクリックする

デバッグを進めるため、Watch 画面に変数を登録する。
1) CmdStep2) Sector
3) WriteAdr
4) ReadAdr
5) Size6) FromError

関数「CmdWaitT」のコントロールステップ変数
セクターイレーズの進行カウンター
FROM 書き込み中アドレス
Verify 中読み出しアドレス
パケットサイズ(128 / 256 / 512)
エラー発生時情報

6 変数を登録します。

27７）セクターイレーズ関数「FromSectorEraseProc(UCHAR *cmd)」を確認する。

①「Go」をクリックする。

①「周期サンプル」にチェックする。

②変数「CmdStep」を数値「1」にする。// ⏎１⏎で設定＜備考＞「main.c」の「CmdWaitT()」関数を参照。
疑似コマンドを作成して「FromSectorEraseProc(UCHAR *cmd)」をコールする。

28

「Sector」はゼロ「0」から登録セクタ数までインクリメントする。

「CmdStep」は、全セクターイレーズが正常終了すると「1」から「0」に変化する。

異常終了すると BP2 で停止する。

29８）書き込み関数「FromWriteProc(UCHAR *cmd)」を確認する。

①「周期サンプル」にチェックする。
②「パケットサイズ」を変更する場合に書き換える。(128 / 256 / 512)

③変数「CmdStep」を数値「2」にする。// ⏎2⏎で設定＜備考＞「main.c」の「CmdWaitT()」関数を参照。
疑似コマンドを作成して「FromWriteProc(UCHAR *cmd)」をコールする。

「WriteAdr」は、FlashROM の書き込み先頭アドレス「0x0」から登録最終アドレスまでインクリメントする。

「CmdStep」は、全エリアの書き込みが正常終了すると「2」から「0」に変化する。

異常終了すると BP2 で停止する。

30

９）パラレル FlashROM 全エリアをベリファイする。

①「周期サンプル」にチェックする。

②変数「CmdStep」を数値「3」る。// ⏎3⏎で設定＜備考＞「main.c」の「CmdWaitT()」関数を参照。
書き込み時に使用した同等の疑似データを作成して全エリアのベリファイを実施する。

「ReadAdr」は、FlashROM の読み出し先頭アドレス「0x0」から登録最終アドレスまでインクリメントする。

「CmdStep」は、全エリアの書き込みが正常終了すると「2」から「0」に変化する。

異常終了すると BP2 で停止する。

31

１０）クローズ「FrormClose()」を確認する。

①BP1:「stat = FromClose()」にブレーク設定する。

②変数「CmdStep」を数値「4」にする。// ⏎4⏎で設定＜備考＞「main.c」の「CmdWaitT()」関数を参照。
疑似コマンドを作成して「FromClose()」をコールする32

①「stat = FromClose()」の位置で停止していることを確認する。
（紫帯が停止している意味）②「CTrac」をクリック「FromClose()」関数内に PC 値が移動したことを確認する。

①「main.c」に戻るまで「CStep」をクリックする。

33

「main.c」に戻ったのを確認する。

以上で FlashROM プログラムの動作確認は終了です。
１１）異常終了時のエラー情報「long FromError[4]」の参照＜評価・変更窓＞
エラー発生にて異常終了した場合は、変数「FromError[4]」に情報が残しますのでプログラム修正の参考にする。なお、この変数の仕様および名称等に規約はありませんので自由に変更して利用する。

34

６．シリアル FlashROM プログラムを正規リリース登録する。
６－１）リリース登録のため Hew4 で「main.c」を開きビルドする。

「FROM_TEST」をコメントにして、＜ビルド＞―＜ビルド＞
でビルドする。

「0 Errors, 0 Warnings」を確認する。

35

６－２）
「DEF8K」の「ローダとアプリケーションの登録」に登録する。
１）フラッシュ ROM ライタープログラムの「参照」をクリックする。

シリアル FlashROM プログラムの開始アドレスと最終アドレスを表示する。

登録されているシリアル FlashROM の最大サイズとセクター数を表示する。

36

イレーズするセクター数を指定する。
ゼロ「0」指定の場合は、登録するアプリケーションサイズから自動で必要セクター数を算出してイレーズする。

６－３）「DEF8K」の「CPU 設定」にリリース環境を設定する。
１）「RAM」を選択する。
「ローダとアプリケーションの登録」に登録した「シリアル FlashROM プログラム」がパケット通信対応の場合は選択が可能になる。(128 / 256 / 512byte)

開始： 内蔵 RAM の先頭アドレス＋８番地を設定する。
サイズ：内蔵 RAM の最大サイズを設定する。
＜備考＞
アプリケーションの開始アドレスが内蔵 RAM の先頭アドレ
スと終了アドレスがセットされているため。

37

７．シリアル FlashROM プログラムの最終確認をする。
７－１）ターゲット基板側のモード設定「ブートモード３」（シリアルフラッシュメモリからブートする）に設定する。
７－２）「ローダとアプリケーションの登録」で確認する。
１）アプリケーションプログラムの「参照」をクリックする。

追加シリアル FlashROM 用のローダプログラムが未完成の場合はデフォルトで用意してある「C:¥Aone¥DEF8K¥rom-custom¥SH7268¥S25FL032P¥Loader¥debug¥S25FL032P_Loader.mot」
を一旦設定する。

アプリケーションプログラムの開始アドレスとサイズを表示する。

「CPU 設定」に設定した内蔵RAM サイスを表示する。

38

２）「書込み開始」をクリックする。

① FROM 書き込みプログラムの転送② FROM のセクターイレーズ③ 拡張パケットでの FROM への書き込み

39

７－３）
「アプリケーションプログラム」が正常に書き込みされたかベリファイで確認する。
【条件】この確認は、新規ローダープログラムが完成していることが条件になります。
１）ターゲットの電源を再投入後、ロード時間を待ってから接続する。
（参考）1.0M バイトコードのロード時間は約 5 秒②ターゲト基板をリセットする。

①「Start」をクリック

シリアル FlashROM
からロード後のアプリケーションプログ
ラム

40２）内蔵 RAM とベリファイする。

41

【ベリファイ中】【ベリファイ結果】

この結果表示によりシリアル FlashROM にアプリケーションプログラムが正常に書かれローダも正常に動作したことになる。

42

８．注意事項
・本文書の著作権は、エーワン（株）が保有します。
・本文書を無断での転載は一切禁止します。
・本文書に記載されている内容についての質問やサポートはお受けすることが出来ません。
・本文章に関して、ルネサス エレクトロニクス社への問い合わせは御遠慮願います。
・本文書の内容に従い、使用した結果、損害が発生しても、弊社では一切の責任は負わないものとします。
・本文書の内容に関して、万全を期して作成しましたが、ご不審な点、誤りなどの点がありましたら弊社までご連絡くだされば幸いです。
・本文書の内容は、予告なしに変更されることがあります。

〒486-0852
愛知県春日井市下市場町 6-9-20
エーワン株式会社

https://www.aone.co.jp
43