LoginSignup
3
3

More than 3 years have passed since last update.

この世で最もシンプルな、RX220内蔵E2データフラッシュのサンプルコード(2byte書き込み版)

Last updated at Posted at 2020-03-02

概要

ルネサス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);
}

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3