www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATSAM3U4E - USART Interrupt


Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich arbeite gerade mit dem Eval-Kit SAM3U-EK von Atmel. Der darauf 
verbaute ARM ATSAM3U4E ärgert mich zur Zeit ein wenig.

Konkret geht es mir um die USART Schnittstelle. Ich bin bereits soweit 
das ich problemlos senden kann, nur das Empfangen(per Interrupt) 
funktioniert nicht richtig.

Aber hier erstmal der Init Code der USART1:
void USARTInit(void)
{

  /*1. init PIOA&USART1*/
    //enable necessary peripheral clocks
    PMC->PMC_PCER = (0x1 << ID_PIOA  )|      //enable PIOA clock
                       (0x1 << ID_USART1);          //enable USART1 clock  

  /*2. configure PIOA*/
    //disable pin charge interrupt for usart pins
      PIOA->PIO_IDR    =  (PIO_PA21A_RXD1 | PIO_PA20A_TXD1);

    //disable pullups for usart pins
    PIOA->PIO_PUDR   =  (PIO_PA21A_RXD1 | PIO_PA20A_TXD1);

    //disable pio controller for usart pins(enables peripheral control of the pin)
    PIOA->PIO_PDR    =  (PIO_PA21A_RXD1 | PIO_PA20A_TXD1);

    //select corresponding peripheral for usart1 
    PIOA->PIO_ABSR  &= ~(PIO_PA21A_RXD1 | PIO_PA20A_TXD1);
        
  /*3. configure USART1*/
    //reset receiver and transmitter
    USART1->US_CR    = US_CR_RSTRX   | US_CR_RSTTX;
        
    //disable all interrupts
    USART1->US_IDR   = 0xFFFFFFFF;

    //set needed interrupts
    USART1->US_IER  = (1<<3);
        
    //set baut rate factor
    USART1->US_BRGR  = BAUD(9600);
        
    //set usart mode
    USART1->US_MR =  (0x0 <<  0)|        //normal mode
                       (0x0 <<  4)|                 //use main clock
                       (0x3 <<  6)|                 //character length: 8 bits
                       (0x4 <<  9)|                 //no parity
                       (0x0 << 12)|                 //1 stop bit
                       (0x0 << 14);                 //normal mode: the USART channel operates as an RX/TX USART
    
    //disbale peripheral DMA controller for transmitter/receiver
    USART1->US_PTCR  = US_PTCR_RXTDIS | US_PTCR_TXTDIS;

    //enable receiver and transmitter
    USART1->US_CR    = US_CR_RXEN     | US_CR_TXEN;

  /*4. activate interrupts*/
    //set interrupt values
    NVIC_DisableIRQ(USART1_IRQn);
    NVIC_ClearPendingIRQ(USART1_IRQn);
    NVIC_SetPriority(USART1_IRQn,5);
    NVIC_EnableIRQ(USART1_IRQn);

};

hier der Interrupt Handler Code:
void USART1_IRQHandler(void)
{
  //init/vars
  unsigned int InterruptStatus;

   //read out interrupt stat
  InterruptStatus = USART1->US_CSR;

  //send back(test command)
  //SER_putChar(USART1->US_RHR);

  //reset status bits
  USART1->US_CR = US_CR_RSTSTA;
  
  //dummy action, to prevent compiler optimation
  InterruptStatus++;
};

und noch der Vollständigkeit halber:
void SER_putChar(char c)
{
  while (!(USART1->US_CSR & US_CSR_TXRDY)){};
   
  USART1->US_THR = c;
};

Problem ist, dass der sofort in den Interrupt springt wenn ich die USART 
aktiviere, und da nie wieder raus kommt.
(getestet mit dem 'SER_putChar' Kommando, er schickt mir in einer 
Endlosschleife das Zeichen zurück was zuletzt empfangen wurde)

Andere ISRs (zb Timer/RTC/...) funktionieren einwandfrei und werden 
"beendet" sobald ich das jeweilig zugehörige Status Register lese.

Wie komme ich aus der USART1 ISR wieder raus?

Gruß,
Mark

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, hab die Lösung gefunden:

das "USART1->US_IER  = (1<<3);" muss durch "USART1->US_IER  = (1<<0);" 
ersetz werden, damit ich auch wirklich den Interrupt habe, den ich auch 
möchte.

...eine einfache Zahl kann ganz schön aufhalten...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.