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 "delay.h"
00091
00092
00093
00094
00095 #define STRING_TRANSFER_SIZE 36
00096
00098
00099 #define PDCA_CHANNEL_USART 0
00100 #define PDCA_CHANNEL_IRQ AVR32_PDCA_IRQ_0
00101 #define PEVC_PDCA_SOT_USER AVR32_PEVC_ID_USER_PDCA_0
00102
00103
00104
00105
00106
00107
00108 volatile avr32_pdca_channel_t *pdca_channel;
00109 volatile avr32_pevc_t *ppevc = &AVR32_PEVC;
00110 volatile avr32_pm_t *pm = &AVR32_PM;
00111
00112 static volatile U32 u32PdcaIsr;
00113
00114 #define FCPU_HZ 60000000
00115 #define FPBA_HZ 60000000
00116
00117
00118 unsigned char aDataTransfered[STRING_TRANSFER_SIZE];
00122 #if (defined __GNUC__)
00123 __attribute__((__interrupt__))
00124 #elif (defined __ICCAVR32__)
00125 __interrupt
00126 #endif
00127 static void pdca_int_handler(void)
00128 {
00129 u32PdcaIsr = pdca_channel->isr;
00130 if( u32PdcaIsr & (1<<AVR32_PDCA_ISR0_TRC_OFFSET) )
00131 {
00132
00133 pdca_reload_channel(PDCA_CHANNEL_USART, (void *)aDataTransfered, sizeof( aDataTransfered ));
00134 print_dbg("\n");
00135 }
00136 }
00137
00141 void init_usart(void)
00142 {
00143
00144 init_dbg_rs232(FCPU_HZ);
00145 print_dbg("\x0CPEVC Dirver - EXAMPLE 2\r\n");
00146 print_dbg("USART transfert using PEVC, Generic Clock and PDCA\r\n");
00147 }
00148
00152 void init_pevc(void)
00153 {
00154
00155
00156 static const pevc_evs_opt_t PEVC_EVS_OPTIONS =
00157 {
00158 .igfdr = 0x0A,
00159 .igf = PEVC_EVS_IGF_OFF,
00160 .evf = PEVC_EVS_EVF_OFF,
00161 .evr = PEVC_EVS_EVR_ON
00162 };
00163
00164
00165
00166 if(FAIL == pevc_channel_configure(ppevc,
00167 PEVC_PDCA_SOT_USER,
00168 AVR32_PEVC_ID_GEN_GCLK_0,
00169 &PEVC_EVS_OPTIONS))
00170 {
00171 print_dbg("PEVC channel config failed!!!\r\n");
00172 gpio_clr_gpio_pin(LED2_GPIO);
00173 while(1);
00174 }
00175
00176
00177 pevc_channels_enable(ppevc, 1<<PEVC_PDCA_SOT_USER);
00178
00179 }
00180
00184 void init_pdca(void)
00185 {
00186
00187 static const pdca_channel_options_t PDCA_CH_OPTIONS =
00188 {
00189 .addr = (void *)aDataTransfered,
00190 .pid = AVR32_PDCA_PID_USART2_TX,
00191 .size = 0,
00192 .r_addr = (void *)aDataTransfered,
00193 .r_size = sizeof(aDataTransfered),
00194 .transfer_size = PDCA_TRANSFER_SIZE_BYTE,
00195 .etrig = ENABLED
00196 };
00197
00198 Disable_global_interrupt();
00199
00200
00201 INTC_register_interrupt(&pdca_int_handler, PDCA_CHANNEL_IRQ, AVR32_INTC_INT0);
00202
00203 Enable_global_interrupt();
00204
00205
00206 pdca_init_channel(PDCA_CHANNEL_USART, &PDCA_CH_OPTIONS);
00207 pdca_channel = pdca_get_handler(PDCA_CHANNEL_USART);
00208
00209
00210 pdca_enable_interrupt_transfer_error(PDCA_CHANNEL_USART);
00211 pdca_enable_interrupt_transfer_complete(PDCA_CHANNEL_USART);
00212
00213
00214 pdca_enable(PDCA_CHANNEL_USART);
00215 }
00216
00220 void init_gclk(void)
00221 {
00222 scif_osc32_opt_t opt =
00223 {
00224 .mode = SCIF_OSC_MODE_2PIN_CRYSTAL,
00225 .startup = AVR32_SCIF_OSCCTRL32_STARTUP_0_RCOSC
00226 };
00227
00228 scif_start_osc32(&opt,true);
00229
00230
00231 scif_gclk_opt_t gclkOpt =
00232 {
00233 .clock_source = SCIF_GCCTRL_OSC32K,
00234 .divider = 255,
00235 .diven = 1
00236 };
00237
00238 if(scif_start_gclk(AVR32_SCIF_GCLK_GCLK2_EVENT, &gclkOpt))
00239 {
00240
00241 while(1);
00242 }
00243 }
00244
00247 static void init_sys_clocks(void)
00248 {
00249
00252
00253 static pcl_freq_param_t pcl_freq_param =
00254 {
00255 .cpu_f = FCPU_HZ,
00256 .pba_f = FPBA_HZ,
00257 .osc0_f = FOSC0,
00258 .osc0_startup = OSC0_STARTUP
00259 };
00261
00262
00263 if (pcl_configure_clocks(&pcl_freq_param) != PASS) {
00264 while(1);
00265 }
00266 }
00267
00268 int main(void)
00269 {
00270 int i;
00271
00272
00273 for(i=0;i<sizeof(aDataTransfered);i++) {
00274 aDataTransfered[i] = '0' + (i%36);
00275 }
00276
00277 init_sys_clocks();
00278
00279 delay_init(FCPU_HZ);
00280
00281 init_usart();
00282
00283 gpio_clr_gpio_pin(LED0_GPIO);
00284
00285 init_pdca();
00286
00287 init_pevc();
00288
00289 init_gclk();
00290
00291 while(1)
00292 {
00293 gpio_tgl_gpio_pin(LED1_GPIO);
00294 delay_ms(500);
00295 }
00296 }