Sprung zu ISR klappt nicht

OP (Firma: ARM LPC2134, uVision3, in C) #1259490
Lesenswert?

Guten Morgen,

bei UART1 Initialisierung habe ich Interrupt für UART1 eingeschaltet und 
als IRQ0 definiert.
Wenn jetzt ein Zeichen an UART1 verschicke, dann soll doch zu uart_isr 
-Routine gesprucngen werden. Dies passiert aber nicht. Was muss man noch 
berücksichtigen???
(Programmiert wird mit UVision von Keil)

1
/* UART1 Interrupt Initialization*********************************************/  
2
  U1IER = 0x00;               // Disable UART1 Interrupts  (U1 Interrupt Enable Register)
3
  U1IER = 0x03;         // Enable UART1Receive Data Available Interrupt and THRE Interrupts 
4
        
5
/* Initialize VIC (Vectored Interrrupt Controller) UART1 */
6

7
  VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
8
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
9
  VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt)

Diese befindet sich in einem anderem c.File
1
void uart_isr(void) __irq 
2
{
3
  char IIR;  
4

5
  while (((IIR = U1IIR) & 0x01) == 0) 
6
  {
7
     switch (IIR & 0x0E) 
8
   {
9

10
   }
11

12
  }
13

14
  VICVectAddr = 0; /* Acknowledge Interrupt */
15
}

In der void uart_isr(void) __irq  steht noch nichts drin, ich will 
erstmal den Sprung hinbekommen. Später soll das Zeichen in Buffer 
eingelesen werden.

Vielen dank im Voraus.
OP (Firma: ARM LPC2134, uVision3, in C) #1259667
Lesenswert?

in startup steht folgendes:
1
Vectors         LDR     PC, Reset_Addr         
2
                LDR     PC, Undef_Addr
3
                LDR     PC, SWI_Addr
4
                LDR     PC, PAbt_Addr
5
                LDR     PC, DAbt_Addr
6
                NOP                            ; Reserved Vector 
7
                LDR     PC, IRQ_Addr
8
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
9
                LDR     PC, FIQ_Addr
10
        ldr   pc,[pc,#-0xFF0]           ;// IRQ - read the VIC
hab ihr einen Tipp???
Vielen Dank im Voraus.
#1259677
Lesenswert?

Hast du die Pins als RXD und TXD definiert (PINSEL-Register)?
1
PINSEL0 &= 0xFFF0FFFF;
2
PINSEL0 |= 0x00050000;      // enable RxD1 and TxD1

Hast du die Baudrate und den UART-Mode eingestellt (U1LCR, U1DLM, U1DLL, 
U1FDR)?
1
U1LCR = 0x03;
U1DLM, U1DLL und U1FDR (nur bei LPC213xFBD64/01 vorhanden) sind abhängig 
vom Takt und der gewünschten Baudrate.
OP (Firma: ARM LPC2134, uVision3, in C) #1259688
Lesenswert?

Ja das habe ich.
Also ich schicke ein Zeichen von UART0 zu UART1. Beim empfang eines 
Zeichens im UART1 soll ein Interrupt ausgelöst wetden.
1
void Initialize (void)  
2
{           
3
   PINSEL0  =  0x00050005;      /*Enable TxD1,TxD0,RxD1,RxD0*/
4
  IODIR0  =  0x10400410;      /*OUT: RTS0_P0.4, RTS1_P0.14, COM1_P0.22,  COM0_P0.28*/
5
  IOCLR0  =  0x10400010;      /*LOW auf 0 COM1,0 = 0(RS485), RTS0=0(Sender)*/
6
  IOSET0  =  0x00000400;      /*HIGH auf 1 RTS1=1(Empfänger),P0.10*/
7

8
}
9

10
/*UART1 Initialization*/
11
 void uart1_init()
12
{ 
13
  U1LCR    =  0x83;    /*8 bits, 1 stopbit, no Parity, enable DLAB*/
14
  U1DLM    =  0x01;    /*9600 Baud Rate, 55.296.000 PCLK*/
15
  U1DLL    =  0x68;    /*360dez=0x0168*/
16
  U1LCR    =  0x03;    /*disable DLAB*/
17
  U1FCR    =  0x01;    /*enable UART1-FIFO*/
18

19
/* UART1 Interrupt Initialization*********************************************/  
20
  U1IER = 0x00;               // Disable UART1 Interrupts  (U1 Interrupt Enable Register)
21
  U1IER = 0x03;         // Enable UART1Receive Data Available Interrupt and THRE Interrupts 
22
        
23
/* Initialize VIC (Vectored Interrrupt Controller) UART1 */
24

25
  VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
26
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
27
  VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt) 
28
}


Zuerst will ich nur den Sprung hinbekomen:
1
void uart_isr(void) __irq 
2
{
3
 
4
  VICVectAddr = 0; /* Acknowledge Interrupt */
5
}
OP (Firma: ARM LPC2134, uVision3, in C) #1259731
Lesenswert?

Danke für den Hinweis.
Ich habs abgeändert, trotzdem funktioniert es nicht.
1
VICVectAddr7= (unsigned long)uart_isr;   // Funktion uart_isr wird ausgeführt, wenn der Interrupt auslöst wird.
2
  VICIntEnable = 0x00000080;        //enable UART1 interrupt  
3
  //VICVectCntl0 = 0x00000027;        // 1<<5(IRQ Slot_en | 7(UART1-interrupt)
4
  VICVectCntl7 = 0x00000027;

Bin hier am verzweifeln.


VICVectCntIch dachte das man mit VICIntCNTL0 die Priorität vergeben 
kann:

Vector control 0 register. Vector Control Registers 0-15 each
control one of the 16 vectored IRQ slots. Slot 0 has the
highest priority and slot 15 the lowest.
OP (Firma: ARM LPC2134, uVision3, in C) #1259790
Lesenswert?

UARTo
1
  U0LCR    =  0x83;    /*8 bits, 1 stopbit, no Parity, enable DLAB*/
2
  U0DLM    =  0x01;    /*9600 Baud Rate, 55.296.000 PCLK*/
3
  U0DLL    =  0x68;    /*360dez=0x0168*/
4
  U0LCR    =  0x03;    /*disable DLAB*/
5
  U0FCR    =  0x01;    /*enable UART1-FIFO*/
6
  U0FCR    =  0x01;

FIFo habe ich bei beiden UARTS aktiviert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren