打印
[ZLG-ARM]

LPC2132 UART1自环测试(中断方式)

[复制链接]
1680|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xusnwise|  楼主 | 2007-7-17 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/************************************************************************
使用UART1与PC通讯,禁止MODEM, ARM CORE: LPC2132
自环测试,BPS=115200
************************************************************************/
#include    "config.h"

/************************************************************************
全局变量或常量定义区
error:        差错标志位
rev_buf:    接收中断缓冲区
rev_flag:    接收中断标志

*************************************************************************/
UINT8    error;
UINT8    rev_buf[10];
UINT8    rev_flag;

/***********************************************************************
UART1 Configure Sub Routine
BPS = Fclk/U1DLM_U1DLL/16 

*************************************************************************/
void    UART1_CFG(void)
{
    U1LCR = 0x83;                //8位字长,1bit停止位偶校验
    U1DLM = 0x0;                //波特率为115200BPS
    U1DLL = 0x06;                //设置UART1波特率为Pclk/U1DLL/16
    U1FCR = 0x81;                //使能RX,TX FIFO,触发点位8BYTE
    U1LCR = 0x03;                //切换寄存器访问
    U1IER = 0x07;                //使能RBR,THRE,RX线状态中断
    

}
/**********************************************************************
UART1中断服务程序
在超时或接收中断中不能用: U1THR = 0XFF;
                          U1THR = 0XFF;
启动发送中断,因为发送中断优先级最低;
所以应该设置标志位,在中断外启动发送中断
state:    状态变量缓存
i:        接收发送字节数
无参无返回类型
***********************************************************************/
void    __irq UART1_ISR(void)
{
    UINT8    state;
    static    UINT8 i;
    state = U1IIR;               //清除中断,必须读取UART1中断标识
    state &= 0x0F;
    
    switch (state)    
    {
        case    0x06:        
                {                               //接收差错
                    error = 1;
                    break;
                }
        
        case    0x04:                            //接收中断
                {
                    for(i=0;i<8;i++)
                    *(rev_buf+i) = U1RBR;
                    break;
                    
                    
                }
            
        case    0x0C:                            //超时中断
                {    
                     *(rev_buf+i) = U1RBR;    
                    i++;
                    *(rev_buf+i) = U1RBR;
                    i = 0;
                    rev_flag = 1;
                    break;
                    
                                        
                }
            
        case    0x02:                            //发送中断
                if(i<10)
                {
                    U1THR = *(rev_buf+i);
                    i++;
                    break;
                    }
                    
       }
    VICVectAddr = 0;                            //复位IRQ地址寄存器

}

/************************************************************************
IO configure Function

************************************************************************/
void    IO_CFG(void)
{
    PINSEL2    =    0x4;
    IO1DIR    |=    0x03FE0000;                //配置LED
    PINSEL0    |= 0x00050000;                //配置UART11,TX,RX
    IO0DIR = 1<<7;                        //配置BEEP
    IO1SET |=    0x03FE0000;
    IO0SET |= 1<<7;
    
}
/************************************************************************
Sub Routines,初始化VIC机制,使能IRQ中断,UART1中断分配在SLOT0,
指定ISR相应地址,VICVectorAdr0

*************************************************************************/
void    VIC_ini(void)
{
    IRQEnable();
    VICVectCntl0 = 0x27;
    VICIntEnClr &= ~(1<<7);
    VICIntSelect &= ~(1<<7);            //UART1分配为IRQ中断
    VICVectAddr0 = (UINT32)UART1_ISR;    //Map to Slot0
    //U1THR = 0xFF;                        //在使能发送中断前必须写入发送FIFO两个字节
    //U1THR = 0xFF;
    VICIntEnable |= 1<<7;                //使能UART1中断
    

}
/*************************************************************************
Main Routine
初始化系统,差错控制
*************************************************************************/
int    main(void)
{    
    IO_CFG();
    UART1_CFG();
    VIC_ini();
    
    while(1)
//判断是否有传输差错并激活蜂鸣器
    if(error)
    {
        error = 0;
        IO0CLR = 1<<7;
    }
//判断接收中断是否结束并启动发送中断
    else if(rev_flag)
    {
        rev_flag = 0;
        U1THR = 0xFF;
        U1THR = 0xFF;
    }
        
    return 0;
        
}
    
    

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

294

帖子

0

粉丝