drv_uart.txt
来自「该模板使用于周立功公司研发的EasyARM2100系列开发板」· 文本 代码 · 共 777 行 · 第 1/3 页
TXT
777 行
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 919] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\debug_in_FLASH\drv_uart.o --depend=.\debug_in_FLASH\drv_uart.d --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips --omf_browse=.\debug_in_FLASH\drv_uart.crf src\drv_uart.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
crc16_bit PROC
;;;58 unsigned int crc16_bit(unsigned char *ptr,unsigned char len) // ptr 为数据指针,len 为数据长度
;;;59 {
000000 e1a02000 MOV r2,r0
;;;60 unsigned char i;
;;;61 crc=0; // CRC 初值
000004 e3a00000 MOV r0,#0
000008 e59fc594 LDR r12,|L1.1444|
00000c e1cc00b0 STRH r0,[r12,#0] ; crc
;;;62 ptr = &crcbuff[0]; // 指向第一个 Byte 数据
000010 e59f2590 LDR r2,|L1.1448|
;;;63 while(len--)
000014 ea000024 B |L1.172|
|L1.24|
;;;64 {
;;;65 for(i=0x80; i!=0; i>>=1)
000018 e3a03080 MOV r3,#0x80
00001c ea00001f B |L1.160|
|L1.32|
;;;66 {
;;;67 if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} // 1-1
000020 e59f057c LDR r0,|L1.1444|
000024 e1d000b0 LDRH r0,[r0,#0] ; crc
000028 e3100902 TST r0,#0x8000
00002c 0a00000b BEQ |L1.96|
000030 e59f056c LDR r0,|L1.1444|
000034 e1d000b0 LDRH r0,[r0,#0] ; crc
000038 e59fc56c LDR r12,|L1.1452|
00003c e00c0080 AND r0,r12,r0,LSL #1
000040 e59fc55c LDR r12,|L1.1444|
000044 e1cc00b0 STRH r0,[r12,#0] ; crc
000048 e28c0000 ADD r0,r12,#0
00004c e1d000b0 LDRH r0,[r0,#0] ; crc
000050 e2200a01 EOR r0,r0,#0x1000
000054 e2200021 EOR r0,r0,#0x21
000058 e1cc00b0 STRH r0,[r12,#0] ; crc
00005c ea000005 B |L1.120|
|L1.96|
;;;68 else crc<<=1; // 1-2
000060 e59f053c LDR r0,|L1.1444|
000064 e1d000b0 LDRH r0,[r0,#0] ; crc
000068 e59fc53c LDR r12,|L1.1452|
00006c e00c0080 AND r0,r12,r0,LSL #1
000070 e59fc52c LDR r12,|L1.1444|
000074 e1cc00b0 STRH r0,[r12,#0] ; crc
|L1.120|
;;;69 if((*ptr&i)!=0) crc^=0x1021; // 1-3
000078 e5d20000 LDRB r0,[r2,#0]
00007c e1100003 TST r0,r3
000080 0a000005 BEQ |L1.156|
000084 e59f0518 LDR r0,|L1.1444|
000088 e1d000b0 LDRH r0,[r0,#0] ; crc
00008c e2200a01 EOR r0,r0,#0x1000
000090 e2200021 EOR r0,r0,#0x21
000094 e59fc508 LDR r12,|L1.1444|
000098 e1cc00b0 STRH r0,[r12,#0] ; crc
|L1.156|
00009c e1a030c3 ASR r3,r3,#1 ;65
|L1.160|
0000a0 e3530000 CMP r3,#0 ;65
0000a4 1affffdd BNE |L1.32|
;;;70 }
;;;71 ptr++;
0000a8 e2822001 ADD r2,r2,#1
|L1.172|
0000ac e1b00001 MOVS r0,r1 ;63
0000b0 e241c001 SUB r12,r1,#1 ;63
0000b4 e20c10ff AND r1,r12,#0xff ;63
0000b8 1affffd6 BNE |L1.24|
;;;72 }
;;;73 return(crc);
0000bc e59f04e0 LDR r0,|L1.1444|
0000c0 e1d000b0 LDRH r0,[r0,#0] ; crc
;;;74 }
0000c4 e12fff1e BX lr
;;;75 /*********************************************************************************************************
ENDP
crc16_tab PROC
;;;89 uint16 crc16_tab(uint8 *ptr,uint8 len) // 字节查表法求 CRC
;;;90 {
0000c8 e1a03000 MOV r3,r0
;;;91 uint8 da;
;;;92 crc=0;
0000cc e3a00000 MOV r0,#0
0000d0 e59fc4cc LDR r12,|L1.1444|
0000d4 e1cc00b0 STRH r0,[r12,#0] ; crc
;;;93 /* if(sendcrcfalg==0x55)
;;;94 {
;;;95 sendcrcfalg=0;
;;;96 ptr = &crcbuff[8];
;;;97 }
;;;98 else
;;;99 {
;;;100 ptr = &crcbuff[6];
;;;101 } */
;;;102 ptr = &crcbuff[6]; //ptr = &crcbuff[0];
0000d8 e59f34d0 LDR r3,|L1.1456|
;;;103 while(len--!=0)
0000dc ea000016 B |L1.316|
|L1.224|
;;;104 {
;;;105 da=(uint8) (crc/256); // 以 8 位二进制数暂存 CRC 的高 8 位
0000e0 e59fc4bc LDR r12,|L1.1444|
0000e4 e1dc00b0 LDRH r0,[r12,#0] ; crc
0000e8 e1a0cfc0 ASR r12,r0,#31
0000ec e080cc2c ADD r12,r0,r12,LSR #24
0000f0 e1a0c80c LSL r12,r12,#16
0000f4 e1a02c2c LSR r2,r12,#24
;;;106 crc<<=8; // 左移 8 位
0000f8 e59f04a4 LDR r0,|L1.1444|
0000fc e1d000b0 LDRH r0,[r0,#0] ; crc
000100 e59fc4a4 LDR r12,|L1.1452|
000104 e00c0400 AND r0,r12,r0,LSL #8
000108 e59fc494 LDR r12,|L1.1444|
00010c e1cc00b0 STRH r0,[r12,#0] ; crc
;;;107 crc^=crc_ta[da^*ptr]; // 高字节和当前数据 XOR 再查表
000110 e5d30000 LDRB r0,[r3,#0]
000114 e0200002 EOR r0,r0,r2
000118 e59fc494 LDR r12,|L1.1460|
00011c e08c0080 ADD r0,r12,r0,LSL #1
000120 e1d000b0 LDRH r0,[r0,#0]
000124 e59fc478 LDR r12,|L1.1444|
000128 e1dcc0b0 LDRH r12,[r12,#0] ; crc
00012c e020000c EOR r0,r0,r12
000130 e59fc46c LDR r12,|L1.1444|
000134 e1cc00b0 STRH r0,[r12,#0] ; crc
;;;108 ptr++;
000138 e2833001 ADD r3,r3,#1
|L1.316|
00013c e1b00001 MOVS r0,r1 ;103
000140 e241c001 SUB r12,r1,#1 ;103
000144 e20c10ff AND r1,r12,#0xff ;103
000148 1affffe4 BNE |L1.224|
;;;109 }
;;;110 return(crc);
00014c e59f0450 LDR r0,|L1.1444|
000150 e1d000b0 LDRH r0,[r0,#0] ; crc
;;;111 }
000154 e12fff1e BX lr
;;;112 /*********************************************************************************************************
ENDP
rec_crc16 PROC
;;;126 uint16 rec_crc16(uint8 *ptr,uint8 len) // 字节查表法求 CRC
;;;127 {
000158 e1a02000 MOV r2,r0
;;;128 uint8 da;
;;;129 crc=0;
00015c e3a00000 MOV r0,#0
000160 e59fc43c LDR r12,|L1.1444|
000164 e1cc00b0 STRH r0,[r12,#0] ; crc
;;;130 ptr = &crcbuff[0];
000168 e59f2438 LDR r2,|L1.1448|
;;;131 while(len--!=0)
00016c ea000016 B |L1.460|
|L1.368|
;;;132 {
;;;133 da=(uint8) (crc/256); // 以 8 位二进制数暂存 CRC 的高 8 位
000170 e59fc42c LDR r12,|L1.1444|
000174 e1dc00b0 LDRH r0,[r12,#0] ; crc
000178 e1a0cfc0 ASR r12,r0,#31
00017c e080cc2c ADD r12,r0,r12,LSR #24
000180 e1a0c80c LSL r12,r12,#16
000184 e1a03c2c LSR r3,r12,#24
;;;134 crc<<=8; // 左移 8 位
000188 e59f0414 LDR r0,|L1.1444|
00018c e1d000b0 LDRH r0,[r0,#0] ; crc
000190 e59fc414 LDR r12,|L1.1452|
000194 e00c0400 AND r0,r12,r0,LSL #8
000198 e59fc404 LDR r12,|L1.1444|
00019c e1cc00b0 STRH r0,[r12,#0] ; crc
;;;135 crc^=crc_ta[da^*ptr]; // 高字节和当前数据 XOR 再查表
0001a0 e5d20000 LDRB r0,[r2,#0]
0001a4 e0200003 EOR r0,r0,r3
0001a8 e59fc404 LDR r12,|L1.1460|
0001ac e08c0080 ADD r0,r12,r0,LSL #1
0001b0 e1d000b0 LDRH r0,[r0,#0]
0001b4 e59fc3e8 LDR r12,|L1.1444|
0001b8 e1dcc0b0 LDRH r12,[r12,#0] ; crc
0001bc e020000c EOR r0,r0,r12
0001c0 e59fc3dc LDR r12,|L1.1444|
0001c4 e1cc00b0 STRH r0,[r12,#0] ; crc
;;;136 ptr++;
0001c8 e2822001 ADD r2,r2,#1
|L1.460|
0001cc e1b00001 MOVS r0,r1 ;131
0001d0 e241c001 SUB r12,r1,#1 ;131
0001d4 e20c10ff AND r1,r12,#0xff ;131
0001d8 1affffe4 BNE |L1.368|
;;;137 }
;;;138 return(crc);
0001dc e59f03c0 LDR r0,|L1.1444|
0001e0 e1d000b0 LDRH r0,[r0,#0] ; crc
;;;139 }
0001e4 e12fff1e BX lr
;;;140
ENDP
get_fanma PROC
;;;156 unsigned char get_fanma(unsigned char dat)
;;;157 {
0001e8 e1a01000 MOV r1,r0
;;;158 unsigned char i,s;
;;;159 unsigned char dump=0;
0001ec e3a00000 MOV r0,#0
;;;160 for(i=0;i<8;i++)
0001f0 e3a03000 MOV r3,#0
0001f4 ea00000b B |L1.552|
|L1.504|
;;;161 {
;;;162 dump=(dump<<1);
0001f8 e1a0cc80 LSL r12,r0,#25
0001fc e1a00c2c LSR r0,r12,#24
;;;163 if(dat&0x80) s=0;
000200 e3110080 TST r1,#0x80
000204 0a000001 BEQ |L1.528|
000208 e3a02000 MOV r2,#0
00020c ea000000 B |L1.532|
|L1.528|
;;;164 else s=1;
000210 e3a02001 MOV r2,#1
|L1.532|
;;;165 dat<<=1;
000214 e1a0cc81 LSL r12,r1,#25
000218 e1a01c2c LSR r1,r12,#24
;;;166 dump|=s;
00021c e1800002 ORR r0,r0,r2
000220 e283c001 ADD r12,r3,#1 ;160
000224 e20c30ff AND r3,r12,#0xff ;160
|L1.552|
000228 e3530008 CMP r3,#8 ;160
00022c bafffff1 BLT |L1.504|
;;;167 }
;;;168 return dump;
;;;169 }
000230 e12fff1e BX lr
;;;170 /*********************************************************************************************************
ENDP
command PROC
;;;184 void command(uint8 type)
;;;185 {
000234 e92d4070 PUSH {r4-r6,lr}
000238 e1a04000 MOV r4,r0
;;;186 uint8 i;
;;;187 send232[0]=0xff;
00023c e3a000ff MOV r0,#0xff
000240 e59f1370 LDR r1,|L1.1464|
000244 e5c10000 STRB r0,[r1,#0] ; send232
;;;188 send232[1]=0xff;
000248 e5c10001 STRB r0,[r1,#1] ; send232
;;;189 send232[2]=0xff;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?