スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

データフラッシュ実装


はようございます。
前回の更新でMiceのHPに表示されるようになったのですが、
久しぶりすぎてこのブログの主が誰だか知られていない気がします。
なので、今年のマウス達を3行で紹介します。

クラシック:Sylpheed3
 Miceで流行っている赤い変則4輪吸引マウスの初代です。
 後輩のマウスの方が速いので影の薄い子です。
 ブラシレスモータを使って煙突モータをなくしたスマートな見た目にしたつもりです。
 
ハーフ:Sylphy
 今年の新作マウスです。
 ハーフは初めてなのでお手柔らかにお願いします。
 ハードトラブルに悩まされて遅々として作業が進みませんが、大会までには走らせます。

大会で見かけたら声をかけてくれると嬉しく思います。

話は変わって、前回の記事ですが、非常に読みづらくなってスイマセン。
これからデータフラッシュの使い方について書くつもりですが、
前回よりは読みやすく書くつもりですので、最後までお付き合いください。


回の記事がデータフラッシュ導入の手助けになっていれば幸いですが、
なんとか導入できても使い方がわからないとの声を頂きましたので、
今回はシンプルフラッシュAPIの使い方について説明します。

Renesasのマニュアルにはたくさんの関数が書かれていますが、
データフラッシュをただ使うだけなら以下の3つの関数だけで事足ります。

 1.R_FlashDataAreaAccess :データフラッシュ領域の書き換えの許可を行う関数
 2.R_FlashErase :データフラッシュ領域をブロック毎に消去する関数
 3.R_FlashWrite :データフラッシュ領域にデータを書き込む関数

以下にこれらの関数の簡単な使い方を紹介します。

1.R_FlashDataAreaAccess
 この関数はデータフラッシュ領域のアクセスまたは書き換えを許可します。
 この関数が一度も呼び出されていないときにはデータフラッシュの読み出し、書き込み、消去はできません。
なので、プログラムの冒頭に

R_FlashDataAreaAccess(0xFFFF, 0xFFFF);

と記述してください。

2.R_FlashErase
 データフラッシュの書き換えを行うには一度データを消去しなければならないので、
この関数を用いてブロックごとに消去を行います。
 引数に消去するブロックを代入しますが、この値はr_flash_api_rx○○○.hで定義されています。
 (※データフラッシュの領域はBLOCK_DB○○だけなので、BLOCK_○○は別領域です。)
使い方の例としては、

uint32_t loop;
uint8_t ret;

for(loop = BLOCK_DB0; loop < BLOCK_DB15; loop++) {
ret = R_FlashErase(loop);
if (FLASH_SUCCESS != ret) {
. . .
}
}

みたいな感じで全ブロックの消去を行います。

3.R_FlashWrite
 フラッシュメモリにデータを書き込む関数です。引数ごとに説明します。

①flash_addr
 書き込む先を指すポインタです。
この引数は、消去関数と同様に、r_flash_api_rx○○○.hで定義されており、以下のように呼び出すことができます。

flash_addr = g_flash_BlockAddresses(BLOCK_DB0);


②buffer_addr
 書き込むデータを指すポインタです。
この引数は、書き込みたいデータをキャストして渡すだけです。
例として、壁情報の配列を保存したい場合は以下のようになると思います。

unsigned char wall[16][16];

buffer_addr = (uint32_t)wall;


③bytes
 書き込むデータの型サイズを指す値です。
byte単位で渡すので、上の例だと16x16=256です。
自分で計算するのが面倒ならsizeof関数を使うと便利です。

 以上で、データフラッシュの書き込み関数の説明が終わりです。
 最後にまとめとして、サンプルコードを掲載しておきます。

unsigned char wa]][16][16];
uint32_t flash_addr = g_flash_BlockAddresses[BLOCK_DB0];
uint32_t buffer_addr = (uint32_t)wall;
uint16_t bytes = sizeof(wall)

ret = R_FlashWrite(flash_addr, buffer_addr, bytes);
if (FLASH_SUCCESS != ret) {
. . .
}

 注意点として、書き込みを行う際は、ブロックの先頭から書き込み始めなければならず、
書き込むバイト数は、書き込みラインサイズの倍数でなければなりません。
 書き込みラインサイズは、RX62Tなら8byte、RX631なら2byteだったはずです。

後に、どうやってデータフラッシュに書き込んだデータを読み出すかについて説明します。
 書き込んだ先のアドレスがわかっているので、C言語のポインタが判る人なら説明はいらないと思いますが、
ポインタはわからないけどデータフラッシュは使いたいなんていう我儘な人たちのために軽く説明します。
 これを機にポインタの勉強をされることをオススメします。ポインタは非常に便利ですよ?

 書き込んだ先のアドレス、つまり、書き込んだ配列の先頭の場所がわかっているので、
先頭のアドレスを呼び出したい型にキャストするだけです。
 壁情報の例だと、wall[0][0]のアドレスが書き込み関数で使ったflash_addrに当たるので、
これをunsigned charのポインタにキャストして、さらにポインタを値としてキャストすれば読み出せます。
 wall[1][0]を読み出したければ、先頭のアドレスを1配列分ずらして読み出します。
 きっとポインタがわからない人からするとちんぷんかんぷんですよね。
 以下に、保存した壁情報を読み出すサンプルコードを載せておきます。

int i, j;
unsigned char wall[16][16];
uint32_t address;

address = g_flash_BlockAddresses[BLOCK_DB0];
for(j = 0; j < 16; j++){
for(i = 0; i < 16; i++){
wall[i][j] = *(unsigned char *)(address + 16*i + j);
}
}

 これでデータフラッシュに保存した壁情報が読み出せると思います。

上で、データフラッシュの使い方の説明を終わります。
 この記事が誰かの役に立てば幸甚です。



スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

Author:コヒロ
某自動車会社の子会社に就職した新入社員。某五年制大学のサークルでマイクロマウスを製作していました。現在も製作中。パソコン、自転車、読書などなど多趣味で中途半端な人間です。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。