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