char *pUART0; //这个是全局的 main () { int i=1; UART0_IRQ_init (9600);
VICIntSelect = 0 ; VICIntEnClr = 1<<6;; VICVectCntl5 = 0x20|6; // UART0中断通道分5 VICVectAddr5 = (int)UART0_Handler; // 设置UART0向量地址 VICIntEnable = 1<<6; // 使能UART0中断
Uart0_SendString_IRQ("
12345678901234567890123456789
");
i=1; //标号2
while(1);
return 0; } void UART0_IRQ_init(int UART0_BPS) { uint16 Fdiv0;
PINSEL0 &= ~(0xF << 4); PINSEL0 |= (0x5 << 4); U0LCR = 0x83; // 设置除数锁存位,DLAB = 1 Fdiv0 = (Fpclk / 16) / UART0_BPS; // 设置波特率 U0DLM = Fdiv0 / 256; U0DLL = Fdiv0 % 256; U0LCR = 0x03; //清除锁存,并设置工作模式 U0FCR = 0x87; // 使能FIFO,并设置触发点为8字节,复位T0FIFO,R0FIFO U0IER &= 0xf0; //中断禁止 U0IER |= 0x03; //RBA,THRE中断使能 Fdiv0 = U0IIR; //清除 }
void Uart0_SendString_IRQ(char *pt) { int i; pUART0 = pt; while (!(U0LSR & 0x40)) ; //等待发送缓冲为空 U0TER = 0; //禁止发送 for (i=16;i>0;i--) { if(*pUART0) U0THR = *pUART0++; } U0TER = 0x80; //开始发送 编号1 }
void __irq UART0_Handler (void){...}
仿真时,编号1执行后,U0IIR寄存器=c2,显示产生了发送中断,但是Uart0_SendString_IRQ一旦返回, 箭头到了标号2的行首时,U0IIR=C1,中断标志消失,程序一直往下执行,不会进入中断 我的芯片是LPC2378,启动代码用的NXP给的,相关部分:LDR PC, [PC, #-0x0120] ; Vector from VicVectAddr 最后的CPSR: MSR CPSR_c, #Mode_USR MOV SP, R0 SUB SL, SP, #USR_Stack_Size |