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 table5static 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=2569void 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 loop99 }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

コメントを投稿

0 コメント