USB中国技术论坛

armer 发表于 2006-8-3 20:42

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

[url=http://www.glorywork.com/][/url]

/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  Copyright (c)  $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$            肖遥电子(广州)研发中心
$          Shawyoo Electronics (GuangZhou) R&D Center
$                        
[url=http://www.shawyoo.com/][u]http://www.shawyoo.com[/u][/url]
   Email:
[url=mailto:autoele@qq.com][u]autoele@qq.com[/u][/url]

$         QQ群:9069471/9069433/9524253  All rights reserved.   
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  Copyright (c)  $$$$$$$$$$$$$$$$$$$$$$$$$$$ */
/*  
                                      文件描述
文件名:   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
   全局变量:
   创建时间:
   修改时间:
*/  
// $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 以上原形声明的函数供本函数调用
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 Txd.Length -= Len;
return 0;
}   // End of 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.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 Txd.Length -= Len;
return 0;
}  // End of 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     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       {      
       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 }
} // 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<    U0THR = 'A';    // 保证函数正常
   NOP(); NOP();
}  // End of UART0 initialize function  
   

/*
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  End of File $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/  
[url=http://www.glorywork.com/][/url]

Powered by USB中国技术论坛 Archiver 6.1.0  © 2001-2007USB中国技术论坛

USB开发中国论坛静态html版本,已经seo36.com协助优化!