#include "config.h" #define ledcon 0xf0000000 #define uart_bps 115200
uint8 rcv_data[8]; //UART0接受数据缓冲区 volatile uint8 rcv_new; //接受新数据标志 /****************************** delay() *******************************/ void delayns(uint32 dly) { // uint32 i; for(;dly>0;dly--) ; } /* uart0_int() */ void uart0_init(void) { uint16 fdiv; U0LCR=0x83; //8bit enable 除数 fdiv=(Fpclk/16)/uart_bps; U0DLM=fdiv/256; U0DLL=fdiv%256; U0LCR=0x03; //8bit disable 除数 }
#if 1 void __irq IRQ_UART0(void) //uart0接受中断 { uint8 i; if((U0IIR&0x0f)==0x04) //判断UART0接受数据可用标志 { rcv_new=1; for(i=0;i<8;i++) rcv_data=U0RBR; } VICVectAddr=0; } #endif
#if 0 void uart0_rcvbyte(void) { uint8 i; while((U0LSR&0x01)==0); rcv_new=1; for(i=0;i<8;i++) rcv_data=U0RBR; } #endif
int main (void) {// add user source code uint8 i; char disp_buf[30]; volatile uint32 aAA; PINSEL0=0x00000005; //设置IO连接到UART0 ,p014为io PINSEL2=PINSEL2&0xfffffff7; //P1管脚选择设置 ,p16:25为IO //选中电子开关 IO0DIR=0x4000; //p014 output IO1DIR=0x00e00000; //p121:23 output IO0CLR=0x4000; //p014 output L IO1CLR=0x00e00000; //p121:23 output L选中电子开关X3Y3,及J4 uart0_init(); #if 1 U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节 U0IER = 0x01; // 允许RBR中断,即接收中断
VICIntSelect=0x00000000; //VIC_uart0中断初始化 VICVectCntl0=0x20|6; VICVectAddr0 = (int)IRQ_UART0; VICIntEnable=1<<6; #endif //uart0_rcvbyte(); IO2DIR=ledcon; T0PR=0; while(1) { if(rcv_new==1) //接受中断等待 { for(i=0;i<8;i++) disp_buf=rcv_data; } } return 0; }
问题: 我用的模板是周立功的ARM EXecutable image for lpac2200,并把修改设置系统模式堆栈处的代码为“MSRCPSR_c, #0x5f”也改了,即使能IRQ 中断。 1)这个程序在接受数据时进不了中断,不知道问题出在哪里? (在LPC2214的RXT0脚上用示波器能检测到我发送的数据(数据>=8位),但是就是芯片里中断不处理。) 2)我用查询方式时不管发送什么数据,都能收到两次,但是这个数据与我发的数据不一样。 (比如说发送12345678,第一次接受为1F#D22#3,第二次接受34567888,“#”表示乱码) |