6. メモリ構造
6.1 メモリ空間
CH559のアドレス空間は、プログラム保存空間、内部データ保存空間、外部データ保存空間に分けられている。
図 6.1 メモリ構造
6.2 プログラム記憶空間
プログラムメモリ領域は64KBです。図6.1に示すように、命令コードを保存するコードフラッシュ領域、不揮発性データを保存するデータフラッシュ領域、構成情報を保存する構成情報領域など、すべてフラッシュROMに使用されます。
データフラッシュのアドレス範囲はF000h~F3FFHです。1バイト読み込み(8ビット)、2バイト書き込み(16ビット)、ブロック削除(1Kバイト)動作をサポートしています。チップの電源を切ってもデータは変化しません。
コードフラッシュには、ローアドレス領域用のアプリケーションコードとハイアドレス領域用のブートストラップコードがあります。また、これら2つの領域とデータフラッシュを組み合わせて、1つのアプリケーションコードを保持することもできます。
構成情報は必要に応じてプログラマが設定する合計16ビットのデータで表6.2を参照してください。
表6.2 フラッシュROMの構成情報の説明
ビット | 名前 | 説明 | リセット値 |
---|---|---|---|
15 | Code_Protect | フラッシュROMのコードとデータ保護モード: 0-プログラマが読み取ることを禁止する、プログラムは秘密です 1-読み出しを許可 | 0/1 |
14 | No_Boot_Load | BootLoader ブートコード起動モードを許可: 0-0000hアドレスのアプリケーションから起動 1-F400hアドレスのブートローダから起動 | 1 |
13 | En_Long_Reset | パワーオンリセット時の追加遅延リセットを許可: 0-スタンダードショートリセット 1-ワイドリセット、87mSリセット時間追加 | 0 |
12 | XT_OSC_Strong | 水晶振動子の外部駆動を選択: 0-基本 1-拡張 | 0 |
11 | En_P5.7_RESET | マニュアルリセット入力端子としてP5.7を有効: 0-無効 1-リセット有効 | 1 |
10 | En_P0_Pullup | システムリセット時にポートP0の内部プルアップ抵抗を有効: 0-リセット後、プルアップ抵抗は無効 1-リセット後、プルアップ抵抗が有効 | 1 |
9 | Must_1 | (必要に応じてプログラマが自動的に1に設定) | 1 |
8 | Must_0 | (必要に応じてプログラマが自動的に0に設定) | 0 |
[7:0] | All_1 | (必要に応じてプログラマが自動的にFFhに設定) | FFh |
6.3 データ保存領域
内部データ記憶領域は合計256バイトです。図6.1に示すように、SFRとiRAMに使用します。iRAMはスタックや高速データの一時記憶に使用されます。作業レジスタR0~R7、ビット変数bdata、バイト変数data、idataなどに細分化することができます。
外部データ保存領域は、図6.1に示すように合計64KBで、一部はxRAMとxSFRの6KBのオンチップ拡張に使用されます。2つの予約領域を除いて、残りの4000h~FFFFFhのアドレス範囲が外部バス領域となります。
6.4 フラッシュROMレジスタ
表6.4 フラッシュROMオペレーションレジスタ一覧
名前 | アドレス | 説明 | リセット値 |
---|---|---|---|
ROM_DATA_H | 8Fh | フラッシュROMデータレジスタ上位バイト | xxh |
ROM_DATA_L | 8Eh | フラッシュROMデータレジスタ下位バイト | xxh |
ROM_DATA | 8Eh | ROM_DATA_LとROM_DATA_Hで16ビットSFR | xxxxh |
ROM_STATUS | 86h | フラッシュROMステータスレジスタ(読み取り専用) | 80h |
ROM_CTRL | 86h | フラッシュROM制御レジスタ(書き込み専用) | 00h |
ROM_ADDR_H | 85h | フラッシュROMアドレスレジスタ上位バイト | xxh |
ROM_ADDR_L | 84h | フラッシュROMアドレスレジスタ下位バイト | xxh |
ROM_ADDR | 84h | ROM_ADDR_LとROM_ADDR_Hで16ビットSFR | xxxxh |
フラッシュROMアドレスレジスタ(ROM_ADDR):
ビット | 名前 | アドレス | Description | リセット値 |
---|---|---|---|---|
[7:0] | ROM_ADDR_H | RW | フラッシュROMアドレス上位バイト | xxh |
[7:0] | ROM_ADDR_L | RW | フラッシュROMアドレス下位バイト、偶数アドレスのみサポート | xxh |
フラッシュROMデータレジスタ(ROM_DATA):
ビット | 名前 | アドレス | Description | リセット値 |
---|---|---|---|---|
[7:0] | ROM_DATA_H | RW | 書き込むフラッシュROMデータ上位バイト | xxh |
[7:0] | ROM_DATA_L | RW | 書き込むフラッシュROMデータ下位バイト | xxh |
フラッシュROM制御レジスタ(ROM_CTRL):
ビット | 名前 | アドレス | Description | リセット値 |
---|---|---|---|---|
[7:0] | ROM_CTRL | W0 | フラッシュROM制御レジスタ | 00h |
フラッシュROMステータスレジスタ(ROM_STATUS):
ビット | 名前 | アドレス | 説明 | リセット値 |
---|---|---|---|---|
7 | 予約 | R0 | 予約 | 1 |
6 | bROM_ADDR_OK | R0 | フラッシュROM動作アドレス有効状態ビット: ビットが0の場合、パラメータは無効 1はアドレスが有効 | 0 |
[5:2] | 予約 | R0 | 予約 | 0000b |
1 | bROM_CMD_ERR | R0 | フラッシュROM動作コマンドエラーステータスビット: 0はコマンドが有効 1は不明なコマンド | 0 |
0 | bROM_CMD_TOUT | R0 | フラッシュROM動作結果ステータスビット: 0は操作が成功 1は操作がタイムアウト | 0 |
6.5 フラッシュROM操作手順
-
フラッシュROMを消去し、ターゲット・ブロックの全データ・ビットを1に変更:
- セキュリティモードを有効にする、SAFE_MOD=55h; SAFE_MOD=0AAh
- グローバルコンフィグレーションレジスタGLOBAL_CFGを書き込み可能に設定(bCODE_WEまたはbDATA_WEはコードまたはデータに対応)
- アドレスレジスタROM_ADDRを設定し、16ビットのターゲットアドレスを書き込む。実際には上位6ビットのみ有効
- 動作制御レジスタROM_CTRLを0A6hに設定してブロック消去動作を行うと、動作中にプログラムが自動的に一時停止します
- 操作が終了すると、プログラムは操作を再開します。この時、ステータスレジスタROM_STATUSを参照して動作状態を確認することができます。複数のブロックを消去する場合は、(3)(4)(5)の処理を繰り返します
- 再びセーフモードに入る。SAFE_MOD=55h; SAFE_MOD=0AAh
- グローバルコンフィグレーションレジスタGLOBAL_CFGを設定して、書き込み禁止(bCODE_WE=0、bDATA_WE=0)を有効にします
-
ターゲットの2バイトのデータビットの一部を1から0に変更するためにフラッシュROMを書き込みます:
- セキュリティモードを有効にする、SAFE_MOD=55h; SAFE_MOD=0AAh
- グローバルコンフィグレーションレジスタGLOBAL_CFGを書き込み可能に設定(bCODE_WEまたはbDATA_WEはコードまたはデータに対応)
- アドレスレジスタROM_ADDRを設定し、16ビットのターゲットアドレスを書き込む。実際には上位15ビットのみ有効
- データレジスタROM_DATAをセットし、データを16ビット書き込む。(3)(4)のステップを逆にすることができます
- 動作制御レジスタROM_CTRLを09Ahに設定して書き込み動作を行うと、動作中にプログラムが自動的に一時停止します
- 操作が終了すると、プログラムは操作を再開します。この時、ステータスレジスタROM_STATUSを参照して動作状態を確認することができます。複数のブロックを書き込みする場合は、(3)(4)(5)(6)の処理を繰り返します
- 再びセーフモードに入る。SAFE_MOD=55h; SAFE_MOD=0AAh
- グローバルコンフィグレーションレジスタGLOBAL_CFGを設定して、書き込み禁止(bCODE_WE=0、bDATA_WE=0)を有効にします
-
フラッシュROM読み取り:
- MOVC命令を使用して直接、またはプログラムメモリ空間へのポインタを使用して、ターゲットアドレスのコードやデータを読み出すことができます
6.6 オンボードプログラミングとISPダウンロード
構成情報Code_Protect=1の時、CH559チップのフラッシュROM内のコードとデータを外部プログラマが同期シリアルインタフェースを介して読み書きすることができます。構成情報Code_Protect=0の時、フラッシュROM内のコードとデータは保護されます。読み出すことはできませんが、消去し、消去後に電源を入れ直すことでコード保護を解除することができます。
CH559チップがBootLoaderブートローダでプリインストールされている場合、CH559は、アプリケーションをロードするためにUSBや非同期シリアルポートなどの複数のISPダウンロード方法をサポートすることができますが、ブートローダはありません。CH559は外部の専用プログラマがブートローダに書き込むことしかできません。またはアプリケーションです。オンボード・プログラミングをサポートするために、CH559とプログラマ間の接続ピンを5本、回路内に予約する必要があります。
表6.6.1 プログラマへの接続ピン
ピン | GPIO | ピン説明 |
---|---|---|
RST | P5.7 | プログラミング状態のリセットコントロールピン。HIGHレベルでプログラミング状態 |
SCS | P1.4 | チップセレクト入力端子(プログラミング状態)、デフォルトHIGHレベル、アクティブLOW |
SCK | P1.7 | プログラミング状態のクロック入力端子 |
MOSI | P1.5 | プログラミング状態のデータ入力端子 |
MISO | P1.6 | プログラミング状態のデータ出力端子 |
6.7 チップユニークID番号
各マイコンには、チップ識別番号と呼ばれる固有のID番号が出荷に付与されます。IDデータとそのチェックサムは合計8バイトで、専用リードオンリーメモリのオフセットアドレスが20hになる領域に格納されています。グローバル割り込みをクローズし、E_DISが1の期間に同様にコードフラッシュを読み出すことで取得することができます。動作はC言語のサンプルプログラムGETID.Cを参照してください。
表6.7.1 チップIDアドレステーブル
オフセットアドレス | IDデータ概要 |
---|---|
20h, 21h | ID番号の最初のワードデータの後に、下位バイトと次の下位バイトが続きます |
22h, 23h | IDセカンドワードデータの後に、ID番号の次の上位バイトが続きます |
24h, 25h | ID最後のワードデータの後に、48ビットのID番号の次の上位バイトと上位バイトが続く |
26h, 27h | ID検証に使用されるIDの最初のワード、第2ワード、最後のワードデータの16ビットの累積合計 |
ID番号は、ダウンロードツールで対象のプログラムを暗号化する際に使用することができます。一般的なアプリケーションでは、ID番号の最初の32桁だけを使用してください。