00001
00104 #if __GNUC__
00105 # include "intc.h"
00106 #endif
00107
00108 #define _ASSERT_ENABLE_
00109 #include "compiler.h"
00110 #include "print_funcs.h"
00111 #include "board.h"
00112 #include "cycle_counter.h"
00113 #include "pm_at32ap7000.h"
00114
00115
00116 #define NB_CLOCK_CYCLE_DELAY_SHORT 1000000 // 100 ms if fCPU==20MHz
00117 #define NB_CLOCK_CYCLE_DELAY_LONG 20000000 // 1 s if fCPU==20MHz
00118
00119
00120
00121 static volatile unsigned int u32NbCompareIrqTrigger = 0;
00122
00123
00124 static volatile unsigned char u8DisplayMsg = 0;
00125
00126
00127 #if __GNUC__
00128
00129
00130 __attribute__((__interrupt__))
00131 #elif __ICCAVR32__
00132
00133
00134
00135 #pragma handler = AVR32_CORE_IRQ_GROUP, 0
00136 __interrupt
00137 #endif
00138 static void compare_irq_handler(void)
00139 {
00140
00141 u32NbCompareIrqTrigger++;
00142 u8DisplayMsg = 1;
00143
00144
00145
00146
00147 #if __AVR32_AP7000__ || __AT32AP7000__
00148 U32 next_compare;
00149
00150
00151 next_compare = Get_sys_compare();
00152 next_compare += NB_CLOCK_CYCLE_DELAY_LONG;
00153 if (next_compare == 0)
00154 next_compare++;
00155 Set_sys_compare(next_compare);
00156 #else
00157 Set_sys_compare(NB_CLOCK_CYCLE_DELAY_LONG);
00158 #endif
00159 }
00160
00161
00162 int main(void)
00163 {
00164 U32 u32CompareVal;
00165 U32 u32CompareValVerif;
00166 U32 u32CountVal;
00167 U32 u32CountNextVal;
00168 U8 u8LedMap = 0x01;
00169
00170
00171 pm_reset();
00172
00173
00174
00175
00176 init_dbg_rs232(FOSC0);
00177
00178 print_dbg("---------------------------------------------\n");
00179
00180
00181
00182
00183 u32CompareVal = Get_sys_compare();
00184 Assert(!u32CompareVal);
00185
00186
00187
00188 u32CountVal = Get_sys_count();
00189 Assert(u32CountVal);
00190
00191 #if __GNUC__
00192
00193 Disable_global_interrupt();
00194
00195 INTC_init_interrupts();
00196
00197
00198
00199
00200
00201
00202 INTC_register_interrupt(&compare_irq_handler, AVR32_CORE_COMPARE_IRQ, AVR32_INTC_INT0);
00203 #endif
00204
00205 Enable_global_interrupt();
00206
00207
00208
00209 u32CountVal = Get_sys_count();
00210
00211 u32CompareVal = u32CountVal + NB_CLOCK_CYCLE_DELAY_SHORT;
00212
00213
00214 if(0 == u32CompareVal)
00215 {
00216 u32CompareVal++;
00217 }
00218
00219 Set_sys_compare(u32CompareVal);
00220
00221
00222 u32CompareValVerif = Get_sys_compare();
00223 Assert( u32CompareVal==u32CompareValVerif );
00224
00225
00226
00227 while (!u32NbCompareIrqTrigger)
00228 {
00229 u32CountNextVal = Get_sys_count();
00230
00231 if (u32CountNextVal < u32CompareVal)
00232 print_dbg("COUNT HAS NOT REACHED COMPARE YET (INFO)\n");
00233 else if (u32CountNextVal > u32CompareVal)
00234
00235 print_dbg("COUNT IS GREATER THAN COMPARE (INFO)\n");
00236 else
00237 print_dbg("COUNT IS EQUAL TO COMPARE (INFO)\n");
00238
00239
00240 }
00241
00242 while (TRUE)
00243 {
00244 if (u8DisplayMsg)
00245 {
00246 u8DisplayMsg = 0;
00247
00248
00249 LED_Display_Field(LED_MONO0_GREEN |
00250 LED_MONO1_GREEN |
00251 LED_MONO2_GREEN |
00252 LED_MONO3_GREEN,
00253 u8LedMap);
00254 u8LedMap = max((U8)(u8LedMap << 1) & 0x0F, 0x01);
00255
00256
00257 print_dbg("\nCOMPARE INTERRUPT TRIGGERED (OK): #");
00258 print_dbg_ulong(u32NbCompareIrqTrigger);
00259 }
00260 }
00261 }