von
Sergey S.
(Firma: ARM LPC2134, uVision3, in C)
(serik00 )
12.05.2009 09:14
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.
von
Micha (Gast)
12.05.2009 09:19
Meine Glaskugel liegt leider daheim:
- welcher Controller?
- welcher Compiler?
von
Lothar M.
(Firma: Titel)
(lkmiller )
(Moderator )
12.05.2009 09:20
Schön, dass wenigstens DU weißt, um welchen Prozessor/Compiler... es
sich handelt.
BTW: 1 void uart_isr ( void ) __irq
2 {
3 char IIR ;
4 while ((( IIR = U1IIR ) & 0x01 ) == 0 )
5 {
6 }
Eine while-Schleife hat in einer ISR nichts zu suchen.
von
Sergey S.
(Firma: ARM LPC2134, uVision3, in C)
(serik00 )
12.05.2009 09:34
Sorry
C-Comiler: ARMCC.EXE V3.0.0.951
Controller: LPC2134 (ARM)
Danke
von
Sergey S.
(Firma: ARM LPC2134, uVision3, in C)
(serik00 )
12.05.2009 10:29
muss ich was im startup File eintragen?
von
Sergey S.
(Firma: ARM LPC2134, uVision3, in C)
(serik00 )
12.05.2009 11:09
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.
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)?
U1DLM, U1DLL und U1FDR (nur bei LPC213xFBD64/01 vorhanden) sind abhängig
vom Takt und der gewünschten Baudrate.
von
Sergey S.
(Firma: ARM LPC2134, uVision3, in C)
(serik00 )
12.05.2009 11:23
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 }
Ändere mal die Zeile 1 VICVectCntl0 = 0x00000027 ;
um in 1 VICVectCntl7 = 0x00000027 ;
Du hast im Prinzip die ISR-Funktion dem Slot7 zugewiesen (VICVectAddr7),
aber den Slot0 aktiviert (VICVectCntl0).
von
Sergey S.
(Firma: ARM LPC2134, uVision3, in C)
(serik00 )
12.05.2009 11:56
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.
Ja, damit kannst du die Priorität vergeben, aber dann mußt du auch die
Funktionsadresse auf VICVectAddr0 zuweisen.
Wie hast du denn den UART0 initialisiert?
von
Sergey S.
(Firma: ARM LPC2134, uVision3, in C)
(serik00 )
12.05.2009 12:41
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.