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

📄 serial.lst

📁 arm7平台下串口通信程序 前后台模式通信 使用上s3c44b0
💻 LST
字号:
ARM COMPILER V2.51a,  Serial                                                               19/07/06  12:04:20  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:串口中断方式通信--CPU工作频率为60MHz(开发板外接8MHz),波特率
    4          *              为19200bps,字符长度8位,奇偶校验位无,停止位1位。允许发送/接
    5          *              收中断,允许接收超时、错误中断,启用FIFO,发送FIFO触发级别为
    6          *              空,接收FIFO触发级别为12字节。不使用Modem自动流控。采用中断方
    7          *              式通信。
    8          * Date:2006-07-19
    9          *************************************************************************/
   10          
   11          // 中断控制器寄存器定义
   12          #define INTCON      (*(volatile unsigned *)0x01E00000)
   13          #define INTPND      (*(volatile unsigned *)0x01E00004)
   14          #define INTMOD      (*(volatile unsigned *)0x01E00008)
   15          #define INTMSK      (*(volatile unsigned *)0x01E0000C)
   16          #define I_ISPC      (*(volatile unsigned *)0x01E00024)
   17          
   18          // UART寄存器定义
   19          #define ULCON0      (*(volatile unsigned *)0x01D00000)
   20          #define UCON0       (*(volatile unsigned *)0x01D00004)
   21          #define UFCON0      (*(volatile unsigned *)0x01D00008)
   22          #define UMCON0      (*(volatile unsigned *)0x01D0000C)
   23          #define UTRSTAT0    (*(volatile unsigned *)0x01D00010)
   24          #define UERSTAT0    (*(volatile unsigned *)0x01D00014)
   25          #define UFSTAT0     (*(volatile unsigned *)0x01D00018)
   26          #define UMSTAT0     (*(volatile unsigned *)0x01D0001C)
   27          #define UTXH0       (*(volatile unsigned *)0x01D00020)
   28          #define URXH0       (*(volatile unsigned *)0x01D00024) 
   29          #define UBRDIV0     (*(volatile unsigned *)0x01D00028)
   30          
   31          #define MCLK 60000000   /* Master Clock */
   32          #define BR      19200   /* Baud Rate */
   33          #define BRD ((int)(MCLK/16.0/BR+0.5)-1) /* Baud Rate Divisor */
   34          
   35          void uart_init(void);   // Uart初始化
   36          void isr_init(void);    // 中断控制器初始化
   37          
   38          char rxdata[17] = "Comm Testting! \n";  // 不能超过16个+1,FIFO限制
   39          
   40          void main()
   41          {
   42   1          uart_init( );       // Uart初始化
   43   1          isr_init( );        // 中断控制器初始化
   44   1          
   45   1          while(1)            // 死循环,等待中断
   46   1          {
   47   2          }
   48   1      }
   49          
   50          
   51          // 串口初始化
   52          void uart_init(void)
   53          {
   54   1          UBRDIV0 = BRD;          // 19200bps
   55   1          ULCON0 = 0x03;          // 帧长度8位,停止位1位,无校验
   56   1          UCON0 = 0x0C5;          // 接收中断/查询允许,发送中断/允许
   57   1                                  // 允许接收错误中断,允许接收超时中断
   58   1          UFCON0 = 0x21;          // 启用FIFO,发送FIFO触发级别为空,
   59   1                                  // 接收FIFO触发级别为12字节
ARM COMPILER V2.51a,  Serial                                                               19/07/06  12:04:20  PAGE 2   

   60   1      }
   61          
   62          
   63          // 中断控制器初始化
   64          void isr_init(void)
   65          {
   66   1          INTMSK &= 0x03FFBF77;   // Global Interrupt Enable
   67   1                                  // UART0/1 Error Interrupt Enable
   68   1                                  // UART0 Rx Interrupt Enable
   69   1                                  // UART0 Tx Interrupt Enable
   70   1          INTCON  =  0x01;        // Disable FIQ, Enable IRQ, 
   71   1                                  // IRQ Vectored Interrupt Mode
   72   1      }
   73          
   74          
   75          // 如果UART0/1接收错误,则引起错误中断,就会执行下面
   76          // HandlerUERR01中断服务子程序,
   77          // 读错误状态寄存器,如果是溢出错误,读接收缓冲区,以清除错误
   78          /* UART0/1 Error Interrupt Handler */
   79          void HandlerUERR01(void) __irq
   80          {
   81   1          unsigned char errdata, errflag;
   82   1          errflag = UERSTAT0;     // 读错误状态寄存器
   83   1          if(errflag&0x01)        // 溢出错误
   84   1              errdata = URXH0;    // 读接收缓冲区
   85   1          I_ISPC = (1<<14);       // 清除UERR01 Error Interrupt
   86   1          // 未进一步处理
   87   1      }
   88          
   89          
   90          // 如果UART0接收(超时)中断,则引起接收中断,就会执行下面
   91          // HandlerURXD0中断服务子程序,从UART0接收缓冲区读走数据
   92          /* UART0 Rx Interrupt Handler (包括超时中断) */
   93          void HandlerURXD0(void) __irq
   94          {
   95   1          int rxcount, k;
   96   1      
   97   1          I_ISPC = (1<<7);        // 清除UART0 Rx Interrupt
   98   1          rxcount = UFSTAT0&0x0f; // 接收FIFO的数据量
   99   1          for(k=0; k<rxcount; k++)
  100   1              rxdata[k]=URXH0 ;   // 从接收FIFO读入数据
  101   1          
  102   1          rxdata[k]='\0' ;        // 添加字符串结束符
  103   1      }
  104          
  105          
  106          // 如果UART0发送中断,则引起发送中断,就会执行下面
  107          // HandlerUTXD0中断服务子程序,填充UART0发送缓冲区
  108          /* UART0 Tx Interrupt Handler */
  109          void HandlerUTXD0(void) __irq
  110          {
  111   1          char *pTx = rxdata;
  112   1      
  113   1          I_ISPC = (1<<3);        // 清除UART0 Tx Interrupt
  114   1          while(*pTx!='\0')
  115   1          {
  116   2              UTXH0 = *pTx;       // 写新的字符进入发送FIFO
  117   2              pTx++;
  118   2          }
  119   1      }
ARM COMPILER V2.51a,  Serial                                                               19/07/06  12:04:20  PAGE 3   

ASSEMBLY LISTING OF GENERATED OBJECT CODE



*** EXTERNALS:
 EXTERN NUMBER (__startup)



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



*** DATA SEGMENT '?DT0?Serial':
 00000000          rxdata:
 00000000           BEGIN_INIT
 00000000            DB          'Comm Testting! ',0x0A,0x00
 00000011           END_INIT



*** CODE SEGMENT '?PR?main?Serial':
   40: void main()
 00000000  B500      PUSH        {LR}
   42:     uart_init( );       // Uart初始化
 00000002  F7FF      BL          uart_init?T  ; T=0x0001  (1)
 00000004  FFFD      BL          uart_init?T  ; T=0x0001  (2)
   43:     isr_init( );        // 中断控制器初始化
 00000006  F7FF      BL          isr_init?T  ; T=0x0001  (1)
 00000008  FFFB      BL          isr_init?T  ; T=0x0001  (2)
   47:     }
 0000000A          L_1:
 0000000A  E7FE      B           L_1  ; T=0x0000000A
   48: }
 0000000C  BC08      POP         {R3}
 0000000E  4718      BX          R3
 00000010          ENDP ; 'main'


*** CODE SEGMENT '?PR?uart_init?T?Serial':
   54:     UBRDIV0 = BRD;          // 19200bps
 00000000  21C2      MOV         R1,#0xC2
 00000002  4800      LDR         R0,=0x1D00028
 00000004  6001      STR         R1,[R0,#0x0]
   55:     ULCON0 = 0x03;          // 帧长度8位,停止位1位,无校验
 00000006  2103      MOV         R1,#0x3
 00000008  4800      LDR         R0,=0x1D00000
 0000000A  6001      STR         R1,[R0,#0x0]
   56:     UCON0 = 0x0C5;          // 接收中断/查询允许,发送中断/允许
 0000000C  21C5      MOV         R1,#0xC5
 0000000E  4800      LDR         R0,=0x1D00004
 00000010  6001      STR         R1,[R0,#0x0]
   58:     UFCON0 = 0x21;          // 启用FIFO,发送FIFO触发级别为空,
 00000012  2121      MOV         R1,#0x21
 00000014  4800      LDR         R0,=0x1D00008
 00000016  6001      STR         R1,[R0,#0x0]
   60: }
 00000018  4770      BX          R14
 0000001A          ENDP ; 'uart_init?T'


*** CODE SEGMENT '?PR?isr_init?T?Serial':
   66:     INTMSK &= 0x03FFBF77;   // Global Interrupt Enable
 00000000  4800      LDR         R2,=0x3FFBF77
 00000002  4800      LDR         R0,=0x1E0000C
 00000004  6801      LDR         R1,[R0,#0x0]
 00000006  4011      AND         R1,R2
 00000008  6001      STR         R1,[R0,#0x0]
   70:     INTCON  =  0x01;        // Disable FIQ, Enable IRQ, 
 0000000A  2101      MOV         R1,#0x1
ARM COMPILER V2.51a,  Serial                                                               19/07/06  12:04:20  PAGE 4   

 0000000C  4800      LDR         R0,=0x1E00000
 0000000E  6001      STR         R1,[R0,#0x0]
   72: }
 00000010  4770      BX          R14
 00000012          ENDP ; 'isr_init?T'


*** CODE SEGMENT '?PR?HandlerUERR01?A?Serial':
   79: void HandlerUERR01(void) __irq
 00000000  E92D0003  STMDB       R13!,{R0-R1}
   80: {
 00000004            ; SCOPE-START
   82:     errflag = UERSTAT0;     // 读错误状态寄存器
 00000004  E5100000  LDR         R0,=0x1D00014
 00000008  E5901000  LDR         R1,[R0,#0x0]
 0000000C  E1A01C01  MOV         R1,R1,LSL #24
 00000010  E1A01C21  MOV         R1,R1,LSR #24
 00000014  ---- Variable 'errflag' assigned to Register 'R1' ----
   83:     if(errflag&0x01)        // 溢出错误
 00000014  E1A00001  MOV         R0,R1 ; errflag
 00000018  E1A00C00  MOV         R0,R0,LSL #24 ; errflag
 0000001C  E1A00C20  MOV         R0,R0,LSR #24
 00000020  E3100001  TST         R0,#0x0001
 00000024  0A000001  BEQ         L_5  ; Targ=0x30
   84:         errdata = URXH0;    // 读接收缓冲区
 00000028  E5100000  LDR         R0,=0x1D00024
 0000002C  E5900000  LDR         R0,[R0,#0x0]
 00000030          L_5:
   85:     I_ISPC = (1<<14);       // 清除UERR01 Error Interrupt
 00000030  E3A01901  MOV         R1,#0x4000
 00000034  E5100000  LDR         R0,=0x1E00024
 00000038  E5801000  STR         R1,[R0,#0x0]
 0000003C            ; SCOPE-END
   87: }
 0000003C  E8BD0003  LDMIA       R13!,{R0-R1}
 00000040  E25EF004  SUBS        R15,R14,#0x0004
 00000044          ENDP ; 'HandlerUERR01?A'


*** CODE SEGMENT '?PR?HandlerURXD0?A?Serial':
   93: void HandlerURXD0(void) __irq
 00000000  E92D001F  STMDB       R13!,{R0-R4}
   94: {
 00000004            ; SCOPE-START
   97:     I_ISPC = (1<<7);        // 清除UART0 Rx Interrupt
 00000004  E3A01080  MOV         R1,#0x80
 00000008  E5100000  LDR         R0,=0x1E00024
 0000000C  E5801000  STR         R1,[R0,#0x0]
   98:     rxcount = UFSTAT0&0x0f; // 接收FIFO的数据量
 00000010  E5100000  LDR         R0,=0x1D00018
 00000014  E5900000  LDR         R0,[R0,#0x0]
 00000018  E200000F  AND         R0,R0,#0x000F
 0000001C  ---- Variable 'rxcount' assigned to Register 'R0' ----
   99:     for(k=0; k<rxcount; k++)
 0000001C  E3A03000  MOV         R3,#0x0
 00000020  ---- Variable 'k' assigned to Register 'R3' ----
 00000020  EA000007  B           L_8  ; Targ=0x44
 00000024          L_9:
  100:         rxdata[k]=URXH0 ;   // 从接收FIFO读入数据
 00000024  E5101000  LDR         R1,=0x1D00024
 00000028  E5911000  LDR         R1,[R1,#0x0]
 0000002C  E1A01C01  MOV         R1,R1,LSL #24
 00000030  E1A01C21  MOV         R1,R1,LSR #24
 00000034  E1A04003  MOV         R4,R3 ; k
 00000038  E5102000  LDR         R2,=rxdata ; rxdata
 0000003C  E7C21004  STRB        R1,[R2,+R4]
 00000040  E2833001  ADD         R3,R3,#0x0001 ; k
 00000044          L_8:
 00000044  E1A02000  MOV         R2,R0 ; rxcount
 00000048  E1A01003  MOV         R1,R3 ; k
ARM COMPILER V2.51a,  Serial                                                               19/07/06  12:04:20  PAGE 5   

 0000004C  E1510002  CMP         R1,R2 ; k
 00000050  BAFFFFF3  BLT         L_9  ; Targ=0x24
  102:     rxdata[k]='\0' ;        // 添加字符串结束符
 00000054  E3A00000  MOV         R0,#0x0
 00000058  E1A02003  MOV         R2,R3 ; k
 0000005C  E5101000  LDR         R1,=rxdata ; rxdata
 00000060  E7C10002  STRB        R0,[R1,+R2]
 00000064            ; SCOPE-END
  103: }
 00000064  E8BD001F  LDMIA       R13!,{R0-R4}
 00000068  E25EF004  SUBS        R15,R14,#0x0004
 0000006C          ENDP ; 'HandlerURXD0?A'


*** CODE SEGMENT '?PR?HandlerUTXD0?A?Serial':
  109: void HandlerUTXD0(void) __irq
 00000000  E92D0007  STMDB       R13!,{R0-R2}
  110: {
 00000004            ; SCOPE-START
  111:     char *pTx = rxdata;
 00000004  E5100000  LDR         R0,=rxdata ; rxdata
 00000008  ---- Variable 'pTx' assigned to Register 'R0' ----
  113:     I_ISPC = (1<<3);        // 清除UART0 Tx Interrupt
 00000008  E3A02008  MOV         R2,#0x8
 0000000C  E5101000  LDR         R1,=0x1E00024
 00000010  E5812000  STR         R2,[R1,#0x0]
  114:     while(*pTx!='\0')
 00000014  EA000004  B           L_11  ; Targ=0x2C
 00000018          L_13:
  116:         UTXH0 = *pTx;       // 写新的字符进入发送FIFO
 00000018  E1A01000  MOV         R1,R0 ; pTx
 0000001C  E5D12000  LDRB        R2,[R1,#0x0] ; pTx
 00000020  E5101000  LDR         R1,=0x1D00020
 00000024  E5812000  STR         R2,[R1,#0x0]
  117:         pTx++;
 00000028  E2800001  ADD         R0,R0,#0x0001 ; pTx
  118:     }
 0000002C          L_11:
 0000002C  E1A01000  MOV         R1,R0 ; pTx
 00000030  E5D11000  LDRB        R1,[R1,#0x0] ; pTx
 00000034  E3510000  CMP         R1,#0x0000
 00000038  1AFFFFF6  BNE         L_13  ; Targ=0x18
 0000003C            ; SCOPE-END
  119: }
 0000003C  E8BD0007  LDMIA       R13!,{R0-R2}
 00000040  E25EF004  SUBS        R15,R14,#0x0004
 00000044          ENDP ; 'HandlerUTXD0?A'



Module Information          Static
----------------------------------
  code size            =    ------
  data size            =        17
  const size           =    ------
End of Module Information.


ARM COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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