1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "clksys_driver.h"
|
4 | #include "dma_driver.h"
|
5 |
|
6 |
|
7 | #define data_size 600
|
8 |
|
9 | static uint8_t Rx_Buf[data_size];
|
10 |
|
11 | #define DMA_RX_Channel &DMA.CH0
|
12 |
|
13 | /****************************************************************************/
|
14 | ISR (PORTA_INT0_vect)
|
15 | {
|
16 | SetupReceiveChannel();
|
17 | DMA_EnableChannel( DMA_RX_Channel );
|
18 | }
|
19 |
|
20 | /****************************************************************************/
|
21 | void init_usartC0(void)
|
22 | {
|
23 | PORTC.DIRSET = PIN3_bm; // PC3 (TXC0) as output.
|
24 | PORTC.DIRCLR = PIN2_bm; // PC2 (RXC0) as input.
|
25 |
|
26 | // 32 Mhz - B460800
|
27 | USARTC0.BAUDCTRLA = 107;
|
28 | USARTC0.BAUDCTRLB = 0b10110000;
|
29 |
|
30 | //USARTC0.CTRLA = USART_RXCINTLVL_HI_gc;
|
31 | USARTC0.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
|
32 | USARTC0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc;
|
33 | }
|
34 |
|
35 | /****************************************************************************/
|
36 | void SetupReceiveChannel(void)
|
37 | {
|
38 | DMA_SetupBlock(
|
39 | DMA_RX_Channel,
|
40 | (void *) &USARTC0.DATA,
|
41 | DMA_CH_SRCRELOAD_NONE_gc,
|
42 | DMA_CH_SRCDIR_FIXED_gc,
|
43 | Rx_Buf,
|
44 | DMA_CH_DESTRELOAD_NONE_gc,
|
45 | DMA_CH_DESTDIR_INC_gc,
|
46 | data_size,
|
47 | DMA_CH_BURSTLEN_1BYTE_gc,
|
48 | 0, // Perform once
|
49 | true
|
50 | );
|
51 |
|
52 | DMA_EnableSingleShot(DMA_RX_Channel);
|
53 | // USART Trigger source, Receive complete
|
54 | DMA_SetTriggerSource(DMA_RX_Channel, DMA_CH_TRIGSRC_USARTC0_RXC_gc);
|
55 | }
|
56 |
|
57 | /****************************************************************************/
|
58 | int main(void)
|
59 | {
|
60 | system_clocks_init(4); // 8Mhz * 4 = 32Mhz
|
61 |
|
62 |
|
63 | PORTA.DIRSET = PIN5_bm; // Output
|
64 | PORTA.DIRSET = PIN6_bm; // Output
|
65 | PORTA.DIRSET = PIN7_bm; // Output
|
66 | PORTB.DIRSET = PIN0_bm; // Output
|
67 |
|
68 |
|
69 | //PORTA.OUTCLR = PIN5_bm;
|
70 | PORTA.OUTSET = PIN5_bm; // OFF
|
71 | PORTA.OUTSET = PIN6_bm; // OFF
|
72 | PORTA.OUTSET = PIN7_bm; // OFF
|
73 |
|
74 | _delay_ms(500);
|
75 |
|
76 |
|
77 | // PORTA PIN 4 Interrupt einstellen steigende flanke
|
78 | PORTA.INT0MASK = PIN4_bm;
|
79 | PORTA.PIN4CTRL = PORT_OPC_PULLDOWN_gc | PORT_ISC_RISING_gc; // Pull Down einschalten, ISR steigende Flanke
|
80 | PORTA.INTCTRL |= PORT_INT0LVL_HI_gc; // Low Level Interrupt
|
81 |
|
82 |
|
83 | init_usartC0();
|
84 |
|
85 | DMA_Enable();
|
86 | //SetupReceiveChannel();
|
87 | //DMA_EnableChannel( DMA_RX_Channel );
|
88 |
|
89 |
|
90 | // Enable Interrupts
|
91 | PMIC.CTRL |= PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm;
|
92 | sei();
|
93 |
|
94 |
|
95 | while(1)
|
96 | {
|
97 | PORTA.OUTTGL = PIN5_bm;
|
98 | }
|
99 | }
|