AVR32UC3A - Wie löscht man einen Interrupt (Bsp. USART)?

OP #912335
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren