00001
00108 #if defined (__GNUC__)
00109 # include "intc.h"
00110 #endif
00111
00112 #define _ASSERT_ENABLE_
00113 #include "compiler.h"
00114 #include "print_funcs.h"
00115 #include "board.h"
00116 #include "cycle_counter.h"
00117 #include "power_clocks_lib.h"
00118
00119
00120 #if BOARD == UC3L_EK
00121 # define EXAMPLE_TARGET_DFLL_FREQ_HZ 96000000 // DFLL target frequency, in Hz
00122 # define EXAMPLE_TARGET_MCUCLK_FREQ_HZ 12000000 // MCU clock target frequency, in Hz
00123 # define EXAMPLE_TARGET_PBACLK_FREQ_HZ 12000000 // PBA clock target frequency, in Hz
00124 #endif
00125
00126
00127 #define NB_CLOCK_CYCLE_DELAY_SHORT 1000000 // 83.3 ms if fCPU==12MHz
00128 #define NB_CLOCK_CYCLE_DELAY_LONG 20000000 // 1.67 s if fCPU==12MHz
00129
00130
00131
00132 static volatile unsigned int u32NbCompareIrqTrigger = 0;
00133
00134
00135 static volatile unsigned char u8DisplayMsg = 0;
00136
00137
00138 #if defined(__GNUC__)
00139
00140
00141 __attribute__((__interrupt__))
00142 #elif defined(__ICCAVR32__)
00143
00144
00145
00146 #if ((defined(__AT32UC3L016__) \
00147 || defined(__AT32UC3L032__) \
00148 || defined(__AT32UC3L064__) \
00149 || defined (__AT32UC3C064C__) || defined (__AT32UC3C0128C__) \
00150 || defined (__AT32UC3C0256C__) || defined (__AT32UC3C0512C__) \
00151 || defined (__AT32UC3C164C__) || defined (__AT32UC3C1128C__) \
00152 || defined (__AT32UC3C1256C__) || defined (__AT32UC3C1512C__) \
00153 || defined (__AT32UC3C264C__) || defined (__AT32UC3C2128C__) \
00154 || defined (__AT32UC3C2256C__) || defined (__AT32UC3C2512C__)))
00155 #pragma handler = AVR32_CORE_IRQ_GROUP0, 0
00156 #else
00157 #pragma handler = AVR32_CORE_IRQ_GROUP, 0
00158 #endif
00159 __interrupt
00160 #endif
00161 static void compare_irq_handler(void)
00162 {
00163
00164 u32NbCompareIrqTrigger++;
00165 u8DisplayMsg = 1;
00166
00167
00168
00169
00170 Set_sys_compare(NB_CLOCK_CYCLE_DELAY_LONG);
00171 }
00172
00173
00174 #if BOARD == UC3L_EK
00175
00177
00178 static scif_gclk_opt_t gc_dfllif_ref_opt = { SCIF_GCCTRL_SLOWCLOCK, 0, OFF};
00179 static pcl_freq_param_t pcl_dfll_freq_param =
00180 {
00181 .main_clk_src = PCL_MC_DFLL0,
00182 .cpu_f = EXAMPLE_TARGET_MCUCLK_FREQ_HZ,
00183 .pba_f = EXAMPLE_TARGET_PBACLK_FREQ_HZ,
00184 .pbb_f = EXAMPLE_TARGET_PBACLK_FREQ_HZ,
00185 .dfll_f = EXAMPLE_TARGET_DFLL_FREQ_HZ,
00186 .pextra_params = &gc_dfllif_ref_opt
00187 };
00189 #endif
00190
00191
00192
00193 int main(void)
00194 {
00195 U32 u32CompareVal;
00196 U32 u32CompareValVerif;
00197 U32 u32CountVal;
00198 U32 u32CountNextVal;
00199 U8 u8LedMap = 0x01;
00200
00201
00202 #if BOARD == UC3L_EK
00203
00204
00205
00206 pcl_configure_clocks(&pcl_dfll_freq_param);
00207
00208
00209
00210
00211
00212
00213
00214 init_dbg_rs232(EXAMPLE_TARGET_PBACLK_FREQ_HZ);
00215 #else
00216
00217
00218
00219 pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
00220
00221 init_dbg_rs232(FOSC0);
00222 #endif
00223
00224 print_dbg("---------------------------------------------\n");
00225
00226
00227
00228
00229 u32CompareVal = Get_sys_compare();
00230 Assert(!u32CompareVal);
00231
00232
00233
00234 u32CountVal = Get_sys_count();
00235 Assert(u32CountVal);
00236
00237 #if defined (__GNUC__)
00238
00239 Disable_global_interrupt();
00240
00241 INTC_init_interrupts();
00242
00243
00244
00245
00246
00247
00248 INTC_register_interrupt(&compare_irq_handler, AVR32_CORE_COMPARE_IRQ, AVR32_INTC_INT0);
00249 #endif
00250
00251 Enable_global_interrupt();
00252
00253
00254
00255 u32CountVal = Get_sys_count();
00256
00257 u32CompareVal = u32CountVal + NB_CLOCK_CYCLE_DELAY_SHORT;
00258
00259
00260 if(0 == u32CompareVal)
00261 {
00262 u32CompareVal++;
00263 }
00264
00265 Set_sys_compare(u32CompareVal);
00266
00267
00268 u32CompareValVerif = Get_sys_compare();
00269 Assert( u32CompareVal==u32CompareValVerif );
00270
00271
00272
00273 while (!u32NbCompareIrqTrigger)
00274 {
00275 u32CountNextVal = Get_sys_count();
00276
00277 if (u32CountNextVal < u32CompareVal)
00278 print_dbg("COUNT HAS NOT REACHED COMPARE YET (INFO)\n");
00279 else if (u32CountNextVal > u32CompareVal)
00280
00281 print_dbg("COUNT IS GREATER THAN COMPARE (INFO)\n");
00282 else
00283 print_dbg("COUNT IS EQUAL TO COMPARE (INFO)\n");
00284
00285
00286 }
00287
00288 while (TRUE)
00289 {
00290 if (u8DisplayMsg)
00291 {
00292 u8DisplayMsg = 0;
00293
00294
00295 LED_Display_Field(LED0 |
00296 LED1 |
00297 LED2 |
00298 LED3,
00299 u8LedMap);
00300 u8LedMap = max((U8)(u8LedMap << 1) & 0x0F, 0x01);
00301
00302
00303 print_dbg("\nCOMPARE INTERRUPT TRIGGERED (OK): #");
00304 print_dbg_ulong(u32NbCompareIrqTrigger);
00305 }
00306 }
00307 }