Hallo,
ich versuche gerade die Beispiele aus dem Framework mal etwas
aufzuplustern. Nun hab ich meine USART konfiguriert (timeout, rx ready,
den Interrupthandler registriert.
1 | void init()
|
2 | {
|
3 | static const gpio_map_t GPIO_MAP =
|
4 | {
|
5 | {RX_PIN, RX_FUNCTION},
|
6 | {TX_PIN, TX_FUNCTION}
|
7 | };
|
8 |
|
9 | // Options for debug USART.
|
10 | usart_options_t options =
|
11 | {
|
12 | .baudrate = BAUDRATE,
|
13 | .charlength = 8,
|
14 | .paritytype = USART_NO_PARITY,
|
15 | .stopbits = USART_1_STOPBIT,
|
16 | .channelmode = USART_NORMAL_CHMODE
|
17 | };
|
18 |
|
19 | // Setup GPIO, ISR
|
20 | gpio_enable_module(GPIO_MAP, sizeof(GPIO_MAP) / sizeof(GPIO_MAP[0]));
|
21 |
|
22 |
|
23 | // Initialize it in RS232 mode.
|
24 | usart_init_rs232(USART1, &options, FOSC0);
|
25 |
|
26 | // Init interrupt and timeout
|
27 | INTC_register_interrupt(&isr, AVR32_USART1_IRQ, AVR32_INTC_INT1);
|
28 | USART1->ier = AVR32_USART_IER_RXRDY_MASK|AVR32_USART_IER_TIMEOUT_MASK;
|
29 | USART1->rtor = 100;
|
30 | }
|
Dann die Service Routine:
1 | __attribute__((__interrupt__)) void isr( void )
|
2 | {
|
3 | unsigned char cs = 0;
|
4 | int rx_char = 0, i;
|
5 |
|
6 | if (USART1->csr & AVR32_USART_CSR_TIMEOUT_MASK)
|
7 | {
|
8 | USART1->cr|=AVR32_USART_CR_STTTO_MASK;
|
9 |
|
10 | // wenn empfang zu ende
|
11 | usart1.rx_ready = TRUE;
|
12 | }
|
13 | else if (USART1->csr & AVR32_USART_CSR_TXRDY_MASK)
|
14 | {
|
15 | ===> if (usart1.tx_ptr < mdb.tx_payload) // wenn noch was zum senden
|
16 | {
|
17 | USART1->thr = (usart1.tx_buffer[usart1.tx_ptr++] << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK;
|
18 | }
|
19 | else // senden fertig, interrupt aus
|
20 | {
|
21 | USART1->idr = AVR32_USART_IDR_TXRDY_MASK;
|
22 | }
|
23 | }
|
24 | else if (USART1->csr & AVR32_USART_CSR_RXRDY_MASK)
|
25 | {
|
26 | //TODO daten in buffer schaufeln
|
27 | }
|
28 | else
|
29 | {
|
30 | // unknown interrupt
|
31 | }
|
32 | }
|
Mein Problem ist nun folgendes: da wo der Pfeil ===> steht, dorthin
springt der Controller ununterbrochen. Die Frage ist warum? Gesendet
habe ich noch nichts, nur uart initialisiert. Die nächste Frage ist: wie
setze ich den Interrupt zurück (der AVR machte das automatisch, nachdem
der Vector ausgeführt wurde)? Das Datenblatt ist dazu recht dürftig
(oder ich blind/blöd). Ich hoffe jemand kann mir da helfen
durchzusteigen.
Gruß Willi