00001
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00086 #include <avr32/io.h>
00087 #include "compiler.h"
00088 #include "gpio.h"
00089 #include "pm.h"
00090 #include "board.h"
00091 #include "eic.h"
00092 #include "intc.h"
00093
00096
00097 #if BOARD==EVK1100
00098
00099
00100
00101
00102 #define EXT_INT_EXAMPLE_PIN_LINE1 AVR32_EIC_EXTINT_8_PIN
00103 #define EXT_INT_EXAMPLE_FUNCTION_LINE1 AVR32_EIC_EXTINT_8_FUNCTION
00104 #define EXT_INT_EXAMPLE_LINE1 EXT_NMI
00105 #define EXT_INT_EXAMPLE_NB_LINES 1
00106 #elif BOARD==EVK1101
00107
00108
00109
00110
00111
00112 #define EXT_INT_EXAMPLE_PIN_LINE1 AVR32_EIC_EXTINT_6_PIN
00113 #define EXT_INT_EXAMPLE_FUNCTION_LINE1 AVR32_EIC_EXTINT_6_FUNCTION
00114 #define EXT_INT_EXAMPLE_LINE1 EXT_INT6
00115 #define EXT_INT_EXAMPLE_IRQ_LINE1 AVR32_EIC_IRQ_6
00116 #define EXT_INT_EXAMPLE_PIN_LINE2 AVR32_EIC_EXTINT_7_PIN
00117 #define EXT_INT_EXAMPLE_FUNCTION_LINE2 AVR32_EIC_EXTINT_7_FUNCTION
00118 #define EXT_INT_EXAMPLE_LINE2 EXT_INT7
00119 #define EXT_INT_EXAMPLE_IRQ_LINE2 AVR32_EIC_IRQ_7
00120 #define EXT_INT_EXAMPLE_NB_LINES 2
00121 #elif BOARD==EVK1104
00122
00123
00124
00125
00126 #define EXT_INT_EXAMPLE_PIN_LINE1 AVR32_EIC_EXTINT_8_PIN
00127 #define EXT_INT_EXAMPLE_FUNCTION_LINE1 AVR32_EIC_EXTINT_8_FUNCTION
00128 #define EXT_INT_EXAMPLE_LINE1 EXT_NMI
00129 #define EXT_INT_EXAMPLE_NB_LINES 1
00130 #endif
00132
00133
00135 eic_options_t eic_options[EXT_INT_EXAMPLE_NB_LINES];
00136
00138 unsigned char key_number=0;
00139
00141 static volatile Bool bCancelSwDelay = FALSE;
00142
00143
00144 #if BOARD==EVK1100 || BOARD == EVK1104
00145
00151 #if __GNUC__
00152 __attribute__((__naked__))
00153 #elif __ICCAVR32__
00154 #pragma shadow_registers = full
00155 #endif
00156 void eic_nmi_handler( void )
00157 {
00158 __asm__ __volatile__ (
00159 "pushm r0-r12, lr\n\t"
00160 );
00161 eic_clear_interrupt_line(&AVR32_EIC, EXT_INT_EXAMPLE_LINE1);
00162 key_number = 1;
00163 bCancelSwDelay = TRUE;
00164 __asm__ __volatile__ (
00165 "popm r0-r12, lr\n\t"
00166 "rete"
00167 );
00168 }
00169 #endif // #if BOARD==EVK1100 || BOARD == EVK1104
00170
00171 #if BOARD==EVK1101
00172
00175 #if __GNUC__
00176 __attribute__((__interrupt__))
00177 #elif __ICCAVR32__
00178 __interrupt
00179 #endif
00180 static void eic_int_handler1(void)
00181 {
00182 eic_clear_interrupt_line(&AVR32_EIC, EXT_INT_EXAMPLE_LINE1);
00183 key_number = 1;
00184 bCancelSwDelay = TRUE;
00185 }
00186
00190 #if __GNUC__
00191 __attribute__((__interrupt__))
00192 #elif __ICCAVR32__
00193 __interrupt
00194 #endif
00195 static void eic_int_handler2(void)
00196 {
00197 eic_clear_interrupt_line(&AVR32_EIC, EXT_INT_EXAMPLE_LINE2);
00198 key_number = 2;
00199 bCancelSwDelay = TRUE;
00200 }
00201 #endif //if BOARD==EVK1101
00202
00203
00204
00205
00206
00207 static void software_delay(void)
00208 {
00209 volatile int i;
00210 bCancelSwDelay = FALSE;
00211 for (i=10000; (i>=0)&&(FALSE == bCancelSwDelay); i--);
00212 }
00213
00214
00215
00216
00217 int main(void)
00218 {
00219
00220 eic_options[0].eic_mode = EIC_MODE_EDGE_TRIGGERED;
00221
00222 eic_options[0].eic_edge = EIC_EDGE_FALLING_EDGE;
00223
00224 eic_options[0].eic_async = EIC_SYNCH_MODE;
00225
00226 eic_options[0].eic_line = EXT_INT_EXAMPLE_LINE1;
00227
00228
00229 #if BOARD==EVK1101
00230
00231 eic_options[1].eic_mode = EIC_MODE_EDGE_TRIGGERED;
00232
00233 eic_options[1].eic_edge = EIC_EDGE_FALLING_EDGE;
00234
00235 eic_options[1].eic_async = EIC_SYNCH_MODE;
00236
00237 eic_options[1].eic_line = EXT_INT_EXAMPLE_LINE2;
00238 #endif
00239
00240
00241 gpio_set_gpio_pin(LED0_GPIO);
00242 gpio_set_gpio_pin(LED1_GPIO);
00243
00244
00245 #if BOARD==EVK1100 || BOARD == EVK1104
00246 gpio_enable_module_pin(EXT_INT_EXAMPLE_PIN_LINE1,EXT_INT_EXAMPLE_FUNCTION_LINE1);
00247 #elif BOARD==EVK1101
00248 static const gpio_map_t EIC_GPIO_MAP =
00249 {
00250 {EXT_INT_EXAMPLE_PIN_LINE1, EXT_INT_EXAMPLE_FUNCTION_LINE1},
00251 {EXT_INT_EXAMPLE_PIN_LINE2, EXT_INT_EXAMPLE_FUNCTION_LINE2}
00252 };
00253 gpio_enable_module(EIC_GPIO_MAP,sizeof(EIC_GPIO_MAP) / sizeof(EIC_GPIO_MAP[0]));
00254 #endif
00255
00256
00257 Disable_global_interrupt();
00258
00259 #if BOARD==EVK1101
00260
00261 INTC_init_interrupts();
00262
00263
00264
00265
00266
00267
00268 INTC_register_interrupt(&eic_int_handler1, EXT_INT_EXAMPLE_IRQ_LINE1, AVR32_INTC_INT0);
00269 INTC_register_interrupt(&eic_int_handler2, EXT_INT_EXAMPLE_IRQ_LINE2, AVR32_INTC_INT0);
00270 #endif
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280 eic_init(&AVR32_EIC, eic_options,EXT_INT_EXAMPLE_NB_LINES);
00281
00282
00283 #if BOARD==EVK1100 || BOARD == EVK1104
00284 eic_enable_line(&AVR32_EIC, eic_options[0].eic_line);
00285 eic_enable_interrupt_line(&AVR32_EIC, eic_options[0].eic_line);
00286 #elif BOARD==EVK1101
00287 eic_enable_lines(&AVR32_EIC, (1<<eic_options[1].eic_line)|(1<<eic_options[0].eic_line));
00288 eic_enable_interrupt_lines(&AVR32_EIC, (1<<eic_options[1].eic_line)|(1<<eic_options[0].eic_line));
00289 #endif
00290
00291
00292 Enable_global_interrupt();
00293
00294
00295 while(1)
00296 {
00297 switch (key_number)
00298 {
00299 case 1 :
00300 gpio_clr_gpio_pin(LED0_GPIO);
00301 gpio_set_gpio_pin(LED1_GPIO);
00302 key_number = 0;
00303 software_delay();
00304 break;
00305 case 2 :
00306 gpio_set_gpio_pin(LED0_GPIO);
00307 gpio_clr_gpio_pin(LED1_GPIO);
00308 key_number = 0;
00309 software_delay();
00310 break;
00311 default :
00312 gpio_set_gpio_pin(LED0_GPIO);
00313 gpio_set_gpio_pin(LED1_GPIO);
00314 break;
00315 }
00316 }
00317 }