综合资讯 技术文章 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

电子技术 | 技术资料 | 嵌入式系统 | 单片机专题 | DSP专题
EDA/PLD专题 | 电源技术专题 | 电子制作专题 | 其他综合 | 芯片选型

所在的位置:首页在线阅读嵌入式系统ARM技术专辑正文
 
LPC2xxx的串口 FIFO中断方式的程序

文件名:      UART0.c
    功能描述:串口0底层驱动函数
    编译环境:Keil for ARM uVision3
    目标CPU:  LPC2000
    作者:     
    创建时间:
    建议编辑环境:UltraEdit 11.00a+  制表符宽度为三个字符,程序可读性更好。
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/                      
#include        "RTOS.h"

#define        UART0_GLOBALS

#include    "UART0.h"

#define        TEST_UART0            0



/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函数名称: Uart0_SendChar
   功能描述: 以查询方式从串口0发送一字节数据。此函数基本不用
   入口参数: 待发送的数据
   出口参数: 无
   全局变量:  无
   创建时间:
   修改时间:
    注:          调用本函数前需关串口中断
*/     
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
void       Uart0_SendChar(uchar data)
{
    while((U0LSR & 0x00000040) == 0);    //
    U0THR = data;    
}


/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函数名称:PutString
   功能描述:从串口0发送一块数据(字符串,要用结束符'\0')
   入口参数:待发送的字符串数据指针
   出口参数:发送成功与否标志,成功为0,不成功为非0
   全局变量:
   创建时间:
   修改时间:
*/     
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
uchar         PutString(uchar  *p)
{
    uchar        i,Len;
    //RS485_TRANSMIT_ENABLE;          
    
    NOP();    NOP();    //return 0;
   if(Txd.Sending)
       return 1;                 // 串口忙,发送失败,需要等待
    Txd.Length = strlen(p);
    if(Txd.Length==0)
        return 1;
    TxdP = p;
    Txd.Sending = 1;
    if(Txd.Length>FIFO_LENGTH)         
        Len = FIFO_LENGTH;
    else                         
        Len = Txd.Length;
    for(i=0;i<Len;i++)    {    U0THR = *TxdP;        TxdP++;    }
    Txd.Length -= Len;
    return 0;
}   // End of <PutString> Function



/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函数名称:PutBuffer
   功能描述:从串口0发送一块数据(16进制)
   入口参数:初始检验和,数据长度,待发送的数据指针
   出口参数:发送成功与否标志,成功为0,不成功为非0
   全局变量:
   创建时间:
   修改时间:2005-8-10 增加是否重新计算校验和 if(!InitSum)
*/     
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
uchar         PutBuffer(uchar InitSum,uint16 L,uchar *p)
{
    uint16   i,Len;
    NOP();    NOP();
    if(Txd.Sending)
       return 1;         // 串口忙,发送失败,需要等待
   Txd.Length = L;
    TxdP = p;
    if(!InitSum)            // 如果调用本函数前已计算校验和,则这里不再计算
    {
        Txd.CheckSum = 0;
        for(i=0;i<Txd.Length;i++)
        {
           Txd.CheckSum ^= *p;
           p++;
        }
        *p = Txd.CheckSum;        // Add ChechSum at the end of the buffer
        Txd.Length += 1;               
    }
    Txd.Sending = 1;
    if(Txd.Length>FIFO_LENGTH)         
        Len = FIFO_LENGTH;
    else                         
        Len = Txd.Length;
    for(i=0;i<Len;i++)    {    U0THR = *TxdP;        TxdP++;    }
    Txd.Length -= Len;
    return 0;
}  // End of <PutBuffer> Function



/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函数名称:UART0_INT
   功能描述:UART0中断函数,实现UART0数据链路层数据通讯
   入口参数:无
   出口参数:无
   全局变量:
   创建时间:
   修改时间:
*/     
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
void            UART0_INT(void)   __irq      // UART0 interrupt function
{
   uchar       IIR,rc;
   uchar       i,FifoLen;
    uint16    Len;
   NOP();   NOP();    
    IIR = U0IIR;
    switch (IIR & 0x0e)          
    {
         case 0x02:            // Transmit interrupt $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$      
             NOP();    NOP();
            if(Txd.Length)
            {
                 if(Txd.Length>FIFO_LENGTH)         
                    Len = FIFO_LENGTH;
                else                         
                    Len = Txd.Length;
                for(i=0;i<Len;i++)    {    U0THR = *TxdP;        TxdP++;    }
                Txd.Length -= Len;
                Txd.Sending = TRUE;
             }
            else
            {
                 ClearTransmitFlag();            
                UserEvtFlag.UART0 = UART0_TRANSMIT_OK_EVT_FLAG;
                isr_evt_set(UART0_TRANSMIT_OK_EVT_FLAG,TaskID.UART0);                
            }
        break;    //      
        case 0x0c:        // 接收数据有效,超时。注:这里不能用break语句            
            Rec.OverTime = 1;
          case 0x04:     // 接收数据有效 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
            NOP();    NOP();
            FifoLen = 0;
           while((U0LSR&0x01) == 1)         //  最多14字节
           {
               rc = U0RBR;
               //////////////////////////////////// 接收数据
               NOP();    NOP();               
               if(Rec.Counter<UART0_REC_LENGTH)        // 不能超出缓冲区长度
               {                   
                   Rec.Buffer[Rec.Counter++] = rc;                                          
                   Rec.CheckSum ^= rc;
                    FifoLen ++;
               }               
           }    
           ///////////////////////////////////// 判断是否为帧头
           if(Rec.Receiving==0)
           {
               if((Rec.Buffer[0]==0xaa)&&(Rec.Buffer[1]==0x75))
               {
                   Rec.Command = Rec.Buffer[2];
                   Rec.Length = Rec.Buffer[3];
                   Rec.Length <<= 8;
                   Rec.Length |= (0x00ff&((uint)Rec.Buffer[4]));                   
                   for(i=0;i<8;i++) { Rec.Buffer[i] = Rec.Buffer[i+6];}
                   Rec.Counter = FifoLen-6;
                   Rec.Receiving = TRUE;
               }
               else
                   Rec.Error = TRUE;
           }
           /////////////////////////////////// 判断是否有超时,超时则为帧尾
           if((Rec.OverTime)||(Rec.Counter>=Rec.Length))
           {
               Rec.CheckSum ^= Rec.Buffer[Rec.Counter-1];               
               if(Rec.CheckSum!=Rec.Buffer[Rec.Counter-1])
                   Rec.Error = TRUE;                               
                UserEvtFlag.UART0 = UART0_RECEIVE_OK_EVT_FLAG;
                isr_evt_set(UART0_RECEIVE_OK_EVT_FLAG,TaskID.UART0);   //
           }
              NOP();    NOP();              
       
        break;
        default: break;
    }    // End of Switch                    
    VICVectAddr = 0;    
    NOP();   NOP();
    NOP();    NOP();
}  // End of UART0 Interrupt function




/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函数名称:ClearReceiveFlag
   功能描述:清除接收相关标志
   入口参数:清接收缓冲区标志
   出口参数:无
   全局变量: 无
   创建时间:
   修改时间:
*/     
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
void            ClearReceiveFlag(uint16 c)
{     
    NOP();    NOP();      
    Rec.CheckSum = Rec.Error = 0;
    Rec.Command = Rec.OverTime = 0;
    Rec.Counter  = Rec.Length   = Rec.Receiving = 0;            
    if(c)
    {    
        for(c=0;c<UART0_REC_LENGTH;c++)    { Rec.Buffer[c] = 0; }
    }
} // End of Function                 




/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函数名称:ClearTransmitFlag
   功能描述:清除发送缓冲区及相关标志
   入口参数:无
   出口参数:无
   全局变量:
   创建时间:
   修改时间:
*/     
void            Delay_mS(unsigned char  c);
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
void            ClearTransmitFlag(void)
{
    
    NOP();    NOP();         
    Txd.CheckSum = Txd.Sending = 0;    
    Txd.Length = 0;    
} // End of Function                  




/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    函数名称:UART0_Init
   功能描述:初始化UART0
   入口参数:无
   出口参数:无
   全局变量:
   创建时间:
   修改时间:
*/     
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
void            UART0_Init(void)
{
    uint16  Fdiv;        
    ///////////////  UART0缓冲区及相关标志清零
    NOP();    NOP();    
    ////////////////////////////////  UART0 Initialize    
    PINSEL0 |= 0x00000005;              // Enable RxD0 and TxD0  
   U0LCR = 0x83;                       
    Fdiv = (Fpclk / 16) / UART0_BPS;    // set baudrate
   U0DLM = Fdiv / 256;                            
    U0DLL = Fdiv % 256;        
    U0LCR = ((U0_DATA_BIT)|(U0_STOP_BIT<<2)|(U0_CHECK_BIT_EN<<3)|(U0_CHECK_BIT<<4));
   U0IER = 0x03;                       // Enable RDA and THRE interrupts
    U0FCR = 0xc7;                       // Eable FIFO
   VICVectAddr1  = (uint32)UART0_INT;
   VICVectCntl1  = (IRQ_ENABLE|UART0_INT_VECT);
   VICIntEnable  |= (1<<UART0_INT_VECT);                //
   U0THR = 'A';                // 保证函数<Uart0_SendChar>正常
   NOP();    NOP();
}  // End of UART0 initialize function




/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  End of File $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/

返回 上一页 下一页   信息发布:工号01   转引自: 【 】 【打印】 【关闭

关于我们 ┋ 友情链接


深圳市福田区海滨广场福业大厦12C
电话:0755-88305880 25960580 传真:0755-88305880
Copyright©2005-2007 无忧电子开发网版权所有

粤ICP备05064233号