谢谢你关注本贴。
我想问一下,我现在用LPC2131做项目。用到串口0中断,
但我不明白的是,串口0怎么中断一次就不再发生第二次中断了呢?
代码如下:
初始化:
/*
*********************************************************************************************************
** 函数名称 :uart_init()
** 函数功能 :串口初始化,设置为8位数据位,1位停止位,无奇偶校验
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void uart_init (void)
{
uint16 Fdiv;
//串口0波特率设为38400
U0LCR = 0x83; // DLAB=1,允许设置波特率
Fdiv = (Fpclk / 16) / UART0_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; //3表示发送字符长度为8
//串口1设为115200
U1LCR = 0x83; /* DLAB=1,允许设置波特率 */
Fdiv = (Fpclk / 16) / UART1_BPS; /* 设置波特率 */
U1DLM = Fdiv / 256;
U1DLL = Fdiv % 256;
U1LCR = 0x03;
//设置管脚连接
PINSEL0 |= 0x00050005; // 设置I/O连接到UART0和UART1
//设置UART0中断
U0FCR=0x01 ; //使能FIFO,触发点为1字节
U0IER=0x01; //fifo int mode int
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1 = 0x26; // UART0中断通道分配到IRQ slot 1,即优先级次最高
VICVectAddr1 = (uint32)IRQ_UART0; // 设置UART0向量地址
VICIntEnable |= 1 << 0x06; // 使能uart0中断,写入0是无效的
//设置UART1中断
U1FCR=0x01 ; //使能FIFO,触发点为1字节
U1IER=0x01; //fifo int mode int
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl3 = 0x27; // UART1中断通道分配到IRQ slot 3,即优先级次最高
VICVectAddr3 = (uint32)IRQ_UART1; // 设置UART0向量地址
VICIntEnable |= 1 << 0x07; // 使能uart1中断,写入0是无效的
}
中断程序:
/*
*********************************************************************************************************
** 函数名称 :uart_init()
** 函数功能 :串口0的中断函数
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
uint8 uart0_buf[5],uart0_index=0x00;
void __irq IRQ_UART0(void)
{
uint8 temp;
IRQDisable(); //先关闭中断,防止自身嵌套和其它中断影响
if((U0IIR & 0x0F) == 0x04)
{
temp = U0RBR; // 读取FIFO的数据,并清除中断
if(temp==0x76) uart0_index=0x00;
if(uart0_index<5)uart0_buf[uart0_index++] = temp;
if((uart0_buf[0]==0x76)&&(uart0_buf[1]==0x00)&&(uart0_buf[2]==0x39)&&(uart0_buf[3]==0x00)&&(uart0_buf[4]==0x00))
{
handle_success();
reset_uart0();
}
}
VICVectAddr = 0x00; // 向量中断向量地址寄存器
IRQEnable(); //重新开启中断
}
/*
*********************************************************************************************************
** 函数名称 :reset_uart0()
** 函数功能 :复位串口0相关参数
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void reset_uart0(void)
{
uint8 i;
for(i=0x00;i<5;i++) uart0_buf[i++] = 0xff;
uart0_index=0x00;
}
各位能否指点一下?谢谢! |