?? uart.lst
字號:
ARM COMPILER V2.50a, UART 16/05/06 14:55:45 PAGE 1
ARM COMPILER V2.50a, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe UART.c THUMB WARNINGLEVEL(3) BROWSE DEBUG TABS(4)
stmt level source
1 /**********************************************************************
2 UART.c file
3 ADuC7027的串口函數
4 作者:Computer-lov
5 建立日期:2006-3-22
6 修改日期:2006-5-11
7 版本:V1.0
8 版權所有,盜版必究。
9 Copyright(C) Computer-lov 2006-2016
10 All rights reserved
11 **********************************************************************/
12
13 #include <ADuC7027.H>
14 #include "My_type.h"
15 #include "UART.H"
16
17 //////////////////////////////////////////////////////////////////////
18 void UART_init(void)
19 {
20 1 GP1CON=0x00000011; //P1.0 P1.1設置為串口功能
21 1
22 1 COMIEN0=0x00; //禁止所有串口中斷
23 1
24 1 #define BitRate 57600
25 1
26 1 #if (BitRate==19200) || (BitRate==9600)
COMCON0=0x83; //1 stop bit,8 data bits 最高位置1,尋址COMDIV1寄存器
COMDIV1=0x00;
COMDIV2=0x0000;
#if BitRate==19200
COMDIV0=0x44; //19200 bps
#else
COMDIV0=0x88; //9600bps
#endif
COMCON0=0x03; //最高位置0,尋址COMTX寄存器。
//因為COMTX寄存器跟COMDIV1寄存器共用一個地址,由COMCON0的最高位選擇
#endif
38 1
39 1 #if BitRate==57600
40 1
41 1 COMCON0=0x83; //1 stop bit,8 data bits 最高位置1,尋址COMDIV1寄存器
42 1 COMDIV1=0x00;
43 1 COMDIV2=0x426+(2<<11)+0x8000; //M=2,N=0x642
44 1 COMDIV0=0x09;
45 1 COMCON0=0x03; //最高位置0,尋址COMTX寄存器。
46 1 //因為COMTX寄存器跟COMDIV1寄存器共用一個地址,由COMCON0的最高位選擇
47 1 #endif
48 1 }
49 //////////////////////////////////////////////////////////////////////
50
51 //////////////////////////////////////////////////////////////////////
52 void send_a_byte(uint8 a_byte)
53 {
54 1 while(!(COMSTA0 & 0x40)); //等待發送完畢
55 1 COMTX=a_byte;
56 1 }
57 //////////////////////////////////////////////////////////////////////
58
59 ////////////////////////////// 發送一個字符串 ///////////////////////////////////////////
ARM COMPILER V2.50a, UART 16/05/06 14:55:45 PAGE 2
60 //////////////////入口參數: s-要發送的字符串的指針(字符串長度不得大于255)/////////////
61 ///////////////////////////////////// newline-是否需要換行 0-不換行 非0-換行////////
62 void prints(uint8 * s,uint32 newline)
63 {
64 1 unsigned char i;
65 1 i=0;
66 1 while(s[i]!=0) //判斷字符串是否結束
67 1 {
68 2 while(!(COMSTA0 & 0x40)); //等待發送完畢
69 2 COMTX=s[i];
70 2 i++; //移到下字節
71 2 }
72 1 if(newline) //如果需要換行
73 1 {
74 2 send_a_byte(13);
75 2 send_a_byte(10); //發送回車換行
76 2 }
77 1 }
78 ////////////////////////////////////////////////////////////////////////////////////////////
79
80 /////////////////////////////////////////////////////////////////////////////////
81 void cls(void)
82 {
83 1 send_a_byte(0x0C); //超級終端清屏指令
84 1 send_a_byte(0x0C);
85 1 }
86 //////////////////////////////////////////////////////////////////////////////////
87
88
89 //轉換成十六進制時用的表
90 const uint8 HEX_TABLE[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
91
92 //////////////////////////將一個16位的整數按十六進制發到串口/////////////////////////////////
93 void print_uint16(uint16 number)
94 {
95 1 send_a_byte('0'); //發送0x
96 1 send_a_byte('x');
97 1 send_a_byte(HEX_TABLE[(number>>12) & 0x0F]); //依次發送各部分
98 1 send_a_byte(HEX_TABLE[(number>>8) & 0x0F]);
99 1 send_a_byte(HEX_TABLE[(number>>4) & 0x0F]);
100 1 send_a_byte(HEX_TABLE[(number) & 0x0F]);
101 1 send_a_byte(' ');
102 1 }
103 //////////////////////////////////////////////////////////////////////////////////
104
105 /////////////////////////將一個32位的整數按十進制發送到串口/////////////////////////////
106 void print_uint32(uint32 number)
107 {
108 1 uint8 buf[12];
109 1 uint32 i;
110 1
111 1 for(i=0;i<10;i++) //轉換成字符串
112 1 {
113 2 buf[9-i]=(number%10)+'0';
114 2 number/=10;
115 2 }
116 1 for(i=0;i<9;i++) //將前面的0轉換成空格
117 1 {
118 2 if(buf[i]=='0')
119 2 {
120 3 buf[i]=' ';
121 3 }
122 2 else
123 2 {
124 3 break;
125 3 }
ARM COMPILER V2.50a, UART 16/05/06 14:55:45 PAGE 3
126 2 }
127 1 buf[10]=' ';
128 1 buf[11]=0; //字符串結束符
129 1 prints(buf,0);
130 1 }
131 //////////////////////////////////////////////////////////////////////////////////////////
132
ARM COMPILER V2.50a, UART 16/05/06 14:55:45 PAGE 4
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (?C?UDIV?T)
*** PUBLICS:
PUBLIC UART_init?T
PUBLIC send_a_byte?T
PUBLIC prints?T
PUBLIC cls?T
PUBLIC print_uint16?T
PUBLIC print_uint32?T
PUBLIC HEX_TABLE
*** DATA SEGMENT '?CON?UART':
00000000 HEX_TABLE:
00000000 BEGIN_INIT
00000000 30 DB 0x30
00000001 31 DB 0x31
00000002 32 DB 0x32
00000003 33 DB 0x33
00000004 34 DB 0x34
00000005 35 DB 0x35
00000006 36 DB 0x36
00000007 37 DB 0x37
00000008 38 DB 0x38
00000009 39 DB 0x39
0000000A 41 DB 0x41
0000000B 42 DB 0x42
0000000C 43 DB 0x43
0000000D 44 DB 0x44
0000000E 45 DB 0x45
0000000F 46 DB 0x46
00000010 END_INIT
*** CODE SEGMENT '?PR?UART_init?T?UART':
20: GP1CON=0x00000011; //P1.0 P1.1設置為串口功能
00000000 2111 MOV R1,#0x11
00000002 4800 LDR R0,=0xFFFFF404
00000004 6001 STR R1,[R0,#0x0]
22: COMIEN0=0x00; //禁止所有串口中斷
00000006 2100 MOV R1,#0x0
00000008 4800 LDR R0,=0xFFFF0704
0000000A 6001 STR R1,[R0,#0x0]
41: COMCON0=0x83; //1 stop bit,8 data bits 最高位置1,尋址COMDIV1寄存器
0000000C 2283 MOV R2,#0x83
0000000E 4800 LDR R0,=0xFFFF070C
00000010 6002 STR R2,[R0,#0x0]
42: COMDIV1=0x00;
00000012 4800 LDR R0,=0xFFFF0704
00000014 6001 STR R1,[R0,#0x0]
43: COMDIV2=0x426+(2<<11)+0x8000; //M=2,N=0x642
00000016 4800 LDR R1,=0x9426
00000018 4800 LDR R0,=0xFFFF072C
0000001A 6001 STR R1,[R0,#0x0]
44: COMDIV0=0x09;
0000001C 2109 MOV R1,#0x9
0000001E 4800 LDR R0,=0xFFFF0700
00000020 6001 STR R1,[R0,#0x0]
45: COMCON0=0x03; //最高位置0,尋址COMTX寄存器。
00000022 2103 MOV R1,#0x3
00000024 4800 LDR R0,=0xFFFF070C
00000026 6001 STR R1,[R0,#0x0]
48: }
00000028 4770 BX R14
ARM COMPILER V2.50a, UART 16/05/06 14:55:45 PAGE 5
0000002A ENDP ; 'UART_init?T'
*** CODE SEGMENT '?PR?send_a_byte?T?UART':
52: void send_a_byte(uint8 a_byte)
00000000 1C01 MOV R1,R0 ; a_byte
00000002 ---- Variable 'a_byte' assigned to Register 'R1' ----
54: while(!(COMSTA0 & 0x40)); //等待發送完畢
00000002 L_1:
00000002 4800 LDR R0,=0xFFFF0714
00000004 6800 LDR R0,[R0,#0x0]
00000006 2240 MOV R2,#0x40
00000008 4210 TST R0,R2
0000000A D0FA BEQ L_1 ; T=0x00000002
55: COMTX=a_byte;
0000000C 1C08 MOV R0,R1 ; a_byte
0000000E 0601 LSL R1,R0,#0x18 ; a_byte
00000010 0E09 LSR R1,R1,#0x18
00000012 4800 LDR R0,=0xFFFF0700
00000014 6001 STR R1,[R0,#0x0]
56: }
00000016 4770 BX R14
00000018 ENDP ; 'send_a_byte?T'
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -