実現したいこと
- 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 」はデータフラッシュメモリに関する処理の仕方を指定する設定値のようです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/30 23:01
2023/10/31 02:33
2023/10/31 02:55
2023/10/31 10:27
2023/10/31 23:00