📄 serial.s
字号:
.module serial.c
.area text(rom, con, rel)
.dbfile E:\Program\gps\serial.c
.dbfunc e uart0_init _uart0_init fV
.even
_uart0_init::
.dbline -1
.dbline 24
; //ICC-AVR application builder : 2006-5-8 20:10:07
; // Target : M16
; // Crystal: 8Mhz
;
; #include <iom32v.h>
; #include <macros.h>
; #include <serial.h>
;
; #define max 1024
;
; /* Static Variables */
; int count;
; char rcv_buf[max];
; int UART_wp;//write data to receive buffer
; int read_pt;//read pointer: read data from receive buffer
;
;
; //UART0 initialize
; // desired baud rate: 4800
; // actual: baud rate:4800 (0.0%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
.dbline 26
;
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
.dbline 27
; UCSRA = 0x00;
out 0xb,R2
.dbline 28
; UCSRC = BIT(URSEL) | 0x06;
ldi R24,134
out 0x20,R24
.dbline 29
; UBRRL = 0XCF; //set baud rate lo
ldi R24,207
out 0x9,R24
.dbline 30
; UBRRH = 0X00; //set baud rate hi
out 0x20,R2
.dbline 31
; UCSRB = 0x90;//10010000
ldi R24,144
out 0xa,R24
.dbline 32
; UART_wp = 0;
clr R3
sts _UART_wp+1,R3
sts _UART_wp,R2
.dbline 33
; read_pt = 0;
sts _read_pt+1,R3
sts _read_pt,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 52
jmp _uart0_rx_isr
.area text(rom, con, rel)
.dbfile E:\Program\gps\serial.c
.dbfunc e uart0_rx_isr _uart0_rx_isr fV
.even
_uart0_rx_isr::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 38
; }
;
; #pragma interrupt_handler uart0_rx_isr:14
; void uart0_rx_isr(void)
; {
.dbline 40
; //uart has received a character in UDR
; if (count<max)
lds R24,_count
lds R25,_count+1
cpi R24,0
ldi R30,4
cpc R25,R30
brge L3
.dbline 42
; /* read the received data */
; {
.dbline 43
; rcv_buf[UART_wp++]=UDR; /* store received data in buffer */
lds R2,_UART_wp
lds R3,_UART_wp+1
movw R24,R2
adiw R24,1
sts _UART_wp+1,R25
sts _UART_wp,R24
ldi R24,<_rcv_buf
ldi R25,>_rcv_buf
movw R30,R2
add R30,R24
adc R31,R25
in R2,0xc
std z+0,R2
.dbline 44
; count++;
lds R24,_count
lds R25,_count+1
adiw R24,1
sts _count+1,R25
sts _count,R24
.dbline 45
; }
L3:
.dbline 48
lds R24,_UART_wp
lds R25,_UART_wp+1
cpi R24,0
ldi R30,4
cpc R25,R30
brne L5
.dbline 49
clr R2
clr R3
sts _UART_wp+1,R3
sts _UART_wp,R2
L5:
.dbline -2
L2:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Read_buf _Read_buf fc
; temp -> R16
.even
_Read_buf::
.dbline -1
.dbline 61
;
; /* calculate buffer index */
; if (UART_wp==max)
; UART_wp = 0; // full return to the start
; }
;
; /*********************************************************************
; * read data from buffer
; description: 1 close interrupt
; 2 whether there are data to be read
; 3 read data, and count--
; 4 return the data
; 5 rp point to next character
; **********************************************************************/
; char Read_buf(void)
; {
L8:
.dbline 63
L9:
.dbline 63
; char temp;
; while ( !count);//if no data ,wait for new data
lds R2,_count
lds R3,_count+1
tst R2
brne X0
tst R3
breq L8
X0:
.dbline 64
; count--;
lds R24,_count
lds R25,_count+1
sbiw R24,1
sts _count+1,R25
sts _count,R24
.dbline 65
; temp=rcv_buf[read_pt++];
lds R2,_read_pt
lds R3,_read_pt+1
movw R24,R2
adiw R24,1
sts _read_pt+1,R25
sts _read_pt,R24
ldi R24,<_rcv_buf
ldi R25,>_rcv_buf
movw R30,R2
add R30,R24
adc R31,R25
ldd R16,z+0
.dbline 66
; if (read_pt==1024)
lds R24,_read_pt
lds R25,_read_pt+1
cpi R24,0
ldi R30,4
cpc R25,R30
brne L11
.dbline 67
; read_pt=0;
clr R2
clr R3
sts _read_pt+1,R3
sts _read_pt,R2
L11:
.dbline 68
; return ( temp);
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbsym r temp 16 c
.dbend
.area bss(ram, con, rel)
.dbfile E:\Program\gps\serial.c
_read_pt::
.blkb 2
.dbsym e read_pt _read_pt I
_UART_wp::
.blkb 2
.dbsym e UART_wp _UART_wp I
_rcv_buf::
.blkb 1024
.dbsym e rcv_buf _rcv_buf A[1024:1024]c
_count::
.blkb 2
.dbsym e count _count I
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -