番外 LPC810 EEPROM エミュレーション
LPC810のEEPROMエミュレーションプログラムを紹介します。
PICのEEPROMエミュレーションのページも参考にしてください。
<エミュレーションプログラムの仕様>
1.サイズ (128Tumbワード)(256バイト)、実行中レジスタr1とr2以外は書き換えない。
2.EEPROMアドレス 0x00~0x0E 15個
3.EEPROMデータ 最小値0x00000000、最大値0x0FFFFFFF(268435455)
4.仮想EEPROM空間
16ワード(64バイト)の連続したFlash領域を2ページ使用、
テストプログラムではPage0:0x00000D00~0x00000D3FとPage1:0x00000D40~0x00000D7Fを使用
5.機能
initial_eeprom EEPROM領域に0xFFFFFFFFを書き込み初期化する。
read_eeprom r1レジスタで指定したEEPROMアドレスのEEPROMデータをr2レジスタに書き込む。
write_eeprom r1レジスタで指定したEEPROMアドレスにr2レジスタで指定したEEPROMデータを書き込む。
6.使用レジスタ 最大3(r0,r1,r2)
r0レジスタで作業用バッファーの先頭アドレスを指定、作業用バッファーは 16+5ワード(84バイト)必要

指定した値が範囲を超えたときは書き込み読み出しを行わず、r1レジスタの値を書き換えて戻る
read/write status ----> EEPROMアドレスが0x0Eを超えた r1 |= 0x80
write status ----> EEPROMデータが0x0FFFFFFFを超えた r1 |= 0x40
読み出し時、指定したEEPROMアドレスにデータが存在しないときはr1レジスタの値を書き換えて戻る、
このときr2レジスタには0x0FFFFFFFがセットされる。
read status ----> There is no data in the specified EEaddress r1 |= 0x20
7.アセンブラでの使用例
ldr r0,=#XXXXXXXX @r0に作業用バッファーの先頭アドレスをセット
movs r1,#Y @r1にEEPROMアドレスをセット
ldr r2,=#ZZZZZZZZ @r2にEEPROMデータをセット
bl write_eeprom @サブルーチン呼び出し
8.フラッシュ内部のデータ形式
EEdata =< 0x0FFFFFFF EEdata (upper 28bits)
EEaddress < 0xF EEaddress (lower 4 bits)
EEPROM Data Format(word): [EEdata31:4|EEaddress3:0]
9.制約事項
Page0とPage1は128ワード境界に配置しなければならない。
O PAGE0=0x00000E00, PAGE1=0x00000E40
X PAGE0=0x00000E40, PAGE1=0x00000E80
O PAGE0=0x00000E80, PAGE1=0x00000EC0
X PAGE0=0x00000EC0, PAGE1=0x00000F00
O PAGE1=0x00000E00, PAGE0=0x00000E40
X PAGE1=0x00000E40, PAGE0=0x00000E80
O PAGE1=0x00000E80, PAGE0=0x00000EC0
X PAGE1=0x00000EC0, PAGE0=0x00000F00
<テスト回路>
前ページのものと一緒です。シリアル入出力にPIO0_0とPIO0_1を使用

<テストプログラムの動作> テストプログラムの動作確認にはターミナルソフトが必要です。
1.まず i コマンドでEEPROM領域(Page0,Page1)をクリア
i コマンド実行後は必ずPage0が書き込み読み出しに使用される。

2.EEPROMにデータを書き込む、コマンドw05544332
アドレス0x0にデータ0x5544332(7桁)を書き込む、右のr1,r2は書き込み後のレジスタ値(戻り値)を示す。

3.アドレス0x0の値を読み出す、コマンドr0
アドレス0x0には最初に0x1234567が書き込まれていたが、直前に上書きした5544332が読み出される。

4.さらに書き込みを続ける、あと1回書き込むとページ0が満杯になる。

5.次のデータを書き込む。
Page0が使用できなくなるので、Page0のデータを整理してPage1にコピー。
Page0は消去される。直前に書き込まれたアドレス0x4の値0xcccccccはPage1に書き込まれている。

6.次のデータを書き込む、以後仮想EEPROM空間としてPage1が使用される。
アドレス0x0のデータ0x2345678がPage1に書き込まれる。
Page1が満杯になるとPage1のデータをPage0に移動し、Page1を消去、以後これを繰り返す。
Pageのサイズが許されるアドレスより常に大きい為、移動の過程でデータの欠損はない。

7.最後にもう一度イニシャライズして消去の動作を再確認

※追記
最初にハーフワード(16bit)仕様のEEPROMエミュレーションを検討したのですが、
フラッシュの書き込みをハーフワード毎に行うとデータが化けてしまうことがわかりました。
ハーフワード毎で書き込みを行った例。
アドレス0x01にデータ0x234を連続書き込み。上位ハーフワードでデータが化ける。バッファーの値は正常

ソース一式のダウンロード先
http://hp.vector.co.jp/authors/VA058115/
https://drive.google.com/file/d/1CyThVKJp-yb_WA3wZS8dY_vn44CU11vb/view?usp=drivesdk
ダウンロードしたZIPファイルは圧縮プロジェクトとしてLPCXpressoからインポートすることが可能です。
.
PICのEEPROMエミュレーションのページも参考にしてください。
<エミュレーションプログラムの仕様>
1.サイズ (128Tumbワード)(256バイト)、実行中レジスタr1とr2以外は書き換えない。
2.EEPROMアドレス 0x00~0x0E 15個
3.EEPROMデータ 最小値0x00000000、最大値0x0FFFFFFF(268435455)
4.仮想EEPROM空間
16ワード(64バイト)の連続したFlash領域を2ページ使用、
テストプログラムではPage0:0x00000D00~0x00000D3FとPage1:0x00000D40~0x00000D7Fを使用
5.機能
initial_eeprom EEPROM領域に0xFFFFFFFFを書き込み初期化する。
read_eeprom r1レジスタで指定したEEPROMアドレスのEEPROMデータをr2レジスタに書き込む。
write_eeprom r1レジスタで指定したEEPROMアドレスにr2レジスタで指定したEEPROMデータを書き込む。
6.使用レジスタ 最大3(r0,r1,r2)
r0レジスタで作業用バッファーの先頭アドレスを指定、作業用バッファーは 16+5ワード(84バイト)必要

指定した値が範囲を超えたときは書き込み読み出しを行わず、r1レジスタの値を書き換えて戻る
read/write status ----> EEPROMアドレスが0x0Eを超えた r1 |= 0x80
write status ----> EEPROMデータが0x0FFFFFFFを超えた r1 |= 0x40
読み出し時、指定したEEPROMアドレスにデータが存在しないときはr1レジスタの値を書き換えて戻る、
このときr2レジスタには0x0FFFFFFFがセットされる。
read status ----> There is no data in the specified EEaddress r1 |= 0x20
7.アセンブラでの使用例
ldr r0,=#XXXXXXXX @r0に作業用バッファーの先頭アドレスをセット
movs r1,#Y @r1にEEPROMアドレスをセット
ldr r2,=#ZZZZZZZZ @r2にEEPROMデータをセット
bl write_eeprom @サブルーチン呼び出し
8.フラッシュ内部のデータ形式
EEdata =< 0x0FFFFFFF EEdata (upper 28bits)
EEaddress < 0xF EEaddress (lower 4 bits)
EEPROM Data Format(word): [EEdata31:4|EEaddress3:0]
9.制約事項
Page0とPage1は128ワード境界に配置しなければならない。
O PAGE0=0x00000E00, PAGE1=0x00000E40
X PAGE0=0x00000E40, PAGE1=0x00000E80
O PAGE0=0x00000E80, PAGE1=0x00000EC0
X PAGE0=0x00000EC0, PAGE1=0x00000F00
O PAGE1=0x00000E00, PAGE0=0x00000E40
X PAGE1=0x00000E40, PAGE0=0x00000E80
O PAGE1=0x00000E80, PAGE0=0x00000EC0
X PAGE1=0x00000EC0, PAGE0=0x00000F00
<テスト回路>
前ページのものと一緒です。シリアル入出力にPIO0_0とPIO0_1を使用

<テストプログラムの動作> テストプログラムの動作確認にはターミナルソフトが必要です。
1.まず i コマンドでEEPROM領域(Page0,Page1)をクリア
i コマンド実行後は必ずPage0が書き込み読み出しに使用される。

2.EEPROMにデータを書き込む、コマンドw05544332
アドレス0x0にデータ0x5544332(7桁)を書き込む、右のr1,r2は書き込み後のレジスタ値(戻り値)を示す。

3.アドレス0x0の値を読み出す、コマンドr0
アドレス0x0には最初に0x1234567が書き込まれていたが、直前に上書きした5544332が読み出される。

4.さらに書き込みを続ける、あと1回書き込むとページ0が満杯になる。

5.次のデータを書き込む。
Page0が使用できなくなるので、Page0のデータを整理してPage1にコピー。
Page0は消去される。直前に書き込まれたアドレス0x4の値0xcccccccはPage1に書き込まれている。

6.次のデータを書き込む、以後仮想EEPROM空間としてPage1が使用される。
アドレス0x0のデータ0x2345678がPage1に書き込まれる。
Page1が満杯になるとPage1のデータをPage0に移動し、Page1を消去、以後これを繰り返す。
Pageのサイズが許されるアドレスより常に大きい為、移動の過程でデータの欠損はない。

7.最後にもう一度イニシャライズして消去の動作を再確認

※追記
最初にハーフワード(16bit)仕様のEEPROMエミュレーションを検討したのですが、
フラッシュの書き込みをハーフワード毎に行うとデータが化けてしまうことがわかりました。
ハーフワード毎で書き込みを行った例。
アドレス0x01にデータ0x234を連続書き込み。上位ハーフワードでデータが化ける。バッファーの値は正常

ソース一式のダウンロード先
Bequest333のページ(別館)
https://drive.google.com/file/d/1CyThVKJp-yb_WA3wZS8dY_vn44CU11vb/view?usp=drivesdk
ダウンロードしたZIPファイルは圧縮プロジェクトとしてLPCXpressoからインポートすることが可能です。
.
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT