00001
00098 #include "compiler.h"
00099 #include "print_funcs.h"
00100 #include "board.h"
00101 #include "power_clocks_lib.h"
00102 #include "flashc.h"
00103
00104
00107 typedef const struct
00108 {
00109 U8 var8;
00110 U16 var16;
00111 U8 var8_3[3];
00112 U32 var32;
00113 } nvram_data_t;
00114
00115
00117 #if defined (__GNUC__)
00118 __attribute__((__section__(".flash_nvram")))
00119 #endif
00120 static nvram_data_t flash_nvram_data
00121 #if defined (__ICCAVR32__)
00122 @ "FLASH_NVRAM"
00123 #endif
00124 ;
00125
00127 #if defined (__GNUC__)
00128 __attribute__((__section__(".userpage")))
00129 #endif
00130 static nvram_data_t user_nvram_data
00131 #if defined (__ICCAVR32__)
00132 @ "USERDATA32_C"
00133 #endif
00134 ;
00135
00136
00141 static void print_nvram_variables(nvram_data_t *nvram_data)
00142 {
00143 print_dbg("var8:\t0x");
00144 print_dbg_char_hex(nvram_data->var8);
00145
00146 print_dbg("\nvar16:\t0x");
00147 print_dbg_short_hex(nvram_data->var16);
00148
00149 print_dbg("\nvar8_3:\t0x");
00150 print_dbg_char_hex(nvram_data->var8_3[0]);
00151 print_dbg_char_hex(nvram_data->var8_3[1]);
00152 print_dbg_char_hex(nvram_data->var8_3[2]);
00153
00154 print_dbg("\nvar32:\t0x");
00155 print_dbg_hex(nvram_data->var32);
00156
00157 print_dbg_char('\n');
00158 }
00159
00160
00167 static void flash_rw_example(const char *caption, nvram_data_t *nvram_data)
00168 {
00169 static const U8 write_data[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
00170
00171 print_dbg(caption);
00172
00173 print_dbg("Initial values of NVRAM variables:\n");
00174 print_nvram_variables(nvram_data);
00175
00176 print_dbg("\nClearing NVRAM variables...");
00177 flashc_memset((void *)nvram_data, 0x00, 8, sizeof(*nvram_data), TRUE);
00178 print_dbg("\nNVRAM variables cleared:\n");
00179 print_nvram_variables(nvram_data);
00180
00181 print_dbg("\nWriting new values to NVRAM variables...");
00182 flashc_memcpy((void *)&nvram_data->var8, &write_data, sizeof(nvram_data->var8), TRUE);
00183 flashc_memcpy((void *)&nvram_data->var16, &write_data, sizeof(nvram_data->var16), TRUE);
00184 flashc_memcpy((void *)&nvram_data->var8_3, &write_data, sizeof(nvram_data->var8_3), TRUE);
00185 flashc_memcpy((void *)&nvram_data->var32, &write_data, sizeof(nvram_data->var32), TRUE);
00186 print_dbg("\nNVRAM variables written:\n");
00187 print_nvram_variables(nvram_data);
00188 }
00189
00190
00194 int main(void)
00195 {
00196
00197 pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00198
00199
00200 init_dbg_rs232(FOSC0);
00201
00202
00203 flash_rw_example("\x0C=== Using a piece of the flash array as NVRAM ==================================\n",
00204 &flash_nvram_data);
00205
00206
00207 flash_rw_example("\n\n=== Using a piece of the User page as NVRAM ====================================\n",
00208 &user_nvram_data);
00209
00210 while (TRUE);
00211 }