Forum: Mikrocontroller und Digitale Elektronik Crossworks Arm LPC2478 Interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Crossworksstarter (Gast)


Lesenswert?

Hallo zusammen,
ich bin Arm-Neuling und verwende Crossworks 1.7 mit einen LPC2478-Board

Ich möchte mich in die Materie einarbeiten, bisher habe ich mich in die 
I/O Geschichte eingelesen. Und nun möchte ich die Interrupt-Geschichte 
verstehen lernen. Ich habe schon Stunden gesucht, habe natürlich viele 
Beispiele gefunden, doch es klappt nicht so richtig. Viele Beispiele 
sind für den LPC2148 und da wird das Register VICVectCntl0 geproggt. Das 
gibt es wohl nicht beim LPC2478??

Teilerfolge:
Es wird ein Interrupt ausgelöst, doch der Sprung in die ISR endet im 
Nirgendwo. Ich habe Probleme, die ISR richtig zu programmieren.


So habe ich bisher rumgedoktert:
1
#include <targets/LPC2478.h>
2
3
void fiq_handler(void) __attribute__((naked));
4
5
6
//  LED (yellow  pin 66 P1[18]
7
//
8
//  button with BUT1 pin 67  P2[19]
9
10
11
#define LED   (1<<18) // Port 1
12
#define Taste (1<<19) // Port 2
13
#define GPIOM 0       // Diese Bit schaltet im Register SCS die FIOPORTs frei
14
#define EINT3  (1<<17)
15
16
int main (void)
17
{
18
  SCS = (1<<GPIOM);  
19
  FIO1DIR= LED;
20
 
21
  IO2IntEnF = Taste;
22
23
  VICIntEnable = EINT3;
24
  VICVectAddr1 = (unsigned long) fiq_handler;
25
  VICVectPriority1 = 5;
26
 
27
  __ARMLIB_enableIRQ();
28
29
  for(;;)
30
  {
31
      FIO1SET= LED;
32
      FIO1CLR= LED;
33
  }
34
}
35
36
void fiq_handler(void)
37
{
38
  double counter;
39
  ++counter;
40
}



Wäre nett, wenn mir da jemand helfen könnte, oder ein Beispiel für 
Crossworks und LPC2478 hat.

Vielen Dank im Voraus!

von Michael G. (let)


Lesenswert?

Mit einem fertigen Beispiel für Crossworks kann ich nicht dienen,
da ich es nicht benutze (dieser Makro-Vodoo macht mich krank).

Du solltest zunächst zwischen IRQ und FIQ unterscheiden. Im Code
wird ein fiq_handler() definiert, der als IRQ handler fungiert.
Dürfte in diesem Fall zwar egal sein, stiftet aber zumindest
Verwirrung.
Desweiteren sind Beispiele für den LPC21xx/LPC22xx nicht sehr
hilfreich da die LPC23xx/24xx einen anderen VIC verwenden.

Ich sehe drei Fehler:
1. Der EINT3 wird aktiviert aber der Handler wird bei VICVectAddr1
eingetragen. Das sollte VICVectAddr17 sein.
Die VICVectCntl Register heißen jetzt VICVectPriority. Auch hier
ist es bei VICVectPriority17 zu tun.

2. Der Handler wird als "naked" deklariert, enthält aber keinerlei
Interrupt spezifischen Code. Ich nehme mal an das Crossworks
einen Haufen Makros bereitstellt die da rein müssen.
Eine Alternative wäre es den Handler mit "__attribute__ 
((interrupt("IRQ")))"
zu deklarieren. Allerdings gibt es da zumindest bei älteren GCCs
Probleme in Verbindung mit Thumb-Code. Module die solche Handler 
enthalten
müssen daher für den ARM-Mode compiliert werden. Das mag sich
inzwischen geändert haben. Thumb-Code bringt auf dem LPC2000 aber
ohnehin nicht viel, außer das er langsamer ist und ein paar Prozent
Code einspart.

3. Das Ende des Interrupts wird dem VIC nicht mitgeteilt. Das
macht man durch "VICVectAddr=0;" am Ende des Handlers. Andernfalls
wird der Handler gleich wieder aufgerufen.

 - Michael

von (prx) A. K. (prx)


Lesenswert?

Crossworksstarter schrieb:

> Das gibt es wohl nicht beim LPC2478??

LPC2148 und LPC2478 verwenden verschiedene Interrupt-Controller. 
Vielleicht findest du ein Beispiel für einen LPC23xx, die haben den 
gleichen Interrupt-Controller.

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.