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

📄 uart.lst

📁 针对飞利浦LPC214x的虚拟串口程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
ARM COMPILER V2.53,  uart                                                                  09/06/07  15:43:41  PAGE 1   


ARM COMPILER V2.53, COMPILATION OF MODULE uart
OBJECT MODULE PLACED IN .\Obj\uart.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe uart.c THUMB BROWSE DEFINE(MCB2140) DEBUG PRINT(.\LST\UART.LST) TABS(4) OBJE
                    -CT(.\Obj\uart.obj) 

stmt  level    source

    1          
    2          /*******************************************************************
    3          * 文 件 名:  uart.c
    4          *版本/时间:  v1.10  2006/06/29
    5          * 描    述:  UART0/1的通讯例程,假设Fosc=12M,Fcclk=Fpclk=60M
    6          * 作    者:  lenglx
    7          *-------------------------------------------------------------------
    8          * 修改记录:
    9          * 修改时间:
   10          * 描    述:
   11          * 修 改 人:
   12          *******************************************************************/
   13          
   14          #include <LPC214X.H>
   15          #include "type.h"
   16          #include "usb.h"
   17          #include "usbcfg.h"
   18          #include "usbhw.h"
   19          #include "uart.h"
   20          
   21          
   22          // 4个缓冲区,uart0接收/发送,uart1接收/发送
   23          // 接收缓冲区的数据要等待USB读取,如果USB读取不及时,有可能丢失数据,所以缓冲区可设置稍微大点.
   24          
   25          #define RCV_BUF_LEN     1024
   26          #define SEND_BUF_LEN    512
   27          
   28          BYTE    SendBuf0[SEND_BUF_LEN];
   29          BYTE    RcvBuf0[RCV_BUF_LEN];
   30          BYTE    SendBuf1[SEND_BUF_LEN];
   31          BYTE    RcvBuf1[RCV_BUF_LEN];
   32          DWORD   r_first0, r_first1, r_next0, r_next1;
   33          DWORD   s_first0, s_first1, s_next0, s_next1;
   34          
   35          
   36          /*
   37              发送/接收 缓冲区是1个循环缓冲,如下图.
   38          
   39            图 1)
   40                 |       |first                    |next                     |
   41                 |  not  |                         |                         |
   42                 +-used--+--------valid data-------+---------not used--------+
   43                 |       v                         v                         |
   44                 .-----------------------------------------------------------.
   45                 |                  recive or send buffer                    |
   46                 '-----------------------------------------------------------'
   47          
   48          
   49             图 2)
   50                 |       |next                     |first                    |
   51                 | valid |                         |                         |
   52                 +-data--+--------not used---------+-------valid data--------+
   53                 |       v                         v                         |
   54                 .-----------------------------------------------------------.
   55                 |                  recive or send buffer                    |
   56                 '-----------------------------------------------------------'
   57          
   58          
ARM COMPILER V2.53,  uart                                                                  09/06/07  15:43:41  PAGE 2   

   59              位于first和next之间的区域是已经接收的数据或者将要发送的数据.
   60              其它区域是空的区域.
   61              此缓冲区是1个循环缓冲区,当指针达到缓冲区的末尾,将循环到缓冲区头重新开始.
   62              当first==next,表示是整个缓冲区无任何数据.
   63              当next=first-1,表示缓冲区已满.
   64          */
   65          
   66          /*******************************************************************
   67          * 功能描述: 重置缓冲区指针  
   68          * 参    数:
   69          * 返    回:
   70          * 备    注: 
   71          *******************************************************************/
   72          
   73          void    ResetBufferPointer(DWORD dwPortNum)
   74          {
   75   1          if(dwPortNum==0)
   76   1          {
   77   2              s_first0 = s_next0 = 0;
   78   2              r_first0 = r_next0 = 0;
   79   2          }
   80   1          else
   81   1          {
   82   2              s_first1 = s_next1 = 0;
   83   2              r_first1 = r_next1 = 0;
   84   2          }
   85   1      }
   86           
   87          /*******************************************************************
   88          * 功能描述:     
   89          * 参    数:
   90          * 返    回:
   91          * 备    注: 
   92          *******************************************************************/
   93          void    UartDataToHost(DWORD dwPort)
   94          {
   95   1          BYTE tmpbuf[USB_MAX_PACKET];
   96   1          DWORD dwEp;
   97   1          DWORD next;
   98   1          DWORD first;
   99   1          BYTE * pBuf;
  100   1          DWORD i;
  101   1          DWORD dwCnt;
  102   1      
  103   1          // 因为此函数调用比较频繁,在没数据的时候尽量快点返回
  104   1          if( (dwPort==0 && r_next0==r_first0) || (dwPort==1 && r_next1==r_first1))
  105   1              return;
  106   1              
  107   1      
  108   1          dwEp    = dwPort==0 ? 2 : 5;
  109   1          next    = dwPort==0 ? r_next0 : r_next1;
  110   1          first = dwPort==0 ? r_first0 : r_first1;
  111   1          pBuf = dwPort==0 ? RcvBuf0 : RcvBuf1;
  112   1          dwCnt = USB_MAX_PACKET;
  113   1          i=0;
  114   1      
  115   1          // 将接收缓冲区的数据移动到tmpbuf
  116   1          while(dwCnt--)
  117   1          {
  118   2              if(next == first)
  119   2                  break;
  120   2              tmpbuf[i] = pBuf[first];
  121   2              if(++first >= RCV_BUF_LEN)
  122   2                  first = 0;
  123   2              i++;
  124   2          }
ARM COMPILER V2.53,  uart                                                                  09/06/07  15:43:41  PAGE 3   

  125   1          USB_WriteEP(dwEp | 0x80, tmpbuf, i);
  126   1      
  127   1          if(dwPort == 0)
  128   1              r_first0 = first;
  129   1          else
  130   1              r_first1 = first;
  131   1      }
  132          /*******************************************************************
  133          * 功能描述: 将从USB来的数据发送到UART端口   
  134          * 参    数:
  135          * 返    回:
  136          * 备    注: 
  137          *******************************************************************/
  138          void    HostDataToUart(DWORD dwPort)
  139          {
  140   1          BYTE tmpbuf[USB_MAX_PACKET];
  141   1          DWORD dwEp  = dwPort==0 ? 2 : 5;
  142   1          DWORD next  = dwPort==0 ? s_next0 : s_next1;
  143   1          DWORD first = dwPort==0 ? s_first0 : s_first1;
  144   1          BYTE * pBuf = dwPort==0 ? SendBuf0 : SendBuf1;
  145   1          DWORD dwCnt = USB_ReadEP(dwEp, tmpbuf);
  146   1          DWORD i=0;
  147   1          // 将数据移到发送缓冲区
  148   1          while(dwCnt--)
  149   1          {
  150   2              if(next == first-1)
  151   2                  break;
  152   2              pBuf[next] = tmpbuf[i];
  153   2              if(++next >= SEND_BUF_LEN)  
  154   2                  next = 0;
  155   2              i++;
  156   2          }
  157   1      
  158   1          if(dwPort == 0)
  159   1          {
  160   2              s_next0 = next;
  161   2              if(U0LSR & 0x40 && s_first0 != s_next0) // 发送器为空,需要重新启动发送
  162   2              {
  163   3                  U0THR = pBuf[s_first0];
  164   3                  if(++s_first0 >= SEND_BUF_LEN)
  165   3                      s_first0 = 0;
  166   3              }
  167   2          }
  168   1          else
  169   1          {
  170   2              s_next1 = next;
  171   2              if(U1LSR & 0x40 && s_first1 != s_next1)
  172   2              {
  173   3                  U1THR = pBuf[s_first1];
  174   3                  if(++s_first1 >= SEND_BUF_LEN)
  175   3                      s_first1 = 0;
  176   3              }
  177   2          }
  178   1      }
  179          
  180          /*******************************************************************
  181          * 功能描述: irq中断函数,处理UART0的字节接收/发送
  182          * 参    数:
  183          * 返    回:
  184          * 备    注: 
  185          *******************************************************************/
  186          void    Uart0_irq(void) __irq
  187          {
  188   1          uchar   iir,ch;
  189   1          while(1)  // 循环处理,直到UART0中无任何挂起的中断
  190   1          {
ARM COMPILER V2.53,  uart                                                                  09/06/07  15:43:41  PAGE 4   

  191   2              if((iir = U0IIR) & 1)
  192   2                  break;
  193   2              switch(iir & 0x0e)
  194   2              {
  195   3              case 0x04:  // RDA.
  196   3              case 0x0c:  // CTI.
  197   3                  while(U0LSR & 1)  //将fifo中的所有数据读完
  198   3                  {
  199   4                      ch = U0RBR;
  200   4                      if(r_next0 != r_first0-1)
  201   4                      {
  202   5                          RcvBuf0[r_next0] = ch;
  203   5                          if (++r_next0 >= RCV_BUF_LEN)
  204   5                              r_next0 = 0;
  205   5                      }
  206   4                  }
  207   3                  break;
  208   3      
  209   3              case 0x02:  // THR Empty.
  210   3                  {
  211   4                      DWORD nCnt = 16; //fifo counter
  212   4                      while( s_next0 != s_first0 && nCnt--)
  213   4                      {
  214   5                          U0THR = SendBuf0[s_first0];
  215   5                          if(++s_first0 >= SEND_BUF_LEN)
  216   5                              s_first0 = 0;
  217   5                      }
  218   4                  }
  219   3                  break;
  220   3              default:
  221   3                  ;
  222   3              }  
  223   2          } 
  224   1      
  225   1          VICVectAddr=0;
  226   1      }
  227          
  228          void    Uart1_irq(void) __irq
  229          {
  230   1          uchar   iir,ch;
  231   1          while(1)  // 循环处理,直到UART1中无任何挂起的中断
  232   1          {
  233   2              if((iir = U1IIR) & 1)
  234   2                  break;
  235   2              switch(iir & 0x0e)
  236   2              {
  237   3              case 0x04:  // RDA.
  238   3              case 0x0c:  // CTI.
  239   3                  while(U1LSR & 1)  //将fifo中的所有数据读完
  240   3                  {
  241   4                      ch = U1RBR;
  242   4                      if(r_next1 != r_first1-1)
  243   4                      {
  244   5                          RcvBuf1[r_next1] = ch;
  245   5                          if (++r_next1 >= RCV_BUF_LEN)
  246   5                              r_next1 = 0;
  247   5                      }
  248   4                  }
  249   3                  break;
  250   3      
  251   3              case 0x02:  // THR Empty.
  252   3                  {
  253   4                      DWORD nCnt = 16; //fifo counter
  254   4                      while( s_next1 != s_first1 && nCnt--)
  255   4                      {
  256   5                          U1THR = SendBuf1[s_first0];
ARM COMPILER V2.53,  uart                                                                  09/06/07  15:43:41  PAGE 5   

  257   5                          if(++s_first1 >= SEND_BUF_LEN)
  258   5                              s_first1 = 0;
  259   5                      }
  260   4                  }
  261   3                  break;
  262   3              default:
  263   3                  ;
  264   3              }  
  265   2          } 

⌨️ 快捷键说明

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