Crossworks Arm LPC2478 Interrupt

Gast #1853479
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!
#1853593
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.