概要
ルネサスRX220マイコンのE2データフラッシュへデータを格納する処理を、できる限りシンプルにしてみました。
E2データフラッシュの仕様
項目 | 内容 |
---|---|
メモリ空間 | 8Kバイト |
アドレス | 0010 0000h~001F FFFFh |
プログラム単位 | 2バイトまたは8バイト |
イレーズ単位 | 128バイト |
内容
- 書き込み時には、問答無用で全空間イレース!
- ブランクチェックとかせずに、とにかくイレース!
- 書き込み/読み出しアドレスは、アドレス固定で先頭アドレスのみ!
- 書き込み/読み出しは、
unsigned short
の配列のみ対応(2byte書き込みのみ) - 引数の
length
には配列の要素数を指定(byte数じゃないよ!) - 8Kbyte以上の入力データは通知なしで破棄
- エラーチェック無し
- タイムアウトチェック無し
- 割り込み無し
- プロテクト系は解除したまま放置
- 周辺クロック通知は初回のみ
-
FLASH.PCKAR.WORD
へは、動作周波数を入力してください
サンプルコード
#include <machine.h>
#define E2_BASE_ADDR (0x00100000)
void e2_init(void)
{
// unprotect
FLASH.DFLRE0.WORD = 0x2D0F;
FLASH.DFLWE0.WORD = 0x1E0F;
// mode -> E2 P/E
FLASH.FENTRYR.WORD = 0xAA80;
FLASH.FWEPROR.BIT.FLWE = 1;
// preiod
FLASH.PCKAR.WORD = 20; // 20MHz
*((volatile unsigned char *)E2_BASE_ADDR) = 0xE9;
*((volatile unsigned char *)E2_BASE_ADDR) = 0x03;
*((volatile unsigned short *)E2_BASE_ADDR) = 0x0F0F;
*((volatile unsigned short *)E2_BASE_ADDR) = 0x0F0F;
*((volatile unsigned short *)E2_BASE_ADDR) = 0x0F0F;
*((volatile unsigned char *)E2_BASE_ADDR) = 0xD0;
while (!FLASH.FSTATR0.BIT.FRDY)
;
// mode -> ROM/E2 read
FLASH.FWEPROR.BIT.FLWE = 2;
FLASH.FENTRYR.WORD = 0xAA00;
}
void e2_write(unsigned short *data, int length)
{
// mode -> E2 P/E
FLASH.FENTRYR.WORD = 0xAA80;
FLASH.FWEPROR.BIT.FLWE = 1;
// erase (128byte * 64block = 8Kbyte)
for (int i = 0; i < 64; i++)
{
// block erase
*((volatile unsigned char *)(E2_BASE_ADDR + i * 128)) = 0x20;
*((volatile unsigned char *)(E2_BASE_ADDR + i * 128)) = 0xD0;
while (!FLASH.FSTATR0.BIT.FRDY)
;
}
// write (2byte * length)
for (int i = 0; i < min(length * 2, 8192); i += 2)
{
*((volatile unsigned char *)(E2_BASE_ADDR + i)) = 0xE8;
*((volatile unsigned char *)(E2_BASE_ADDR + i)) = 0x01;
*((volatile unsigned short *)(E2_BASE_ADDR + i)) = *data++;
*((volatile unsigned char *)(E2_BASE_ADDR + i)) = 0xD0;
while (!FLASH.FSTATR0.BIT.FRDY)
;
}
// mode -> ROM/E2 read
FLASH.FWEPROR.BIT.FLWE = 2;
FLASH.FENTRYR.WORD = 0xAA00;
}
void e2_read(unsigned short *data, int length)
{
// read (2byte * length)
for (int i = 0; i < min(length * 2, 8192); i += 2)
{
*data++ = *((unsigned short *)(E2_BASE_ADDR + i));
}
}
void main(void)
{
unsigned short e2rd[10];
unsigned short e2wd1[10] = {0, 11, 222, 3333, 44444, 5555, 666, 77, 8, 9999};
unsigned short e2wd2[8] = {9, 80, 700, 6000, 50000, 4000, 300, 20};
e2_init();
e2_write(e2wd1, 10);
e2_read(e2rd, 10);
e2_write(e2wd2, 8);
e2_read(e2rd, 8);
}