⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm7andrs232.txt

📁 此文档描述了用rs232与arm7的串口通信问题。采用中断方式。
💻 TXT
字号:
文件描述
 文件名:   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 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -