📄 serial.lst
字号:
ARM COMPILER V2.00d, Serial 23/10/05 18:16:17 PAGE 1
ARM COMPILER V2.00d, COMPILATION OF MODULE Serial
OBJECT MODULE PLACED IN .\Flash\Serial.obj
COMPILER INVOKED BY: C:\KEIL\ARM\BIN\CA.EXE Serial.c THUMB OPTIMIZE(7,SPEED) BROWSE DEBUG PRINT(.\FLASH\SERIAL.LST) TABS
-(4) OBJECT(.\Flash\Serial.obj)
stmt level source
1 /******************************************************************************/
2 /* This file is part of the kp weather station */
3 /******************************************************************************/
4 /* */
5 /* SERIAL.C: Low Level Serial Routines */
6 /* */
7 /******************************************************************************/
8
9 /* Universal Asynchronous Receiver Transmitter 1 (UART1) */
10 //#define U1RBR Read Data
11 //#define U1THR Write Data
12 //#define U1IER Interrup Enable
13 //#define U1IIR Interrupr ID register (RO)
14 //#define U1FCR FIFO control register
15 //#define U1LCR Line control register
16 //#define U1MCR Modem control reg
17 //#define U1LSR Modem status reg
18 //#define U1MSR Line status reg
19 //#define U1SCR sratch pad register
20 //#define U1DLL Divider latch register (LSB)
21 //#define U1DLM Divider latch register (MSB)
22
23 #include <LPC213x.H> /* LPC21xx definitions */
24 #include <LPC213x.H> // LPC21xx definitions
25 #include <bsp.h> // include board support package
26 #define CR 0x0D
27 #define LF 0x0A
28 #define NULL 0x00
29
30 extern void set_LED (unsigned char led_no, unsigned char led_cmd);
31 extern void wr_byte(unsigned char a, unsigned char b);
32 extern void wr_hex(unsigned char b);
33
34 // Real-time clock interrupt routine
35 void uart1 (void) __irq {
36 1 unsigned char int_reg;
37 1 unsigned char rx_char;
38 1 unsigned char temp;
39 1 int_reg = U1IIR; // must read U1IIR to clear UART interrupt flag
40 1
41 1 switch (int_reg)
42 1 {
43 2 case 0x06: // int fromOE, PE, FE, or BI
44 2 {
45 3 temp = U1LSR; // clear interrupt
46 3 break;
47 3 }
48 2 case 0x04: // Rx char available
49 2 {
50 3 U1SCR &= 0xFB; // dissable kp_printf(...)
51 3 rx_char = U1RBR; // get char and clears the interrupt
52 3 wr_hex(rx_char);
53 3 // U1THR = rx_char; // echo character
54 3 if (rx_char == CR) {
55 4 U1SCR |= 0x04; // enable kp_printf(...)
56 4 U1THR = rx_char; // echo character
57 4 }
58 3 break;
ARM COMPILER V2.00d, Serial 23/10/05 18:16:17 PAGE 2
59 3 }
60 2 case 0xC0: // Rx FIFO limit
61 2 {
62 3 break;
63 3 }
64 2 case 0x02: // THRE
65 2 {
66 3 // no special read required since U1IIR has been read
67 3 break;
68 3 }
69 2 case 0x00: // CTS or DSR
70 2 {
71 3 temp = U1MSR; // clear interrupt
72 3 break;
73 3 }
74 2 }
75 1
76 1 if ((U1SCR & 0x01) == 0x01) {
77 2 set_LED(3,1);
78 2 U1SCR &= 0xFE; }
79 1 else {
80 2 set_LED(3,0);
81 2 U1SCR |= 0x01; }
82 1 VICVectAddr = 0; // Acknowledge Interrupt
83 1 }
84
85 void init_serial (void) { /* Initialize Serial Interface */
86 1 // PINSEL0 = 0x00050000; /* Enable RxD1 and TxD1 */
87 1 U1LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
88 1 U1DLL = 97; /* use 24 for 38400 Baud Rate @ 15MHz VPB Clock (was 97 or 9600 B
-OAD) */
89 1 U1LCR = 0x03; /* DLAB = 0 */
90 1 U1IER = 0x01; // Enable reciever data available interrupt
91 1 U1SCR = 0x05; // set two flag in UART 1 scratch pad
92 1 // 0x01 LED blinker
93 1 // 0x04 enable kp_printf(...)
94 1 VICVectAddr4 = (unsigned long)uart1; // set interrupt vector in 4
95 1 VICVectCntl4 = 0x20 | 7; // use it for UART 1 clock
96 1 }
97
98
99 int putchar (int ch) { // Write character to Serial Port
100 1
101 1 if (ch == '\n') {
102 2 while (!(U1LSR & 0x20));
103 2 U1THR = CR; // output CR
104 2 }
105 1 while (!(U1LSR & 0x20));
106 1 return (U1THR = ch);
107 1 }
108
109 int getchar (void) { // Read character from Serial Port
110 1 while (!(U1LSR & 0x01));
111 1 return (U1RBR);
112 1 }
ARM COMPILER V2.00d, Serial 23/10/05 18:16:17 PAGE 3
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (set_LED?T)
EXTERN CODE16 (wr_hex?T)
EXTERN CODE32 (wr_hex?A)
EXTERN CODE32 (set_LED?A)
*** PUBLICS:
PUBLIC uart1?A
PUBLIC init_serial?T
PUBLIC putchar?T
PUBLIC getchar?T
*** CODE SEGMENT '?PR?uart1?A?Serial':
35: void uart1 (void) __irq {
00000000 E92D5F1F STMDB R13!,{R0-R4,R8-R12,LR}
00000004 ; SCOPE-START
39: int_reg = U1IIR; // must read U1IIR to clear UART interrupt flag
00000004 E5100000 LDR R0,=0xE0010008
00000008 E5D00000 LDRB R0,[R0,#0x0]
0000000C ---- Variable 'int_reg' assigned to Register 'R0' ----
41: switch (int_reg)
0000000C E1A01000 MOV R1,R0 ; int_reg
00000010 E2511000 SUBS R1,R1,#0x0000
00000014 0A00001F BEQ L_2 ; Targ=0x98
00000018 E2511002 SUBS R1,R1,#0x0002
0000001C 0A00001F BEQ L_1 ; Targ=0xA0
00000020 E2511002 SUBS R1,R1,#0x0002
00000024 0A000006 BEQ L_4 ; Targ=0x44
00000028 E25110BC SUBS R1,R1,#0x00BC
0000002C 0A00001B BEQ L_1 ; Targ=0xA0
00000030 E29110BA ADDS R1,R1,#0x00BA
00000034 1A000019 BNE L_1 ; Targ=0xA0
43: case 0x06: // int fromOE, PE, FE, or BI
00000038 L_5:
45: temp = U1LSR; // clear interrupt
00000038 E5100000 LDR R0,=0xE0010014
0000003C E5D00000 LDRB R0,[R0,#0x0]
46: break;
00000040 EA000016 B L_1 ; Targ=0xA0
48: case 0x04: // Rx char available
00000044 L_4:
50: U1SCR &= 0xFB; // dissable kp_printf(...)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -