試作したRL78/G16のCPUボードのスタートアップ処理です。
以下の資料を参考にしています。
スタートアップ処理
CS+の新規プロジェクト作成でスタートアッププログラムができますが、汎用性が高く難しいので、ここでは新たに作成しました。電源ONから main()起動までの処理です。
1) オプション・バイト(0x0000C~0x000C3)のデータよりリセット解除電圧に達したらリセットを解除する。(資料1の「19.3 セレクタブル・パワーオン・リセット(SPOR)回路の動作」)
2)リセットベクタ(0x00000)に書かれているアドレスから実行
3)スタックポインタのセット
4)RAM領域の初期化
5)初期値付きグローバル変数の初期値をRAM領域へコピー
6) main()の実行
(.sdataセクションを使用しない、saddr配置変数(0xFFE20~0xFFF1Fに配置される初期値付き変数、初期値なし変数)を使用しない前提で作成しています。)
オプションバイトの設定
動作周波数やリセット解除電圧を設定します。ソースファイルで設定しています。
本実験では電源電圧を5[V]としています。このためSPOR検出電圧を、立ち上がり電圧=4.28[V],立ち下がり電圧=4.20[V]としました。(本設定では電源電圧=3.3[V]とした場合、リセットが解除されずCPUは動作しません。)
RAM領域の初期化
RAM(アドレス _RAM_ADDR_START~_STACK_ADDR_START)を0で初期化します。
変数初期値のコピー
ROM上の.data領域にある初期値付き変数の初期値を、RAM上の.dataR領域コピーします。(変数のため、初期値を書き換える場合があるため)
開発ツールの設定
CC-RL ビルドツールの設定
オンチップデバックとRAMモニタのため、リンクオプション→デバイスで設定します。
本実験では、ユーザ・オプション・バイトはファイルで設定します。
セクションは自動配置(デフォルト)設定です。
ROMからRAMへマップするセクションを編集します。
(セクション .sdataは使用しないため)
また関数や変数の配置を知るために、マップ情報を出力すると便利です。
E2 Liteデバックツールの設定
リセット解除後から表示:「CPUリセット後に指定シンボルまで実行する」=いいえ
実行中の変数表示:実行中のメモリアクセス「実行を一瞬停止してアクセスする」=はい
スタートアッププログラム
スタートアップだけのプログラムです。start_up.cは cのファイルですが中身はアセンブラで記述しています。(インラインアセンブラ)
iodefibne.hは、RL78/G16(ROM16KB)のR5F121BAxFP(32pin)の「新規プロジェクト作成」で作成されたファイルです。
ファイル一覧
・GitHub登録場所: https://github.com/vABCWork/rl78_startup
・開発環境
無償評価版 CS+ for CC V8.11.00 [30 Nov 2023]
CC-RL V1.13.00
ダウンロード後の状態
スタートアッププログラムをダウンロードした状態です。CC-RLの設定「リンクオプション→デバイス」で、オンチップデバック、RRM、DMMを設定すると、モニタ用のプログラムがユーザのROM領域に書き込まれます。(資料1「23.4 ユーザ資源の確保」)
リセットベクタはモニタプログラムの先頭を示しています。0x00002,0x00003には、リンクオプションで設定した、RRM/DMM機能用ワーク領域開始アドレスの下位16ビットが書き込まれています。0x000ceからモニタプログラム( セクション名 .monitor1)が10バイト入ります。0x000d8が、実際のプログラムの開始です。
その他
メモリマップ(デバックモニタあり)
オンチップデバック、RRM、DMMを設定してデバック用モニタを含めた場合のメモリマップです。(資料1の「23.4 ユーザ資源の確保」)
ミラー領域
資料4に説明されています。ここでは図解にしました。
ミラー領域とは、ROMに書かれている定数(const宣言)を、読み出す際にプログラムサイズを少なくするためにデータ領域から読み出しできるようにした領域です。
RL78のアドレス空間は 1Mbyte(0x00000~0xFFFFF)あり、アドレスの指定には20ビット必要です。-----①
データ読み出しには、読み出しアドレスをレジスタで指定しますが、レジスタは16ビットのため、指定できるアドレスは0x0000~0xFFFF(64Kbyte)の範囲です。-----②
ESレジスタで上位4ビットを指定すれば、全アドレス空間を指定できますが、
コードサイズが大きくなります。-----③
このためRL78では、0x00000~0x0FFFFにあるプログラムコードと、0xF0000~0xFFFFFにあるデータは、下位16ビットのアドレスだけで読み出しできるよう設計しました。-----④
定数データ(const)はROMに書き込む必要があるため、コード領域に置かれますが、データを16ビットのアドレスでReadするには、0xF0000~0xFFFFFに置く必要があります。
ミラー領域(0xF0800~0xF7FFF)を持つことで、これらのROMデータも16bitのアドレス指定でReadできるので、プログラムサイズも小さくなります。-----⑤
起動時にフラッシュROMを消去する (E2 Lite設定)
E2 Liteには、「起動時にフラッシュROMを消去する」設定があります。
これは次の状況で「はい」を選択しました。
CPUのフラッシュ上のオプションバイトのSPOR検出電圧設定(0x 000c1) = 0xF3(立ち上がり電圧=4.28[V],立ち下がり電圧=4.20[V])が書き込まれてる状態で、
電源電圧=3.3[V]とした場合、CPUのリセットは解除されず動作しません。
「はい」とすれば、E2接続時にフラッシュを消去してくれます。
プロジェクトの作成法
CS+のメニュー「ファイル」→「新規作成」→「新しいプロジェクト作成」→マイコン選択→RL78/G16(ROM16KB)のR5F121BAxFP(32pin)→プロジェクト名入力→作成ボタン によりファイルを作成します。本実験で必要なファイルは、iodefine.hだけです。