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

📄 serial.lst

📁 基于keil环境
💻 LST
📖 第 1 页 / 共 2 页
字号:
ARM COMPILER V2.51a,  Serial                                                               19/07/06  11:31:13  PAGE 1   


ARM COMPILER V2.51a, COMPILATION OF MODULE Serial
OBJECT MODULE PLACED IN Serial.OBJ
COMPILER INVOKED BY: D:\Embedded\KeilC\ARM\BIN\CA.exe Serial.c THUMB DEBUG TABS(4) 

stmt  level    source

    1          /*************************************************************************
    2          * File Name:Serial.c
    3          * Description:串口DMA发送方式通信--CPU工作频率为60MHz(开发板外接8MHz),波
    4          *              特率为19200bps,字符长度8位,奇偶校验位无,停止位1位。允许
    5          *              UART接收DMA,允许接收错误中断,启用FIFO,接收FIFO触发DMA级别
    6          *              为12字节。不使用Modem自动流控,采用DMA方式通信。
    7          * Date:2006-07-19
    8          *************************************************************************/
    9          
   10          // 中断控制器寄存器定义
   11          #define INTCON      (*(volatile unsigned *)0x01E00000)
   12          #define INTPND      (*(volatile unsigned *)0x01E00004)
   13          #define INTMOD      (*(volatile unsigned *)0x01E00008)
   14          #define INTMSK      (*(volatile unsigned *)0x01E0000C)
   15          #define I_ISPC      (*(volatile unsigned *)0x01E00024)
   16          
   17          // DMA控制器寄存器定义
   18          #define BDCON0      (*(volatile unsigned *)0x01F80000)
   19          #define BDISRC0     (*(volatile unsigned *)0x01F80004)
   20          #define BDIDES0     (*(volatile unsigned *)0x01F80008)
   21          #define BDICNT0     (*(volatile unsigned *)0x01F8000C)
   22          #define BDCSRC0     (*(volatile unsigned *)0x01F80010)
   23          #define BDCDES0     (*(volatile unsigned *)0x01F80014)
   24          #define BDCCNT0     (*(volatile unsigned *)0x01F80018)
   25          
   26          // UART寄存器定义
   27          #define ULCON0      (*(volatile unsigned *)0x01D00000)
   28          #define UCON0       (*(volatile unsigned *)0x01D00004)
   29          #define UFCON0      (*(volatile unsigned *)0x01D00008)
   30          #define UMCON0      (*(volatile unsigned *)0x01D0000C)
   31          #define UTRSTAT0    (*(volatile unsigned *)0x01D00010)
   32          #define UERSTAT0    (*(volatile unsigned *)0x01D00014)
   33          #define UFSTAT0     (*(volatile unsigned *)0x01D00018)
   34          #define UMSTAT0     (*(volatile unsigned *)0x01D0001C)
   35          #define UTXH0       (*(volatile unsigned *)0x01D00020)
   36          #define URXH0       (*(volatile unsigned *)0x01D00024) 
   37          #define UBRDIV0     (*(volatile unsigned *)0x01D00028)
   38          
   39          #define MCLK 60000000   /* Master Clock */
   40          #define BR      19200   /* Baud Rate */
   41          #define BRD ((int)(MCLK/16.0/BR+0.5)-1) /* Baud Rate Divisor */
   42          #define RXDATA_SIZE     0xFF    /* Baud Rate */
   43          
   44          void uart_init(void);   // Uart初始化
   45          void isr_init(void);    // 中断控制器初始化
   46          void dmac_init(void);   // DMA控制器初始化
   47          
   48          unsigned char rxdata[RXDATA_SIZE];  // 接收缓冲区
   49          
   50          
   51          void main()
   52          {
   53   1          uart_init( );       // Uart初始化
   54   1          isr_init( );        // 中断控制器初始化
   55   1          dmac_init( );       // DMA控制器初始化
   56   1          
   57   1          while(1)            // 死循环,等待中断
   58   1          {
   59   2          }
ARM COMPILER V2.51a,  Serial                                                               19/07/06  11:31:13  PAGE 2   

   60   1      }
   61          
   62          
   63          // 串口初始化
   64          void uart_init(void)
   65          {
   66   1          UBRDIV0 = BRD;          // 19200bps
   67   1          ULCON0 = 0x03;          // 帧长度8位,停止位1位,无校验
   68   1          UCON0 = 0x0C2;          // 接收BDMA0允许,允许接收超时、错误中断
   69   1          UFCON0 = 0x21;          // 启用FIFO,接收FIFO触发级别为12字节
   70   1      }
   71          
   72          
   73          // 中断控制器初始化
   74          void isr_init(void)
   75          {
   76   1          INTMSK &= 0x03FDBF7F;   // Global Interrupt Enable
   77   1                                  // BDMA0 Interrupt Enable
   78   1                                  // UART0/1 Error Interrupt Enable
   79   1                                  // UART0 Rx Interrupt Enable
   80   1          INTCON  =  0x01;        // Disable FIQ, Enable IRQ, 
   81   1                                  // IRQ Vectored Interrupt Mode
   82   1      }
   83          
   84          
   85          // DMA控制器初始化
   86          void dmac_init(void)
   87          {
   88   1          // BDMA0 Initialize---UART Rx
   89   1          BDISRC0=(0<<30)+(3<<28)+(int)(URXH0);   // byte,fix,URXH0
   90   1          BDIDES0=(2<<30)+(1<<28)+(int)(rxdata);  // IO2M,inc,rxdata
   91   1          // UART,reserved,end_int,no reload,DMA disable,COUNT
   92   1          BDICNT0=(2<<30)+(1<<26)+(3<<22)+(0<<21)+(0<<20)+RXDATA_SIZE;
   93   1          BDICNT0 |= (1<<20);// DMA enable
   94   1          BDCON0 = 0x0<<2;
   95   1      }
   96          
   97          
   98          // 终止计数,则引起BDMA0中断,就会执行下面HandlerBDMA0中断服务子程序,
   99          // BDMA0重新初始化——UART接着重新接收
  100          /* BDMA0 Interrupt Handler */
  101          void HandlerBDMA0(void) __irq
  102          {
  103   1          BDISRC0=(0<<30)+(3<<28)+(int)(URXH0);   // byte,fix,URXH0
  104   1          BDIDES0=(2<<30)+(1<<28)+(int)(rxdata);  // IO2M,inc,rxdata
  105   1          // UART,reserved,end_int,no reload,DMA disable,COUNT
  106   1          BDICNT0=(2<<30)+(1<<26)+(3<<22)+(0<<21)+(0<<20)+RXDATA_SIZE;
  107   1          BDICNT0 |= (1<<20);// DMA enable
  108   1          BDCON0 = 0x0<<2;
  109   1      }
  110          
  111          // 如果UART0/1接收错误,则引起UERR01中断,就会执行下面HandlerUERR01中断服务子程序,
  112          // 读错误状态寄存器,如果是溢出错误,读接收缓冲区,以清除错误
  113          /* UART0/1 Error Interrupt Handler */
  114          void HandlerUERR01(void) __irq
  115          {
  116   1          unsigned char errdata, errflag;
  117   1          errflag = UERSTAT0;     // 读错误状态寄存器
  118   1          if(errflag&0x01)        // 溢出错误
  119   1              errdata = URXH0;    // 读接收缓冲区
  120   1          I_ISPC = (1<<14);       // 清除UERR01 Error Interrupt
  121   1          // 未进一步处理
  122   1      }
  123          
  124          
  125          // 如果UART0接收超时,则引起UERR0接收超时中断,就会执行下面HandlerURXD0中断服务子程序,
ARM COMPILER V2.51a,  Serial                                                               19/07/06  11:31:13  PAGE 3   

  126          // 读走剩余数据
  127          /* UART0 Rx Timeout Interrupt Handler (已经禁止接收中断) */
  128          void HandlerURXD0(void) __irq
  129          {
  130   1          int rxcount, k;
  131   1          unsigned char data[16]; // 最大16字节,FIFO限制
  132   1      
  133   1          I_ISPC = (1<<7);        // 清除UART0 Rx Interrupt
  134   1          rxcount = UFSTAT0&0x0f; // 接收FIFO的数据量
  135   1          for(k=0; k<rxcount; k++)
  136   1              data[k]=URXH0 ;     // 从接收FIFO读入剩余数据
  137   1      }
ARM COMPILER V2.51a,  Serial                                                               19/07/06  11:31:13  PAGE 4   

ASSEMBLY LISTING OF GENERATED OBJECT CODE



*** EXTERNALS:
 EXTERN NUMBER (__startup)



*** PUBLICS:
 PUBLIC         uart_init?T
 PUBLIC         isr_init?T
 PUBLIC         dmac_init?T
 PUBLIC         main
 PUBLIC         HandlerBDMA0?A
 PUBLIC         HandlerUERR01?A
 PUBLIC         HandlerURXD0?A
 PUBLIC         rxdata



*** DATA SEGMENT '?DT0?Serial':
 00000000          rxdata:
 00000000            DS          255



*** CODE SEGMENT '?PR?main?Serial':
   51: void main()
 00000000  B500      PUSH        {LR}
   53:     uart_init( );       // Uart初始化
 00000002  F7FF      BL          uart_init?T  ; T=0x0001  (1)
 00000004  FFFD      BL          uart_init?T  ; T=0x0001  (2)
   54:     isr_init( );        // 中断控制器初始化
 00000006  F7FF      BL          isr_init?T  ; T=0x0001  (1)
 00000008  FFFB      BL          isr_init?T  ; T=0x0001  (2)
   55:     dmac_init( );       // DMA控制器初始化
 0000000A  F7FF      BL          dmac_init?T  ; T=0x0001  (1)
 0000000C  FFF9      BL          dmac_init?T  ; T=0x0001  (2)
   59:     }
 0000000E          L_1:
 0000000E  E7FE      B           L_1  ; T=0x0000000E
   60: }
 00000010  BC08      POP         {R3}

⌨️ 快捷键说明

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