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