📄 serial.s
字号:
.module serial.c
.area text(rom, con, rel)
.dbfile E:\Shuaihu\AVR\8880\serial.c
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 17
; //ICC-AVR application builder : 2007-10-18 21:13:05
; // Target : M8
; // Crystal: 8.0000Mhz
;
; #include <iom8v.h>
; #include <macros.h>
; #include <string.h>
; #include "serial.h"
; #include "main.h"
; //UART0 initialize
; // desired baud rate: 110
; // actual: invalid baud rate
; SERIAL_PORT_STATUS com_status;
; char recv_buf[RECV_BUFLEN];
; char send_buf[SEND_BUFLEN];
; void uart0_init(void)
; {
.dbline 18
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 19
; UCSRA = 0x00;
out 0xb,R2
.dbline 20
; UCSRC = BIT(URSEL) | 0x06;
ldi R24,134
out 0x20,R24
.dbline 21
; UBRRL = 0x03; //set baud rate lo
ldi R24,3
out 0x9,R24
.dbline 22
; UBRRH = 0x00; //set baud rate hi
out 0x20,R2
.dbline 23
; UCSRB = 0x98;
ldi R24,152
out 0xa,R24
.dbline 24
; com_status.read_start_ptr=recv_buf;
ldi R24,<_recv_buf
ldi R25,>_recv_buf
sts _com_status+1,R25
sts _com_status,R24
.dbline 25
; com_status.read_end_ptr=recv_buf;
sts _com_status+2+1,R25
sts _com_status+2,R24
.dbline 26
; com_status.recv_cur_ptr=recv_buf;
sts _com_status+4+1,R25
sts _com_status+4,R24
.dbline 27
; com_status.send_cur_ptr=send_buf;
ldi R24,<_send_buf
ldi R25,>_send_buf
sts _com_status+6+1,R25
sts _com_status+6,R24
.dbline 28
; com_status.sending=0;
sts _com_status+8,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 22
rjmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile E:\Shuaihu\AVR\8880\serial.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
; c -> R16
.even
_uart0_rx_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 33
; }
;
; #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
; void uart0_rx_isr(void)
; {
.dbline 35
; char c;
; c=UDR;
in R16,0xc
.dbline 36
; if (sysoption.echo){
lds R2,_sysoption
tst R2
breq L7
X0:
.dbline 36
.dbline 37
; if (c=='\r')
cpi R16,13
brne L9
X1:
.dbline 38
; UDR='\n';
ldi R24,10
out 0xc,R24
rjmp L10
L9:
.dbline 40
; else
; UDR=c;
out 0xc,R16
L10:
.dbline 41
; }
L7:
.dbline 42
; if (c==0) return;
tst R16
brne L11
X2:
.dbline 42
rjmp L6
L11:
.dbline 43
; *com_status.recv_cur_ptr++=c;
lds R30,_com_status+4
lds R31,_com_status+4+1
st Z+,R16
sts _com_status+4+1,R31
sts _com_status+4,R30
.dbline 44
; if (com_status.recv_cur_ptr==recv_buf+RECV_BUFLEN)
ldi R24,<_recv_buf+50
ldi R25,>_recv_buf+50
cp R30,R24
cpc R31,R25
brne L14
X3:
.dbline 45
; com_status.recv_cur_ptr=recv_buf;
ldi R24,<_recv_buf
ldi R25,>_recv_buf
sts _com_status+4+1,R25
sts _com_status+4,R24
L14:
.dbline 46
; if (c==LINE_END_CHAR) {
cpi R16,13
brne L19
X4:
.dbline 46
.dbline 47
; com_status.read_end_ptr=com_status.recv_cur_ptr;
lds R2,_com_status+4
lds R3,_com_status+4+1
sts _com_status+2+1,R3
sts _com_status+2,R2
.dbline 48
; }
L19:
.dbline -2
L6:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R16,y+
ld R3,y+
ld R2,y+
reti
.dbsym r c 16 c
.dbend
.area vector(rom, abs)
.org 24
rjmp _uart0_udre_isr
.area text(rom, con, rel)
.dbfile E:\Shuaihu\AVR\8880\serial.c
.dbfunc e uart0_udre_isr _uart0_udre_isr fV
.even
_uart0_udre_isr::
st -y,R2
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 52
; }
; #pragma interrupt_handler uart0_udre_isr:iv_USART0_UDRE
; void uart0_udre_isr(void)
; {
.dbline 53
; UDR=*com_status.send_cur_ptr++;
lds R30,_com_status+6
lds R31,_com_status+6+1
ld R2,Z+
sts _com_status+6+1,R31
sts _com_status+6,R30
out 0xc,R2
.dbline 54
; if (*com_status.send_cur_ptr==0 || com_status.send_cur_ptr==send_buf+SEND_BUFLEN){
ldd R2,z+0
tst R2
breq L30
X5:
ldi R24,<_send_buf+50
ldi R25,>_send_buf+50
cp R30,R24
cpc R31,R25
brne L25
X6:
L30:
.dbline 54
.dbline 55
; UCSRB&=~0x20;
cbi 0xa,5
.dbline 56
; com_status.sending=0;
clr R2
sts _com_status+8,R2
.dbline 57
; }
L25:
.dbline -2
L23:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R2,y+
reti
.dbend
.dbfunc e serial_send _serial_send fV
; buf -> R10,R11
.even
_serial_send::
st -y,R10
st -y,R11
movw R10,R16
.dbline -1
.dbline 60
; }
; void serial_send(char *buf)
; {
.dbline 61
; if (*buf==0) return;
movw R30,R10
ldd R2,z+0
tst R2
brne L36
X7:
.dbline 61
rjmp L32
L35:
.dbline 62
; while (com_status.sending);
L36:
.dbline 62
lds R2,_com_status+8
tst R2
brne L35
X8:
.dbline 63
; strcpy(send_buf,buf);
movw R18,R10
ldi R16,<_send_buf
ldi R17,>_send_buf
rcall _strcpy
.dbline 64
; com_status.send_cur_ptr=send_buf;
ldi R24,<_send_buf
ldi R25,>_send_buf
sts _com_status+6+1,R25
sts _com_status+6,R24
.dbline 65
; com_status.sending=-1;
ldi R24,255
sts _com_status+8,R24
.dbline 66
; UCSRB|=0x20;
sbi 0xa,5
.dbline -2
L32:
.dbline 0 ; func end
ld R11,y+
ld R10,y+
ret
.dbsym r buf 10 pc
.dbend
.dbfunc e serial_recv _serial_recv fi
; len -> R20,R21
; buflen -> R18,R19
; buf -> R16,R17
.even
_serial_recv::
st -y,R20
st -y,R21
.dbline -1
.dbline 69
; }
; unsigned int serial_recv(char *buf,unsigned int buflen)
; {
.dbline 70
; unsigned int len=0;
clr R20
clr R21
.dbline 71
; if (com_status.read_start_ptr==com_status.read_end_ptr) return 0;
lds R2,_com_status+2
lds R3,_com_status+2+1
lds R4,_com_status
lds R5,_com_status+1
cp R4,R2
cpc R5,R3
brne L46
X9:
.dbline 71
clr R16
clr R17
rjmp L41
L45:
.dbline 72
; while(com_status.read_start_ptr!=com_status.read_end_ptr && len<buflen-1){
.dbline 73
; *buf++=*com_status.read_start_ptr++;
lds R30,_com_status
lds R31,_com_status+1
movw R26,R16
ld R0,Z+
sts _com_status+1,R31
sts _com_status,R30
st X+,R0
movw R16,R26
.dbline 74
; len++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 75
; if (com_status.read_start_ptr==recv_buf+RECV_BUFLEN)
ldi R24,<_recv_buf+50
ldi R25,>_recv_buf+50
lds R2,_com_status
lds R3,_com_status+1
cp R2,R24
cpc R3,R25
brne L49
X10:
.dbline 76
; com_status.read_start_ptr=recv_buf;
ldi R24,<_recv_buf
ldi R25,>_recv_buf
sts _com_status+1,R25
sts _com_status,R24
L49:
.dbline 77
; }
L46:
.dbline 72
lds R2,_com_status+2
lds R3,_com_status+2+1
lds R4,_com_status
lds R5,_com_status+1
cp R4,R2
cpc R5,R3
breq L52
X11:
movw R24,R18
sbiw R24,1
cp R20,R24
cpc R21,R25
brlo L45
X12:
L52:
.dbline 78
; *(--buf)=0;
movw R24,R16
sbiw R24,1
clr R2
movw R30,R24
std z+0,R2
.dbline 79
; return --len;
movw R24,R20
sbiw R24,1
movw R20,R24
movw R16,R24
.dbline -2
L41:
.dbline 0 ; func end
ld R21,y+
ld R20,y+
ret
.dbsym r len 20 i
.dbsym r buflen 18 i
.dbsym r buf 16 pc
.dbend
.area bss(ram, con, rel)
.dbfile E:\Shuaihu\AVR\8880\serial.c
_send_buf::
.blkb 50
.dbsym e send_buf _send_buf A[50:50]c
_recv_buf::
.blkb 50
.dbsym e recv_buf _recv_buf A[50:50]c
_com_status::
.blkb 9
.dbstruct 0 9 tagSERIAL_PORT_STATUS
.dbfield 0 read_start_ptr pc
.dbfield 2 read_end_ptr pc
.dbfield 4 recv_cur_ptr pc
.dbfield 6 send_cur_ptr pc
.dbfield 8 sending c
.dbend
.dbsym e com_status _com_status S[tagSERIAL_PORT_STATUS]
; }
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -