質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

1回答

901閲覧

RXマイコンのフラッシュモジュールについて

Nyanmage.neko

総合スコア7

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2023/10/30 07:35

編集2023/10/30 08:21

実現したいこと

  • RXマイコンにてフラッシュモジュールを使用してデータが消えないようにしたい。

前提

現在RX64Mマイコンを使用し、e2studioにてプログラムを書いています。
スマートコンフィグレータを使用してのコード生成を行っています。
コンポーネントのr_flash_rx(Ver5.10)を使用しようと考えています。
コンパイラ CC-RX V3.00

具体的な使用方法

RXマイコンで外部機器からのデータを受信し、電源リセット後も保持したいです。
例でいうと、uint8_t rxdDateという変数があり、この値に外部機器から送信されてきたデータuint8_t date = 150を代入したとします。そうすることでuint8_t rxdDate = 150となるので、この値を電源がOFFとなっても保存したく、再びデータが送信されてきた場合には上書きを行いたいです。

疑問点

上記のことを行うのに、r_flash_rxを使用すれば良さそうなのですが、ハードウェアマニュアルにはコードフラッシュメモリへの書き込みは図示されているのですが、データフラッシュメモリについては記載されていないように思えます。このコンポーネント自体が、エミュレーターなどを使わずにプログラムをマイコンに書きこみたい人を想定したものなのかと考えています。であれば、電源OFFで消えてほしくない変数のデータをROMに書き込み、電源ON後に読み出すには具体的にどうすれば良いのでしょうか。以下に、サンプルプログラムのコードを記載します。

C言語

1#include "platform.h" 2#include "r_flash_rx_if.h" 3#include "r_flash_rx_config.h" 4static uint32_t ram_vector_table[256]; // RAM space to hold the vector table 5static void flash_copy_vector_table(void); 6static void cf_driver_in_ram(void); 7 8volatile uint8_t g_buf[FLASH_CF_MIN_PGM_SIZE]; // FLASH_CF_MIN_PGM_SIZE is larger the DF block size=256 9void main(void); 10 11void main(void) 12{ 13 uint32_t addr, i; 14 flash_err_t err; 15 flash_res_t result; 16 17 for (i = 0; i < sizeof(g_buf); i++) 18 { 19 g_buf[i] = (uint8_t)i; 20 } 21 22 flash_copy_vector_table(); 23 24 err = R_FLASH_Open(); 25 if (err != FLASH_SUCCESS) 26 while(1); 27 28 cf_driver_in_ram(); 29 30 err = R_FLASH_Erase(FLASH_DF_BLOCK_0, 1); 31 if (err != FLASH_SUCCESS) 32 { 33 while(1) ; 34 } 35 36 err = R_FLASH_BlankCheck(FLASH_DF_BLOCK_0, FLASH_DF_BLOCK_SIZE, &result); 37 if ((err != FLASH_SUCCESS) || (result != FLASH_RES_BLANK)) 38 { 39 while(1) ; 40 } 41 42 err = R_FLASH_Erase(FLASH_DF_BLOCK_0, FLASH_NUM_BLOCKS_DF); 43 if (err != FLASH_SUCCESS) 44 { 45 while(1) ; 46 } 47 48 err = R_FLASH_BlankCheck(FLASH_DF_BLOCK_0, FLASH_DF_BLOCK_SIZE, &result); 49 if ((err != FLASH_SUCCESS) || (result != FLASH_RES_BLANK)) 50 { 51 while(1) ; 52 } 53 54 addr = FLASH_DF_BLOCK_0; 55 while (addr < (FLASH_DF_BLOCK_0 + FLASH_DF_BLOCK_SIZE)) 56 { 57 err = R_FLASH_Write((uint32_t)g_buf, addr, sizeof(g_buf)); 58 if(err != FLASH_SUCCESS) 59 { 60 while(1) ; 61 } 62 63 for (i=0; i < sizeof(g_buf); i++) 64 { 65 if (g_buf[i] != *((uint8_t *)(addr + i))) 66 while(1); 67 } 68 69 addr += sizeof(g_buf); 70 } 71 72 err = R_FLASH_Erase(FLASH_DF_BLOCK_0, FLASH_NUM_BLOCKS_DF); 73 if (err != FLASH_SUCCESS) 74 { 75 while(1) ; 76 } 77 78 addr = FLASH_DF_BLOCK_0; 79 while (addr < FLASH_DF_BLOCK_INVALID) 80 { 81 err = R_FLASH_Write((uint32_t)g_buf, addr, sizeof(g_buf)); 82 if(err != FLASH_SUCCESS) 83 { 84 while(1) ; 85 } 86 87 for (i = 0; i < sizeof(g_buf); i++) 88 { 89 if (g_buf[i] != *((uint8_t *)(addr + i))) 90 while(1); 91 } 92 93 addr += sizeof(g_buf); 94 } 95 96 while(1) 97 { 98 i++; // do nothing infinite loop 99 } 100} 101 102static void flash_copy_vector_table(void) 103{ 104 uint32_t *pvect_table; 105 106 pvect_table = (uint32_t *)__sectop("C$VECT"); 107 ram_vector_table[23] = pvect_table[23]; 108 set_intb((void *)ram_vector_table); 109} 110 111static void cf_driver_in_ram(void) 112{ 113 uint32_t i; 114 flash_err_t err; 115 volatile uint32_t addr; 116 117 err = R_FLASH_Control(FLASH_CMD_LOCKBIT_DISABLE, NULL); 118 if ( FLASH_SUCCESS != err) 119 { 120 while(1); 121 } 122 123 err = R_FLASH_Erase(FLASH_CF_BLOCK_104, 1); 124 if(err != FLASH_SUCCESS) 125 { 126 while(1) ; 127 } 128 129 addr = (uint32_t)FLASH_CF_BLOCK_104; 130 while (addr < ((uint32_t)FLASH_CF_BLOCK_104 + FLASH_CF_MEDIUM_BLOCK_SIZE)) 131 { 132 err = R_FLASH_Write((uint32_t)g_buf, addr, sizeof(g_buf)); 133 if(err != FLASH_SUCCESS) 134 { 135 while(1) ; 136 } 137 138 for (i = 0; i < sizeof(g_buf); i++) 139 { 140 if (g_buf[i] != *((uint8_t *)(addr + i))) 141 { 142 while(1) ; 143 } 144 } 145 146 addr += sizeof(g_buf); 147 } 148 149} 150

調査したことの補足

RX64Mマイコンを使用する場合は、フラッシュタイプ3(r_flash_type3.c)をダウンロードしたコンポーネントから選択し使用することとなっているようです。
また、コンパイル時の設定としてr_flash_rx_config.hにて処理の仕方を設定するようです。
例えば、「FLASH_CFG_DATA_FLASH_BGO 」はデータフラッシュメモリに関する処理の仕方を指定する設定値のようです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まずはこれをどうぞ
https://www.renesas.com/jp/ja/document/apn/rx-family-flash-module-using-firmware-integration-technology

これには、

本モジュールでは、MCU に内蔵されているフラッシュメモリ(コードフラッシュメモリ、
データフラッシュメモリ)を書き換えの対象としています。

とあります。

で、フラッシュメモリというのは、データの読み出しは普通のアクセスで読み出し可能です。
が、書き込みは特別の手順が必要で、一旦消去の作業を行ってから書き込みの操作を行う必要があるので注意しましょう

投稿2023/10/30 09:22

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nyanmage.neko

2023/10/30 23:01

ご回答ありがとうございます。 フラッシュメモリ特有の表現だとは思うのですが、このマニュアル内の「1.2 APIの概要」で「R_FLASH_BlankCheck()」と「R_FLASH_Write()」の説明文中に「領域にプログラムされていないことを~」「データをプログラムします」と記載されていますが、これはデータフラッシュメモリに関していえば、「領域にデータが書きこまれていないことを~」「データを書き込みます」と読み替えてもいいのでしょうか。 それとも根本的に通常の変数の書き込みとは違うものという意味でこのような表現になっているのでしょうか。 よろしくお願いします。
y_waiwai

2023/10/31 02:33

> 「領域にデータが書きこまれていないことを~」「データを書き込みます」と読み替えてもいいのでしょうか。 その理解でよろしいかとおもいます で、フラッシュメモリを消去、書き込みは特定の手順があって、普通の変数の書き込みでは値は変えられません。 そこらへんの手順はマニュアルに書いてあるのでよく読みましょう。 #で、フラッシュメモリの消去は、ブロック(64バイト区切り)ごとにしかできないとかありますんで #頑張って理解しましょう
Nyanmage.neko

2023/10/31 02:55

手順を確認します。ちなみにですが、プログラムを作成しデバックをした際に書きこんだ領域のイレースについても挙動を確認する必要があると思うのですが、プログラムの書き方がまずくてうまくイレースできずに、マイコンが使い物にならなくなるなどはあるのでしょうか。(メモリを使いつくしてしまう)
y_waiwai

2023/10/31 10:27

フラッシュメモリの寿命は、消去回数によって決まり、1万回から10万回程度となってます(そのマイコンのデータシートに書いてあります) よっぽどコードの組み方が不味くて消去動作を無限ループで実行してしまった、としても、寿命を食い尽くすまでには相当の時間がかかると思うので、そんなに恐れることはないかとは思います #昔のマイコンは書き換え回数が100回程度のものがあったりでヒヤヒヤしながらデバッグしたことがありましたが
Nyanmage.neko

2023/10/31 23:00

ご返信ありがとうございます。RX64Mは10万回イレース可能でした。 そのような書き込みも見たので、かなり慎重な作業になるのかなと思っていました。無限ループにさえ入れなければ大丈夫そうですね。そもそもフラッシュメモリのデータフラッシュへの読み出しイレース書き込みは電源ON時とOFF時しか使わないような気がするので、とりあえずは無限ループを回避するようにプログラムを作ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問