📄 serial.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 + -