📄 uart.lis
字号:
.module Uart.c
.area data(ram, con, rel)
0000 _put_done::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 _recv_done::
0001 .blkb 1
.area idata
0001 00 .byte 0
.area data(ram, con, rel)
0002 _newMSG::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 _change_flag::
0003 .blkb 1
.area idata
0003 00 .byte 0
.area data(ram, con, rel)
0004 _serial_recv_flag::
0004 .blkb 1
.area idata
0004 00 .byte 0
.area data(ram, con, rel)
.area vector(rom, abs)
.org 72
0048 0C940000 jmp _uart0_rx_isr
.area data(ram, con, rel)
.area text(rom, con, rel)
.even
0000 _uart0_rx_isr::
0000 0E940000 xcall push_lset
0004 ; #include<iom128v.h>
0004 ; #include"comm.h"
0004 ; //UART0接口
0004 ;
0004 ;
0004 ; unsigned char put_done=0;
0004 ; unsigned char recv_done=0;
0004 ; unsigned char recvBuff[128];
0004 ; unsigned char newMSG=0;
0004 ; unsigned char i;
0004 ; unsigned char *serial_recv_MSG;
0004 ; unsigned char change_flag=0;
0004 ; unsigned char serial_recv_flag=0;
0004 ; extern int uart_receive_CMD(Uart_CMD *command);
0004 ;
0004 ; #pragma interrupt_handler uart0_rx_isr:19
0004 ; void uart0_rx_isr(void)
0004 ; {
0004 ; recv_done=1;
0004 81E0 ldi R24,1
0006 80930100 sts _recv_done,R24
000A ; serial_get();
000A 37D0 xcall _serial_get
000C L4:
000C 0E940000 xcall pop_lset
0010 .dbline 0 ; func end
0010 1895 reti
.area vector(rom, abs)
.org 80
0050 0C940900 jmp _uart0_tx_isr
.area text(rom, con, rel)
.even
0012 _uart0_tx_isr::
0012 8A93 st -y,R24
0014 8FB7 in R24,0x3f
0016 8A93 st -y,R24
0018 ; }
0018 ;
0018 ;
0018 ; #pragma interrupt_handler uart0_tx_isr:21
0018 ; void uart0_tx_isr(void)
0018 ; {
0018 ; put_done=1;
0018 81E0 ldi R24,1
001A 80930000 sts _put_done,R24
001E L5:
001E 8991 ld R24,y+
0020 8FBF out 0x3f,R24
0022 8991 ld R24,y+
0024 .dbline 0 ; func end
0024 1895 reti
0026 ; data -> R16
.even
0026 _put::
0026 ; }
0026 ;
0026 ;
0026 ; //**********Put a single byte to the serial port.
0026 ; void put(unsigned char data)
0026 ; {
0026 L7:
0026 L8:
0026 ; while(!put_done)
0026 20900000 lds R2,_put_done
002A 2220 tst R2
002C E1F3 breq L7
002E ; ;
002E ; UDR0=data;
002E 0CB9 out 0xc,R16
0030 ; put_done=0;
0030 2224 clr R2
0032 20920000 sts _put_done,R2
0036 L6:
0036 .dbline 0 ; func end
0036 0895 ret
0038 ; data -> R16
.even
0038 _get::
0038 ; }
0038 ;
0038 ;
0038 ; //***********Receive a single byte from the serial port.
0038 ; unsigned char get()
0038 ; {
0038 L11:
0038 L12:
0038 ; unsigned char data;
0038 ; while(!recv_done)
0038 20900100 lds R2,_recv_done
003C 2220 tst R2
003E E1F3 breq L11
0040 ; ;
0040 ; data=UDR0;
0040 0CB1 in R16,0xc
0042 ; recv_done=0;
0042 2224 clr R2
0044 20920100 sts _recv_done,R2
0048 ; return data;
0048 L10:
0048 .dbline 0 ; func end
0048 0895 ret
004A ; length -> R20
004A ; data -> R12
004A ; m -> R10
004A ; len -> R10
004A ; serial_MSG -> R22,R23
.even
004A _serial_put::
004A 0E940000 xcall push_gset4
004E A22E mov R10,R18
0050 B801 movw R22,R16
0052 ; }
0052 ;
0052 ;
0052 ; //**********Put a serial Frame to the serial port.
0052 ; void serial_put(unsigned char *serial_MSG,unsigned char len)
0052 ; {
0052 ; unsigned char m;
0052 ; unsigned char length;
0052 ; unsigned char data;
0052 ; // printf("u\n");
0052 ; put(0x7E);
0052 0EE7 ldi R16,126
0054 E8DF xcall _put
0056 ; length=len;
0056 4A2D mov R20,R10
0058 ;
0058 ; for(m=0;m<length;m++)
0058 AA24 clr R10
005A 08C0 xjmp L18
005C L15:
005C EA2D mov R30,R10
005E FF27 clr R31
0060 E60F add R30,R22
0062 F71F adc R31,R23
0064 C080 ldd R12,z+0
0066 0C2D mov R16,R12
0068 DEDF xcall _put
006A L16:
006A A394 inc R10
006C L18:
006C A416 cp R10,R20
006E B0F3 brlo L15
0070 ; {
0070 ; data=*(serial_MSG+m);
0070 ; /* if(data==0x7E)
0070 ; {
0070 ; put(0x7D);
0070 ; put(0x5E);
0070 ; }
0070 ; else if(data==0x7D)
0070 ; {
0070 ; put(0x7D);
0070 ; put(0x5D);
0070 ; }
0070 ; else
0070 ; */
0070 ; {
0070 ; put(data);
0070 ; }
0070 ; }
0070 ; put(0x7E);
0070 0EE7 ldi R16,126
0072 D9DF xcall _put
0074 L14:
0074 0E940000 xcall pop_gset4
0078 .dbline 0 ; func end
0078 0895 ret
007A ; CMD_CRC -> <dead>
007A ; uart_crc_high -> <dead>
007A ; uart_crc_low -> <dead>
007A ; CMD -> R22,R23
007A ; data -> R20
.even
007A _serial_get::
007A 0E940000 xcall push_gset2
007E ; }
007E ;
007E ; //**********Receive a serial Frame from the serial port.
007E ; unsigned char *serial_get()
007E ; {
007E ; unsigned char data;
007E ; unsigned char uart_crc_low,uart_crc_high;
007E ; unsigned short int CMD_CRC;
007E ; Uart_CMD *CMD;
007E ; data=get();
007E DCDF xcall _get
0080 402F mov R20,R16
0082 ;
0082 ; if(data==0x7E&&newMSG==0) //symbol for new msg
0082 0E37 cpi R16,126
0084 B9F4 brne L20
0086 20900200 lds R2,_newMSG
008A 2220 tst R2
008C 99F4 brne L20
008E ; {
008E ; i=0;
008E 2224 clr R2
0090 20920200 sts _i,R2
0094 ; newMSG=1;
0094 81E0 ldi R24,1
0096 80930200 sts _newMSG,R24
009A ; recvBuff[i]=data;
009A 80E0 ldi R24,<_recvBuff
009C 90E0 ldi R25,>_recvBuff
009E E22D mov R30,R2
00A0 FF27 clr R31
00A2 E80F add R30,R24
00A4 F91F adc R31,R25
00A6 4083 std z+0,R20
00A8 ; //serial_recv_MSG=&recvBuff[i];
00A8 ; i++;
00A8 80910200 lds R24,_i
00AC 8F5F subi R24,255 ; addi 1
00AE 80930200 sts _i,R24
00B2 ; }
00B2 29C0 xjmp L21
00B4 L20:
00B4 ; else if(data==0x7E&&newMSG==1)
00B4 4E37 cpi R20,126
00B6 D1F4 brne L22
00B8 80910200 lds R24,_newMSG
00BC 8130 cpi R24,1
00BE B1F4 brne L22
00C0 ; {
00C0 ; newMSG=0;
00C0 2224 clr R2
00C2 20920200 sts _newMSG,R2
00C6 ; recvBuff[i]=data;
00C6 80E0 ldi R24,<_recvBuff
00C8 90E0 ldi R25,>_recvBuff
00CA E0910200 lds R30,_i
00CE FF27 clr R31
00D0 E80F add R30,R24
00D2 F91F adc R31,R25
00D4 4083 std z+0,R20
00D6 ; i=0;
00D6 20920200 sts _i,R2
00DA ; serial_recv_flag=1;
00DA 81E0 ldi R24,1
00DC 80930400 sts _serial_recv_flag,R24
00E0 ; //CMD = (Uart_CMD *)serial_recv_MSG;
00E0 ; CMD = (Uart_CMD *)&recvBuff[0];
00E0 60E0 ldi R22,<_recvBuff
00E2 70E0 ldi R23,>_recvBuff
00E4 ; //CMD_CRC = xcrc_calc(uart_rx_buffer, 1, 2);
00E4 ; //if(CMD_CRC == CMD->CRC)
00E4 ; //{
00E4 ; uart_receive_CMD(CMD); //一条消息发送完毕,在处理完本条消息后需要被置零
00E4 8B01 movw R16,R22
00E6 0E940000 xcall _uart_receive_CMD
00EA ; //}
00EA ; }
00EA 0DC0 xjmp L23
00EC L22:
00EC ; else
00EC ; {
00EC ;
00EC ; recvBuff[i]=data;
00EC 80E0 ldi R24,<_recvBuff
00EE 90E0 ldi R25,>_recvBuff
00F0 E0910200 lds R30,_i
00F4 FF27 clr R31
00F6 E80F add R30,R24
00F8 F91F adc R31,R25
00FA 4083 std z+0,R20
00FC ; i++;
00FC 80910200 lds R24,_i
0100 8F5F subi R24,255 ; addi 1
0102 80930200 sts _i,R24
0106 ;
0106 ; }
0106 L23:
0106 L21:
0106 ;
0106 ; /*else
0106 ; {
0106 ; if(data==0x7D)
0106 ; {
0106 ; change_flag=1;
0106 ; }
0106 ; else if(change_flag==1)
0106 ; {
0106 ; switch(data)
0106 ; {
0106 ; case 0x5E: recvBuff[i]=0x7E;
0106 ; change_flag=0;
0106 ; i++;
0106 ; break;
0106 ; case 0x5D: recvBuff[i]=0x7D;
0106 ; change_flag=0;
0106 ; i++;
0106 ; break;
0106 ; default: break;
0106 ; }
0106 ; }
0106 ; else
0106 ; {
0106 ; recvBuff[i]=data;
0106 ; i++;
0106 ; }
0106 ;
0106 ; }*/
0106 ; return serial_recv_MSG;
0106 00910000 lds R16,_serial_recv_MSG
010A 10910100 lds R17,_serial_recv_MSG+1
010E L19:
010E 0E940000 xcall pop_gset2
0112 .dbline 0 ; func end
0112 0895 ret
.area bss(ram, con, rel)
0000 _serial_recv_MSG::
0000 .blkb 2
0002 _i::
0002 .blkb 1
0003 _recvBuff::
0003 .blkb 128
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -