📄 uart.s
字号:
.module Uart.c
.area text(rom, con, rel)
.dbfile E:\程序\AVR程序\BOOTLoadICC\Uart.c
.dbfunc e Init_Com _Init_Com fV
.even
_Init_Com::
.dbline -1
.dbline 24
; #include <iom128v.h>
; #include "Uart.h"
; #include "Crc.h"
;
; //============================================================
; //计算和设置128的波特率参数 chenzuan 2006-03-16
; #define BAUD 19200
; #define CRYSTAL 7372800
; #define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
; #define BAUD_H (unsigned char)(BAUD_SETTING>>8)
; #define BAUD_L (unsigned char)BAUD_SETTING
;
; //============================================================
; //函 数:void Init_Com(void)
; //功 能:初始化串口设置
; //入口参数:无
; //返 回 值:无
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Init_Com(void)
; {
.dbline 25
; UBRR0H = BAUD_H;
clr R2
sts 144,R2
.dbline 26
; UBRR0L = BAUD_L;
ldi R24,23
out 0x9,R24
.dbline 27
; UCSR0B = 0x18;
ldi R24,24
out 0xa,R24
.dbline 28
; UCSR0C = 0x0E;
ldi R24,14
sts 149,R24
.dbline 29
; OCR0 = 0xEA;
ldi R24,234
out 0x31,R24
.dbline 30
; TCCR0 = 0x0F;
ldi R24,15
out 0x33,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Uart_PutChar _Uart_PutChar fV
; Data -> R16
.even
_Uart_PutChar::
.dbline -1
.dbline 44
; }
;
; //============================================================
; //函 数:void Uart_PutChar(unsigned char Data)
; //功 能:发送一个字符
; //入口参数:发送的字符数据
; //返 回 值:无
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Uart_PutChar(unsigned char Data)
; {
L3:
.dbline 45
L4:
.dbline 45
; while(!(UCSR0A & 0x20));
sbis 0xb,5
rjmp L3
.dbline 46
; UDR0 = Data;
out 0xc,R16
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r Data 16 c
.dbend
.dbfunc e Uart_GetChar _Uart_GetChar fI
; res -> R16
; status -> R18
.even
_Uart_GetChar::
.dbline -1
.dbline 60
; }
;
; //============================================================
; //函 数:int Uart_GetChar(void)
; //功 能:接收一个字符
; //入口参数:无
; //返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; int Uart_GetChar(void)
; {
.dbline 63
; unsigned char status,res;
;
; if(!(UCSR0A&0x80))
sbic 0xb,7
rjmp L7
.dbline 64
; return -1;
ldi R16,-1
ldi R17,-1
xjmp L6
L7:
.dbline 65
; status = UCSR0A;
in R18,0xb
.dbline 66
; res = UDR0;
in R16,0xc
.dbline 67
; if(status & 0x1c)
mov R24,R18
andi R24,28
breq L9
.dbline 68
; return -1;
ldi R16,-1
ldi R17,-1
xjmp L6
L9:
.dbline 70
; else
; return res;
clr R17
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbsym r res 16 c
.dbsym r status 18 c
.dbend
.dbfunc e Uart_Send_Frame _Uart_Send_Frame fV
; Len -> R20,R21
; Frame -> R22,R23
.even
_Uart_Send_Frame::
xcall push_gset2
movw R20,R18
movw R22,R16
.dbline -1
.dbline 84
; }
;
; //============================================================
; //函 数:void Uart_Send_Frame(unsigned char *Frame, int Len)
; //功 能:发送一个字符串
; //入口参数:*Frame发送一个字符串数据,Len发送的长度
; //返 回 值:无
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void Uart_Send_Frame(unsigned char *Frame, int Len)
; {
xjmp L13
L12:
.dbline 86
.dbline 87
movw R30,R22
ldd R16,z+0
xcall _Uart_PutChar
.dbline 88
subi R22,255 ; offset = 1
sbci R23,255
.dbline 89
subi R20,1
sbci R21,0
.dbline 90
L13:
.dbline 85
; while(Len > 0)
clr R2
clr R3
cp R2,R20
cpc R3,R21
brlt L12
.dbline -2
L11:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Len 20 I
.dbsym r Frame 22 pc
.dbend
.dbfunc e Uart_Receive_Frame _Uart_Receive_Frame fc
; Len -> R20,R21
; ReceiveLen -> R22,R23
; TimerCount -> R10,R11
; ByteData -> R14,R15
; OverTime -> R12,R13
; Frame -> y+10
.even
_Uart_Receive_Frame::
xcall push_arg4
xcall push_gset5
movw R12,R18
.dbline -1
.dbline 105
; {
; Uart_PutChar(*Frame);
; Frame ++;
; Len --;
; }
; }
;
; //============================================================
; //函 数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
; // int OverTime)
; //功 能:接收一个字符串
; //入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间
; //返 回 值:无
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
; {
.dbline 107
; int ByteData;
; int TimerCount = 0;
clr R10
clr R11
.dbline 108
; int ReceiveLen = 0;
clr R22
clr R23
.dbline 109
; int Len = 255;
ldi R20,255
ldi R21,0
xjmp L17
X0:
.dbline 112
;
; while(ReceiveLen < Len)
; {
L19:
.dbline 114
; while((ByteData = Uart_GetChar()) == -1)
; {
.dbline 115
; if(TIFR& 0x02)
in R2,0x36
sbrs R2,1
rjmp L22
.dbline 116
; {
.dbline 117
; if(++TimerCount > OverTime)
movw R24,R10
adiw R24,1
movw R10,R24
cp R12,R10
cpc R13,R11
brge L24
.dbline 118
; return 0;//等待超时如果还没接收到数据,则返回数据长度0
clr R16
xjmp L15
L24:
.dbline 119
; TIFR=TIFR|0x02;
in R24,0x36
ori R24,2
out 0x36,R24
.dbline 120
; }
L22:
.dbline 121
L20:
.dbline 113
xcall _Uart_GetChar
movw R14,R16
cpi R16,255
ldi R30,255
cpc R17,R30
breq L19
.dbline 122
; }
; Frame[ReceiveLen] = (unsigned char)ByteData;
movw R30,R22
ldd R0,y+10
ldd R1,y+11
add R30,R0
adc R31,R1
std z+0,R14
.dbline 123
; if(ReceiveLen == 0x04)
cpi R22,4
ldi R30,0
cpc R23,R30
brne L26
.dbline 124
; Len = Frame[ReceiveLen] + 0x02;
movw R30,R22
add R30,R0
adc R31,R1
ldd R20,z+0
clr R21
subi R20,254 ; offset = 2
sbci R21,255
L26:
.dbline 125
subi R22,255 ; offset = 1
sbci R23,255
.dbline 126
clr R10
clr R11
.dbline 127
L17:
.dbline 111
cp R22,R20
cpc R23,R21
brlt L20
.dbline 128
; ReceiveLen ++;
; TimerCount = 0;
; }
; return ReceiveLen;
mov R16,R22
.dbline -2
L15:
xcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r Len 20 I
.dbsym r ReceiveLen 22 I
.dbsym r TimerCount 10 I
.dbsym r ByteData 14 I
.dbsym r OverTime 12 I
.dbsym l Frame 10 pc
.dbend
.dbfunc e PC_Send_Err _PC_Send_Err fV
; Crc_Data -> R22,R23
; SendBuf -> R20,R21
; Err_Ret -> R22
.even
_PC_Send_Err::
xcall push_gset2
movw R20,R18
mov R22,R16
.dbline -1
.dbline 142
; }
;
; //============================================================
; //函 数:void PC_Send_Err(unsigned char Ret,unsigned char *SendBuf)
; //功 能:向PC返回执行结果
; //入口参数:结果代码,发送缓冲区
; //返 回 值:无
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void PC_Send_Err(unsigned char Err_Ret,unsigned char *SendBuf)
; {
.dbline 145
; unsigned short Crc_Data;
;
; SendBuf[0] = 0x45;
ldi R24,69
movw R30,R20
std z+0,R24
.dbline 146
; SendBuf[1] = 0x52;
ldi R24,82
std z+1,R24
.dbline 147
; SendBuf[2] = 0x00;
clr R2
movw R30,R20
std z+2,R2
.dbline 148
; SendBuf[3] = 0x05;
ldi R24,5
movw R30,R20
std z+3,R24
.dbline 149
; SendBuf[4] = Err_Ret;
movw R30,R20
std z+4,R22
.dbline 150
; Crc_Data = CRC16(SendBuf,5);
ldi R18,5
ldi R19,0
movw R16,R20
xcall _CRC16
movw R22,R16
.dbline 151
; SendBuf[5] = Crc_Data / 0x100;
movw R2,R22
mov R2,R3
clr R3
movw R30,R20
std z+5,R2
.dbline 152
; SendBuf[6] = (unsigned char)Crc_Data;
movw R30,R20
std z+6,R22
.dbline 153
; Uart_Send_Frame(SendBuf, 7);
ldi R18,7
ldi R19,0
movw R16,R20
xcall _Uart_Send_Frame
.dbline -2
L28:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Crc_Data 22 s
.dbsym r SendBuf 20 pc
.dbsym r Err_Ret 22 c
.dbend
.dbfunc e PC_Send_Ok _PC_Send_Ok fV
; Crc_Data -> R10,R11
; i -> R10,R11
; Len -> R22,R23
; SendBuf -> R20,R21
; Ok_Coad -> R10
; Ok_Frame -> R12,R13
.even
_PC_Send_Ok::
xcall push_gset4
mov R10,R18
movw R12,R16
ldd R20,y+8
ldd R21,y+9
ldd R22,y+10
ldd R23,y+11
.dbline -1
.dbline 168
; }
;
; //============================================================
; //函 数:void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,
; // unsigned char *SendBuf,int Len)
; //功 能:向PC返回执行结果
; //入口参数:发送数据,结果代码,发送缓冲区,发送数据长度
; //返 回 值:无
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,unsigned char *SendBuf,int Len)
; {
.dbline 172
; int i;
; unsigned short Crc_Data;
;
; SendBuf[0] = 0x4F;
ldi R24,79
movw R30,R20
std z+0,R24
.dbline 173
; SendBuf[1] = 0x4B;
ldi R24,75
std z+1,R24
.dbline 174
; SendBuf[2] = 0x00; //包序号
clr R2
movw R30,R20
std z+2,R2
.dbline 175
; SendBuf[3] = 0x04 + Len; //数据长度
movw R24,R22
adiw R24,4
movw R30,R20
std z+3,R24
.dbline 176
; if(Len == 1)
cpi R22,1
ldi R30,0
cpc R23,R30
brne L30
.dbline 177
; SendBuf[4] = Ok_Coad;
movw R30,R20
std z+4,R10
xjmp L31
L30:
.dbline 178
; else if(Len > 1)
ldi R24,1
ldi R25,0
cp R24,R22
cpc R25,R23
brge L32
.dbline 179
; {
.dbline 180
; for(i = 0;i < Len;i ++)
clr R10
clr R11
xjmp L37
L34:
.dbline 181
movw R30,R10
add R30,R12
adc R31,R13
ldd R2,z+0
movw R30,R10
add R30,R20
adc R31,R21
std z+4,R2
L35:
.dbline 180
movw R24,R10
adiw R24,1
movw R10,R24
L37:
.dbline 180
cp R10,R22
cpc R11,R23
brlt L34
.dbline 182
; SendBuf[4+i] = Ok_Frame[i];
; }
xjmp L33
L32:
.dbline 184
; else
; SendBuf[4] = 0;
clr R2
movw R30,R20
std z+4,R2
L33:
L31:
.dbline 185
; Crc_Data = CRC16(SendBuf,4+Len);
movw R18,R22
subi R18,252 ; offset = 4
sbci R19,255
movw R16,R20
xcall _CRC16
movw R10,R16
.dbline 186
; SendBuf[Len+4] = Crc_Data / 0x100;
movw R30,R22
add R30,R20
adc R31,R21
movw R2,R10
mov R2,R3
clr R3
std z+4,R2
.dbline 187
; SendBuf[Len+5] = (unsigned char)Crc_Data;
movw R30,R22
add R30,R20
adc R31,R21
std z+5,R10
.dbline 188
; Uart_Send_Frame(SendBuf, Len+6);
movw R18,R22
subi R18,250 ; offset = 6
sbci R19,255
movw R16,R20
xcall _Uart_Send_Frame
.dbline -2
L29:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r Crc_Data 10 s
.dbsym r i 10 I
.dbsym r Len 22 I
.dbsym r SendBuf 20 pc
.dbsym r Ok_Coad 10 c
.dbsym r Ok_Frame 12 pc
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -