00001
00081 #include <avr32/io.h>
00082 #include "board.h"
00083 #include "intc.h"
00084 #include "power_clocks_lib.h"
00085 #include "pevc.h"
00086 #include "gpio.h"
00087 #include "usart.h"
00088 #include "print_funcs.h"
00089 #include "pdca.h"
00090 #include "ast.h"
00091 #include "delay.h"
00092
00093
00094 #define FCPU_HZ 60000000
00095 #define FPBA_HZ 60000000
00096
00099
00100 #define STRING_TRANSFER_SIZE 36
00102
00103
00107
00108
00109
00110 #define PDCA_CHANNEL_USART 0
00111 #define PDCA_CHANNEL_IRQ AVR32_PDCA_IRQ_0
00112 #define PEVC_PDCA_SOT_USER AVR32_PEVC_ID_USER_PDCA_0
00113
00114
00115
00116
00117
00118
00119 volatile avr32_pdca_channel_t *pdca_channel;
00120 volatile avr32_pevc_t *ppevc = &AVR32_PEVC;
00121 volatile avr32_pm_t *pm = &AVR32_PM;
00122
00123 static volatile U32 u32PdcaIsr;
00124
00125
00126 unsigned char aDataTransfered[STRING_TRANSFER_SIZE];
00127
00131 #if (defined __GNUC__)
00132 __attribute__((__interrupt__))
00133 #elif (defined __ICCAVR32__)
00134 __interrupt
00135 #endif
00136 static void pdca_int_handler(void)
00137 {
00138 u32PdcaIsr = pdca_channel->isr;
00139 if( u32PdcaIsr & (1<<AVR32_PDCA_ISR0_TRC_OFFSET) )
00140 {
00141
00142 pdca_reload_channel(PDCA_CHANNEL_USART, (void *)aDataTransfered, sizeof( aDataTransfered ));
00143 print_dbg("\n");
00144 }
00145 }
00146
00150 void init_usart(void)
00151 {
00152 init_dbg_rs232(FCPU_HZ);
00153 print_dbg("\x0CPEVC Dirver - EXAMPLE 1\r\n");
00154 print_dbg("USART transfert using PEVC, AST and PDCA\r\n");
00155 }
00156
00160 void init_pevc(void)
00161 {
00162
00163
00164 if(FAIL == pevc_channel_configure(ppevc,
00165 PEVC_PDCA_SOT_USER,
00166 AVR32_PEVC_ID_GEN_AST_PER0,
00167 NULL))
00168 {
00169 print_dbg("PEVC channel config failed!!!\r\n");
00170 gpio_clr_gpio_pin(LED2_GPIO);
00171 while(1);
00172 }
00173
00174
00175 pevc_channels_enable(ppevc, 1<<PEVC_PDCA_SOT_USER);
00176
00177 }
00178
00182 void init_pdca(void)
00183 {
00184
00185 static const pdca_channel_options_t PDCA_CH_OPTIONS =
00186 {
00187 .addr = (void *)aDataTransfered,
00188 .pid = AVR32_PDCA_PID_USART2_TX,
00189 .size = 0,
00190 .r_addr = (void *)aDataTransfered,
00191 .r_size = sizeof(aDataTransfered),
00192 .transfer_size = PDCA_TRANSFER_SIZE_BYTE,
00193 .etrig = ENABLED
00194 };
00195
00196 Disable_global_interrupt();
00197
00198
00199 INTC_register_interrupt(&pdca_int_handler, PDCA_CHANNEL_IRQ, AVR32_INTC_INT0);
00200
00201 Enable_global_interrupt();
00202
00203
00204 pdca_init_channel(PDCA_CHANNEL_USART, &PDCA_CH_OPTIONS);
00205 pdca_channel = pdca_get_handler(PDCA_CHANNEL_USART);
00206
00207
00208 pdca_enable_interrupt_transfer_error(PDCA_CHANNEL_USART);
00209 pdca_enable_interrupt_transfer_complete(PDCA_CHANNEL_USART);
00210
00211
00212 PEVC_CHANNELS_ENABLE(ppevc, 1<<PEVC_PDCA_SOT_USER);
00213
00214
00215 pdca_enable(PDCA_CHANNEL_USART);
00216 }
00217
00221 void init_ast(void)
00222 {
00223
00224 avr32_ast_pir0_t pir = {
00225 .insel = 14
00226 };
00227
00228 ast_calendar_t ast_calendar;
00229 ast_calendar.FIELD.sec = 30;
00230 ast_calendar.FIELD.min = 45;
00231 ast_calendar.FIELD.hour = 12;
00232 ast_calendar.FIELD.day = 7;
00233 ast_calendar.FIELD.month= 10;
00234 ast_calendar.FIELD.year = 9;
00235
00236
00237
00238 if (!ast_init_calendar(&AVR32_AST, AST_OSC_32KHZ, AST_PSEL_32KHZ_1HZ, ast_calendar))
00239 {
00240 print_dbg("Error initializing the AST\r\n");
00241 while(1);
00242 }
00243
00244 ast_set_periodic0_value(&AVR32_AST,pir);
00245
00246 ast_enable_periodic0(&AVR32_AST);
00247
00248
00249 AVR32_AST.scr=0xFFFFFFFF;
00250
00251
00252 ast_enable(&AVR32_AST);
00253 }
00254
00257 static void init_sys_clocks(void)
00258 {
00259
00262
00263 static pcl_freq_param_t pcl_freq_param =
00264 {
00265 .cpu_f = FCPU_HZ,
00266 .pba_f = FPBA_HZ,
00267 .osc0_f = FOSC0,
00268 .osc0_startup = OSC0_STARTUP
00269 };
00271
00272
00273 if (pcl_configure_clocks(&pcl_freq_param) != PASS) {
00274 while(1);
00275 }
00276 }
00277
00281 int main(void)
00282 {
00283 int i;
00284
00285
00286 for(i=0;i<sizeof(aDataTransfered);i++)
00287 aDataTransfered[i] = '0' + (i%36);
00288
00289 init_sys_clocks();
00290
00291 delay_init(FCPU_HZ);
00292
00293 init_usart();
00294
00295 gpio_clr_gpio_pin(LED0_GPIO);
00296
00297 init_pevc();
00298
00299 init_ast();
00300
00301 init_pdca();
00302
00303 while(1)
00304 {
00305 gpio_tgl_gpio_pin(LED1_GPIO);
00306 delay_ms(500);
00307 }
00308 }