📄 serial.lst
字号:
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 + -