00001
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #ifdef __GNUC__
00050
00051 #include "interrupt_gcc.h"
00052
00053 char *stringINT __attribute__((aligned(32)));
00054 int stringSizeINT;
00055 char *stringINT2 __attribute__((aligned(32)));
00056 int stringSizeINT2;
00057
00058
00061 __int_handler *pdc_interrupt_handler(void)
00062 {
00063 pdc_setTxNextBuf((void *) &USART_MODULE,
00064 pdc_translatePtr((void *)stringINT2), stringSizeINT2);
00065
00066 return (void *) AVR32_RAR_INT0;
00067 }
00068
00069
00072 void init_usart_interrupts(void)
00073 {
00074 set_interrupts_base((void *) AVR32_INTC_ADDRESS);
00075
00076
00077
00078
00079
00080 register_interrupt((__int_handler) pdc_interrupt_handler,
00081 USART_MODULE_IRQ / 32,
00082 USART_MODULE_IRQ % 32,
00083 INT0);
00084 }
00085
00086
00089 void start_interrupts(void)
00090 {
00091 pdc_disable((void *) &USART_MODULE);
00092
00093 stringINT = "INT: AVR32 PDC application demo\r\n";
00094 stringSizeINT = 33;
00095 stringINT2 = "INT: AVR32 PDC application demo ENDTX int\r\n";
00096 stringSizeINT2 = 43;
00097
00098 pdc_flushCache((void *)stringINT, stringSizeINT/4);
00099 pdc_flushCache((void *)stringINT2, stringSizeINT2/4);
00100
00101 pdc_setTxBuf((void *) &USART_MODULE,
00102 pdc_translatePtr((void *)stringINT), stringSizeINT,
00103 pdc_translatePtr((void *)stringINT), stringSizeINT);
00104
00105
00106 USART_MODULE.ier = AVR32_USART_IER_ENDTX_MASK;
00107 init_interrupts();
00108
00109 pdc_enable((void *) &USART_MODULE);
00110 }
00111
00112
00115 void stop_interrupts(void)
00116 {
00117 USART_MODULE.idr = AVR32_USART_IDR_ENDTX_MASK;
00118
00119
00120 do {
00121 } while(pdc_txBytesLeft((void *) &USART_MODULE) != 0);
00122
00123 pdc_disable((void *) &USART_MODULE);
00124 }
00125
00126 #endif
00127