mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FIQ mit ARM lpc2136


Autor: Philipp G. (flashmaster)
Datum:
Angehängte Dateien:
  • crt0.S (6,46 KB, 185 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Schönen guten Tag,
Ich probieren schon seit über einem Tag in C meine Uart1-Schnittstelle 
auf meinem LPC2136 mit dem FIQ (Fast Interrupt Request) laufen zulassen.
Mit dem normalen IRQ funktioniert es einwandfrei.
Ich muss zugeben, ich bin kein Profi in Sachen ARM-Controller bzw. 
Programmierung. Deswegen verwirrt mich auch der Aufbau meiner startup.s 
.Denn in einigen Foreneinträgen habe ich gelesen, dass ich dort etwas 
verändern muss. Verstanden Wo und Was habe ich aber noch nicht.

Schonmal Vielen Dank für eure Mühen ;)
void uart1_irq_init(void);
void uart1isr(void) __attribute__ ((interrupt("FIQ")));

/*Main-Funktion*/
int main(void)
{
  systeminit();
  gpioinit();  
        // setup the UART;
  uart1init(UART_BAUD(BAUD), UART_8N1, UART_FIFO_8); 
  
  uart1_irq_init();
  enableFIQ();
  
  for(;;)            
  {
  /*Tut irgendwas*/
  }
  return 0;
}

void uart1_irq_init(void)
{
  UART1_LCR = 0x03;   //8bit lenght
  UART1_FCR = 0x07;   //Enable and reset TX and RX FIFO.
  UART1_IER |= 0x7;   //Enable RBR/THRE/RX Line Interrupts
  VICVectAddr0 = (unsigned)uart1isr;   //ISR deklarieren
  VICVectCntl0 = (1<<5)|7;   //Interrupt Priority
  VICIntSelect |= (1<<7);   //UART1 im FIQ-Modus
  VICIntEnable |= (1<<7);   //Timer0 Interrupt enable
}

void uart1isr(void)
{
  uartdata=UART1_RBR;
  VICVectAddr = 0;   //"Submit" Interrupt
}

Autor: Rangi Jones (rangi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kenns beim ARM7 (AT91SAM7...). Da ist es so:
der FIQ hat einen eigenen Vector !
Normalerweise hat der ARM Core nur sehr wenige Interrupts. Einer davon 
ist der INT (dahinter verbergen sich alle Hardwareinterrupts) und einer 
ist der FIQ. Damit das ganze funktioniert, muss man den Vector seines 
Programms in die Vectortabelle eintragen. Hier kann man dann einen 
Verweis auf den AIC hinterlegen und dann den FIQ wie jeden anderen 
externen Interrupt behandeln.
Es könnte sein, dass das beim lpc auch so ist.
Ich empfehle mal einen Blick in dein Startup-Script und das 
Linkerscript. In letzterer muss eine Stackgröße für einen FIQ-Stack 
angegeben werden.
Viel Erfolg

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im crt0.S:
_fiq:   .word uart1isr

Evtl. mal überprüfen, ob
  VICVectAddr = 0;
beim FIQ wirklich angebracht ist.

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.