Forum: Mikrocontroller und Digitale Elektronik ARM LPC1227 Hardware Interrupt - vorgehensweise


von Jonathan M. (jonathan_m68)


Lesenswert?

Hi!

Ich beschäftige mich jetzt schon eine Weile mit einem ARM LPC1227 
(LPCXPresso) Mikrocontroller, nachdem ich mit einem AVR schon 
erfahrungen gesammelt hatte.

Leider hänge ich gerade dabei fest einen hardware interrupt zu 
programmieren und bin trotz Anleitung und Google Suchen noch nicht 
darauf gekommen wie das zu bewerkstelligen ist. Ich will per Knopfdruck 
die LED an PIN 7 (GPIO0) zum leuchten bringen. Dafür habe ich den 
Schalteraufbau genommen der schon beim AVR funktioniert hat: Ein 
Schalter mit Kondensator und Widerstand sind an 5V DC angeschlossen 
(Hardware debounced).

leider tut sich da nichts. Wenn ich mit dem Multimeter nachmesse liegen 
auf dem PIN 3 (GPIO0) 5V und wenn der schalter gedrückt ist 0V. Der Pin 
soll bei fallender Flanke einen Interrupt auslösen.


Hier mein Code (geschrieben in der LPCXPresso IDE):

void initGPIO()
{
  LPC_SYSCON->SYSAHBCLKCTRL |= 0xE0010000UL; // GPIO Clock aktivieren
  LPC_GPIO0->DIR |= 1<<7;  // LED is P0_7
  LPC_GPIO0->CLR |= 1<<7; //LED PIN auf LOW setzen

  LPC_GPIO0->DIR &= ~(1<<3); //PIN 3 input(evtl unnötig da input
                                   // default)

  // LPC_GPIO0->IEV |= (1<<3); //ISR bei steigender flanke hat auch
                                     //nicht funktioniert
  NVIC_EnableIRQ(EINT0_IRQn);
  NVIC_SetPriority(EINT0_IRQn, 1 );
}

void PIOINT0_IRQHandler()
{
  LPC_GPIO0->NOT |= 1<<7; //toggle PIN 7
}

Bei der Priorität der ISR bin ich mir nicht sicher, soweit ich das 
verstanden habe gibt es 4 levels (0 - 3). Weiss zufällig noch jemand wie 
ich dieser ISR den NMI zuweise oder geht das einfach indem man die 
Priorität auf 0 setzt?

Was fehlt hier noch? Ich habe noch kein Register gefunden in dem ich den 
IRQ für PIN 3 aktivieren kann, soweit ich das mitbekommen habe kann man 
die ISRs nur für einen Port aktivieren, also hier GPIO0.

Jonathan

von Lothar (Gast)


Lesenswert?

Must Du noch auf LPCXPresso umändern:

Jonathan M. schrieb:
> void PIOINT0_IRQHandler()
> {
>   LPC_GPIO0->NOT |= 1<<7; //toggle PIN 7

    while(!GPIO0DATA_bit.P0_3);           // wait for release
    Delay(10000);                         // de-bounce

    GPIO0IC_bit.P0_3 = 1;                 // clear irq
> }

Jonathan M. schrieb:
> void initGPIO()
> {
>   LPC_SYSCON->SYSAHBCLKCTRL |= 0xE0010000UL; // GPIO Clock aktivieren
>   LPC_GPIO0->DIR |= 1<<7;  // LED is P0_7
>   LPC_GPIO0->CLR |= 1<<7; //LED PIN auf LOW setzen
>

    IOCON_PIO0_3 = 0x10;          // pull-up (default)
    GPIO0DIR_bit.P0_3 = 0;        // input (default)

    GPIO0IS_bit.P0_3 = 0;         // edge
    GPIO0IE_bit.P0_3 = 1;         // no mask

    GPIO0IC_bit.P0_3 = 1;         // clear irq

>   NVIC_EnableIRQ(EINT0_IRQn);
>   NVIC_SetPriority(EINT0_IRQn, 1 );
> }

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.