I know I've asked this question many many times, but I still can't
figure out what is wrong. I've tried some of the code on the forums,
and that seemed to work. When I cut and paste it into my project it
no longer seems to work. I've reduced this to as simple as I can get
it, can anyone see some thing wrong?
The main.c there in full, you should just be able to compile it if you
use Keil's (if you have gcc, it might need a minor modification). I
believe that this should send out an infinite number of 'a's, which of
course it does on the simulator, but not in real life. When I debug
it via JTAG in uVision3, I see the THRE interrupt for a short while,
but then it dissappears, but the ISR is never called (as seen by the
LED still being on). Yes I have tested the LED code, it works.
Hear is some code from my startup.s (I'm using Keil's)
// Enter Supervisor Mode and set its Stack Pointer
MSR CPSR_c, #Mode_SVC|I_Bit|F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
// Stay in supervisor mode, IRQ and FIQ
MSR CPSR_c, #Mode_SVC
// Enter the C code
LDR R0,=main
TST R0,#1 ; Bit-0 set: main is Thumb
LDREQ LR,=exit?A ; ARM Mode
LDRNE LR,=exit?T ; Thumb Mode
BX R0
ENDP
Here is my main.c
#define PINSEL0 (*((volatile unsigned long *) 0xE002C000))
#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C))
#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010))
#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014))
#define VICVectAddr (*((volatile unsigned long *) 0xFFFFF030))
#define VICVectAddr0 (*((volatile unsigned long *) 0xFFFFF100))
#define VICVectCntl0 (*((volatile unsigned long *) 0xFFFFF200))
#define VICVectAddr1 (*((volatile unsigned long *) 0xFFFFF104))
#define VICVectCntl2 (*((volatile unsigned long *) 0xFFFFF204))
#define U0THR (*((volatile unsigned long *) 0xE000C000))
#define U0RBR (*((volatile unsigned long *) 0xE000C000))
#define U0DLL (*((volatile unsigned long *) 0xE000C000))
#define U0DLM (*((volatile unsigned long *) 0xE000C004))
#define U0IER (*((volatile unsigned long *) 0xE000C004))
#define U0IIR (*((volatile unsigned long *) 0xE000C008))
#define U0FCR (*((volatile unsigned long *) 0xE000C008))
#define U0LCR (*((volatile unsigned long *) 0xE000C00C))
#define U0LSR (*((volatile unsigned long *) 0xE000C014))
#define U0SCR (*((volatile unsigned long *) 0xE000C01C))
#define IO0PIN (*((volatile unsigned long *) 0xE0028000))
#define IO0SET (*((volatile unsigned long *) 0xE0028004))
#define IO0DIR (*((volatile unsigned long *) 0xE0028008))
#define IO0CLR (*((volatile unsigned long *) 0xE002800C))
#define LED_PIN 0x00000100
#define LED_OFF (IO0SET = LED_PIN)
#define LED_ON (IO0CLR = LED_PIN)
#define PCLK (60000000)
#define UART_BAUD(baud) ((unsigned short)((PCLK / ((baud) * 16.0)) +
0.5))
void main (void);
void uart_isr (void);
static int irq_occured = 0;
void main(void) {
unsigned short uart_divisor;
volatile unsigned char dummy;
unsigned int x = 0;
IO0DIR = LED_PIN; /* enable as output */
LED_ON;
PINSEL0 = 0x00000005;
// Setup UART
U0IER = 0x00;
dummy = U0IIR;
dummy = U0IIR;
dummy = U0DLM;
U0LCR = 0x80; // Enable DLAB
uart_divisor = ((unsigned short)((PCLK / ((19200) * 16.0)))+0.5);
U0DLL = uart_divisor&0xff;
U0DLM = 0;
U0LCR &= 0x7F; // Disable DLAB
U0LCR = 0x03; // Enable DLAB
U0IER = 0x07;
// Setup interrrupts
VICIntSelect = 0x00000000; // No FIQs
VICIntEnable = (0x1 << 6); // 6 = Uart 0
VICVectCntl0 = 0x20 | 6;
VICVectAddr0 = (unsigned long)uart_isr;
U0THR = '1';
U0THR = '2';
U0THR = '3';
U0THR = '4';
U0THR = '5';
U0THR = '6';
while(1);
}
void uart_isr (void) __irq {
volatile char dummy;
LED_OFF;
dummy = U0IIR;
dummy = U0LSR;
U0THR = 'a';
VICVectAddr = 0;
}Message
UART ISR
2004-11-04 by peterburdine
Attachments
- No local attachments were found for this message.