Forum: Mikrocontroller und Digitale Elektronik FIQ mit ARM lpc2136


von Philipp G. (flashmaster)


Angehängte Dateien:

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 ;)
1
void uart1_irq_init(void);
2
void uart1isr(void) __attribute__ ((interrupt("FIQ")));
3
4
/*Main-Funktion*/
5
int main(void)
6
{
7
  systeminit();
8
  gpioinit();  
9
        // setup the UART;
10
  uart1init(UART_BAUD(BAUD), UART_8N1, UART_FIFO_8); 
11
  
12
  uart1_irq_init();
13
  enableFIQ();
14
  
15
  for(;;)            
16
  {
17
  /*Tut irgendwas*/
18
  }
19
  return 0;
20
}
21
22
void uart1_irq_init(void)
23
{
24
  UART1_LCR = 0x03;   //8bit lenght
25
  UART1_FCR = 0x07;   //Enable and reset TX and RX FIFO.
26
  UART1_IER |= 0x7;   //Enable RBR/THRE/RX Line Interrupts
27
  VICVectAddr0 = (unsigned)uart1isr;   //ISR deklarieren
28
  VICVectCntl0 = (1<<5)|7;   //Interrupt Priority
29
  VICIntSelect |= (1<<7);   //UART1 im FIQ-Modus
30
  VICIntEnable |= (1<<7);   //Timer0 Interrupt enable
31
}
32
33
void uart1isr(void)
34
{
35
  uartdata=UART1_RBR;
36
  VICVectAddr = 0;   //"Submit" Interrupt
37
}

von Rangi J. (rangi)


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

von (prx) A. K. (prx)


Lesenswert?

Im crt0.S:
_fiq:   .word uart1isr

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.