LPC2xxx ARM7 串口 FIFO中断方式 的源代码

/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  Copyright (c)  $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$            肖遥电子(广州)研发中心
$          Shawyoo Electronics (GuangZhou) R&D Center
$                        http://www.shawyoo.com   Email: autoele@qq.com
$         QQ群:9069471/9069433/9524253  All rights reserved.  
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  Copyright (c)  $$$$$$$$$$$$$$$$$$$$$$$$$$$ */
/* 
                                      文件描述
 文件名:   UART0.c
 功能描述:串口0底层驱动函数
 编译环境:Keil for ARM uVision3
 目标CPU:  LPC2000
 作者:  肖建辉
 创建时间:
 建议编辑环境:UltraEdit 11.00a+  制表符宽度为三个字符,程序可读性更好。
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/      
#i nclude  "RTOS.h"

#define  UART0_GLOBALS

#i nclude    "UART0.h"

#define  TEST_UART0   0

 

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


/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 函数名称:PutString
   功能描述:从串口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+1)))
     {
      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 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值