00001
00097 #include "compiler.h"
00098 #include "print_funcs.h"
00099 #include "board.h"
00100 #include "power_clocks_lib.h"
00101 #include "flashcdw.h"
00102
00103 #if BOARD == UC3L_EK
00104 # define EXAMPLE_TARGET_DFLL_FREQ_HZ 96000000 // DFLL target frequency, in Hz
00105 # define EXAMPLE_TARGET_MCUCLK_FREQ_HZ 12000000 // MCU clock target frequency, in Hz
00106 # define EXAMPLE_TARGET_PBACLK_FREQ_HZ 12000000 // PBA clock target frequency, in Hz
00107
00109
00110 static scif_gclk_opt_t gc_dfllif_ref_opt = { SCIF_GCCTRL_SLOWCLOCK, 0, OFF};
00111 static pcl_freq_param_t pcl_dfll_freq_param =
00112 {
00113 .main_clk_src = PCL_MC_DFLL0,
00114 .cpu_f = EXAMPLE_TARGET_MCUCLK_FREQ_HZ,
00115 .pba_f = EXAMPLE_TARGET_PBACLK_FREQ_HZ,
00116 .pbb_f = EXAMPLE_TARGET_PBACLK_FREQ_HZ,
00117 .dfll_f = EXAMPLE_TARGET_DFLL_FREQ_HZ,
00118 .pextra_params = &gc_dfllif_ref_opt
00119 };
00121 #else
00122 # define EXAMPLE_TARGET_PBACLK_FREQ_HZ FOSC0 // PBA clock target frequency, in Hz
00123 #endif
00124
00127 typedef const struct
00128 {
00129 U8 var8;
00130 U16 var16;
00131 U8 var8_3[3];
00132 U32 var32;
00133 } nvram_data_t;
00134
00135
00137 #if __GNUC__
00138 __attribute__((__section__(".flash_nvram")))
00139 #endif
00140 static nvram_data_t flash_nvram_data
00141 #if __ICCAVR32__
00142 @ "FLASH_NVRAM"
00143 #endif
00144 ;
00145
00147 #if __GNUC__
00148 __attribute__((__section__(".userpage")))
00149 #endif
00150 static nvram_data_t user_nvram_data
00151 #if __ICCAVR32__
00152 @ "USERDATA32_C"
00153 #endif
00154 ;
00155
00156
00161 static void print_nvram_variables(nvram_data_t *nvram_data)
00162 {
00163 print_dbg("var8:\t0x");
00164 print_dbg_char_hex(nvram_data->var8);
00165
00166 print_dbg("\nvar16:\t0x");
00167 print_dbg_short_hex(nvram_data->var16);
00168
00169 print_dbg("\nvar8_3:\t0x");
00170 print_dbg_char_hex(nvram_data->var8_3[0]);
00171 print_dbg_char_hex(nvram_data->var8_3[1]);
00172 print_dbg_char_hex(nvram_data->var8_3[2]);
00173
00174 print_dbg("\nvar32:\t0x");
00175 print_dbg_hex(nvram_data->var32);
00176
00177 print_dbg_char('\n');
00178 }
00179
00180
00187 static void flash_rw_example(const char *caption, nvram_data_t *nvram_data)
00188 {
00189 static const U8 write_data[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
00190
00191 print_dbg(caption);
00192
00193 print_dbg("Initial values of NVRAM variables:\n");
00194 print_nvram_variables(nvram_data);
00195
00196 print_dbg("\nClearing NVRAM variables...");
00197 flashcdw_memset((void *)nvram_data, 0x00, 8, sizeof(*nvram_data), TRUE);
00198 print_dbg("\nNVRAM variables cleared:\n");
00199 print_nvram_variables(nvram_data);
00200
00201 print_dbg("\nWriting new values to NVRAM variables...");
00202 flashcdw_memcpy((void *)&nvram_data->var8, &write_data, sizeof(nvram_data->var8), TRUE);
00203 flashcdw_memcpy((void *)&nvram_data->var16, &write_data, sizeof(nvram_data->var16), TRUE);
00204 flashcdw_memcpy((void *)&nvram_data->var8_3, &write_data, sizeof(nvram_data->var8_3), TRUE);
00205 flashcdw_memcpy((void *)&nvram_data->var32, &write_data, sizeof(nvram_data->var32), TRUE);
00206 print_dbg("\nNVRAM variables written:\n");
00207 print_nvram_variables(nvram_data);
00208 }
00209
00210
00214 int main(void)
00215 {
00216 #if BOARD == UC3L_EK
00217
00218
00219
00220 pcl_configure_clocks(&pcl_dfll_freq_param);
00221
00222
00223
00224
00225
00226 #else
00227
00228
00229
00230 pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00231 #endif
00232
00233
00234 init_dbg_rs232(EXAMPLE_TARGET_PBACLK_FREQ_HZ);
00235
00236
00237 flash_rw_example("\x0C=== Using a piece of the flash array as NVRAM ==================================\n",
00238 &flash_nvram_data);
00239
00240
00241 flash_rw_example("\n\n=== Using a piece of the User page as NVRAM ====================================\n",
00242 &user_nvram_data);
00243
00244
00245
00246
00247
00248
00249
00250
00251 pcl_disable_module(DBG_USART_CLOCK_MASK);
00252
00253
00254
00255 pcl_disable_module(AVR32_PDCA_CLK_HSB);
00256 pcl_disable_module(AVR32_PDCA_CLK_PBA);
00257
00258
00259
00260
00261 AVR32_INTC.ipr[0];
00262
00263
00264 SLEEP(AVR32_PM_SMODE_STATIC);
00265
00266 while (TRUE);
00267 }