📄 boot128.lst
字号:
__text_start:
__start:
003A E5CF LDI R28,0x5F
003B E0D4 LDI R29,4
003C BFCD OUT 0x3D,R28
003D BFDE OUT 0x3E,R29
003E 51C0 SUBI R28,0x10
003F 40D0 SBCI R29,0
0040 EA0A LDI R16,0xAA
0041 8308 STD Y+0,R16
0042 2400 CLR R0
0043 E6E6 LDI R30,0x66
0044 E0F0 LDI R31,0
0045 E012 LDI R17,2
0046 3CE4 CPI R30,0xC4
0047 07F1 CPC R31,R17
0048 F011 BEQ 0x004B
0049 9201 ST R0,Z+
004A CFFB RJMP 0x0046
004B 8300 STD Z+0,R16
004C E6ED LDI R30,0x6D
004D E0F0 LDI R31,0
004E E6A0 LDI R26,0x60
004F E0B0 LDI R27,0
0050 E010 LDI R17,0
0051 37E3 CPI R30,0x73
0052 07F1 CPC R31,R17
0053 F021 BEQ 0x0058
0054 95C8 LPM
0055 9631 ADIW R30,1
0056 920D ST R0,X+
0057 CFF9 RJMP 0x0051
0058 940E005B CALL _main
_exit:
005A CFFF RJMP _exit
_main:
data --> Y+39
SendBuf --> Y+29
ReceiveBuf --> Y+14
SendData --> Y+4
i --> R20
005B 97E1 SBIW R28,0x31
FILE: D:\avr16\atmegal16\main.c
(0001) #include <iom16v.h>
(0002) #include "Eeprom128.h"
(0003) #include "Rtc8025.h"
(0004) #include "Uart.h"
(0005) #include "Crc.h"
(0006)
(0007) #define BOOT_TEST 0
(0008)
(0009) //============================================================
(0010) //无线错误下载设置错误代码定义
(0011) #define ERR_CONNECT 0x10//表示握手信号接收不对;
(0012) #define ERR_COMMANDCRC 0x11//表示接收命令校验错误;
(0013) #define ERR_DATACRC 0x12//表示接收数据不正确,要求丛发数据;
(0014) #define ERR_OVERTIME 0x13//表示接收数据超时;
(0015) #define ERR_NOCOMMAND 0x14//没有该指令;
(0016) #define ERR_SETTING 0x15//设置参数失败;
(0017) #define ERR_READTIME 0x16//读取系统时钟失败;
(0018)
(0019) //============================================================
(0020) //定义写Flash一页的长度,同时声明数据Buffer
(0021) #define SPM_PAGESIZE 256
(0022) unsigned char SendData[100];
(0023) unsigned char SendBuf[100];
(0024) unsigned char ReceiveBuf[150];
(0025) unsigned char data[SPM_PAGESIZE];
(0026)
(0027) //============================================================
(0028) //定义接收数据的起点和写FLASH的起始地址
(0029) unsigned int bPiont = 0;
(0030) unsigned long address= 0x0000;
(0031)
(0032)
(0033) //============================================================
(0034) //函 数:void main(void)
(0035) //功 能:主函数
(0036) //入口参数:无
(0037) //返 回 值:无
(0038) //设 计 者:覃道堂
(0039) //创作时间:2006-03-16
(0040) //修改时间:
(0041) //修改目的:
(0042) //============================================================
(0043) void main(void)
(0044) {
(0045)
(0046) unsigned char SendData[10]="a000000000";
005C E584 LDI R24,0x54
005D E090 LDI R25,0
005E 01FE MOVW R30,R28
005F 9634 ADIW R30,4
0060 E00A LDI R16,0xA
0061 E010 LDI R17,0
0062 93FA ST R31,-Y
0063 93EA ST R30,-Y
0064 939A ST R25,-Y
0065 938A ST R24,-Y
0066 940E0263 CALL asgncblk
(0047) unsigned char SendBuf[10];
(0048) unsigned char ReceiveBuf[15]="1234567810";
0068 E58E LDI R24,0x5E
0069 E090 LDI R25,0
006A 01FE MOVW R30,R28
006B 963E ADIW R30,0xE
006C E00F LDI R16,0xF
006D E010 LDI R17,0
006E 93FA ST R31,-Y
006F 93EA ST R30,-Y
0070 939A ST R25,-Y
0071 938A ST R24,-Y
0072 940E0263 CALL asgncblk
(0049) unsigned char data[10];
(0050) unsigned char i;
(0051)
(0052) Init_Com();
0074 940E0131 CALL _Init_Com
(0053) Uart_PutChar(0x01);
0076 E001 LDI R16,1
0077 940E013A CALL _Uart_PutChar
(0054) PC_Send_Ok(SendData,0x00,SendBuf,1); //向PC 发送接收握手信号
0079 E081 LDI R24,1
007A E090 LDI R25,0
007B 839B STD Y+3,R25
007C 838A STD Y+2,R24
007D 01CE MOVW R24,R28
007E 964D ADIW R24,0x1D
007F 8399 STD Y+1,R25
0080 8388 STD Y+0,R24
0081 2722 CLR R18
0082 018E MOVW R16,R28
0083 5F0C SUBI R16,0xFC
0084 4F1F SBCI R17,0xFF
0085 940E01C3 CALL _PC_Send_Ok
(0055) Read_EEPROM(SendData,2,0x10);
0087 E180 LDI R24,0x10
0088 E090 LDI R25,0
0089 8399 STD Y+1,R25
008A 8388 STD Y+0,R24
008B E022 LDI R18,2
008C 018E MOVW R16,R28
008D 5F0C SUBI R16,0xFC
008E 4F1F SBCI R17,0xFF
008F 940E020C CALL _Read_EEPROM
(0056)
(0057) for(i=0;i<10;i++)
0091 2744 CLR R20
0092 C009 RJMP 0x009C
(0058) SendData[i]=0;
0093 01CE MOVW R24,R28
0094 9604 ADIW R24,4
0095 2FE4 MOV R30,R20
0096 27FF CLR R31
0097 0FE8 ADD R30,R24
0098 1FF9 ADC R31,R25
0099 2422 CLR R2
009A 8220 STD Z+0,R2
009B 9543 INC R20
009C 304A CPI R20,0xA
009D F3A8 BCS 0x0093
(0059) Write_EEPROM(&ReceiveBuf[5],2,0x10);//设置节点地址
009E E180 LDI R24,0x10
009F E090 LDI R25,0
00A0 8399 STD Y+1,R25
00A1 8388 STD Y+0,R24
00A2 E022 LDI R18,2
00A3 018E MOVW R16,R28
00A4 5E0D SUBI R16,0xED
00A5 4F1F SBCI R17,0xFF
00A6 940E01F2 CALL _Write_EEPROM
(0060) Read_EEPROM(SendData,2,0x10);
00A8 E180 LDI R24,0x10
00A9 E090 LDI R25,0
00AA 8399 STD Y+1,R25
00AB 8388 STD Y+0,R24
00AC E022 LDI R18,2
00AD 018E MOVW R16,R28
00AE 5F0C SUBI R16,0xFC
00AF 4F1F SBCI R17,0xFF
00B0 940E020C CALL _Read_EEPROM
(0061)
(0062) for(i=0;i<10;i++)
00B2 2744 CLR R20
00B3 C009 RJMP 0x00BD
(0063) SendData[i]=0;
00B4 01CE MOVW R24,R28
00B5 9604 ADIW R24,4
00B6 2FE4 MOV R30,R20
00B7 27FF CLR R31
00B8 0FE8 ADD R30,R24
00B9 1FF9 ADC R31,R25
00BA 2422 CLR R2
00BB 8220 STD Z+0,R2
00BC 9543 INC R20
00BD 304A CPI R20,0xA
00BE F3A8 BCS 0x00B4
(0064)
(0065) Read_EEPROM(SendData,2,0x10);
00BF E180 LDI R24,0x10
00C0 E090 LDI R25,0
00C1 8399 STD Y+1,R25
00C2 8388 STD Y+0,R24
00C3 E022 LDI R18,2
00C4 018E MOVW R16,R28
00C5 5F0C SUBI R16,0xFC
00C6 4F1F SBCI R17,0xFF
00C7 940E020C CALL _Read_EEPROM
(0066)
(0067) while(1);
00C9 CFFF RJMP 0x00C9
00CA 96E1 ADIW R28,0x31
00CB 9508 RET
_CRC16:
ACC --> R20
byte --> R22
TOPBIT --> R10
k --> R14
remainder --> R12
Len --> R18
Message --> R16
00CC 940E0244 CALL push_gset5
FILE: D:\avr16\atmegal16\Crc.c
(0001) #include <iom128v.h>
(0002) #include "Crc.h"
(0003)
(0004) //============================================================
(0005) //函 数:unsigned short CRC16(unsigned char *Message, int Len)
(0006) //功 能:CRC16计算
(0007) //入口参数:Message 要进行CRC16计算字符串,Len字符串长度
(0008) //返 回 值:CRC16计算结果
(0009) //设 计 者:覃道堂
(0010) //创作时间:2004-03-30
(0011) //修改时间:
(0012) //修改目的:
(0013) //============================================================
(0014) unsigned short CRC16(unsigned char *Message, int Len)
(0015) {
(0016) int byte;
(0017) unsigned char k;
(0018) unsigned short ACC,TOPBIT;
(0019) unsigned short remainder = 0x0000;
00CE 24CC CLR R12
00CF 24DD CLR R13
(0020)
(0021) TOPBIT = 0x8000;
00D0 E080 LDI R24,0
00D1 E890 LDI R25,0x80
00D2 015C MOVW R10,R24
(0022) for (byte = 0; byte < Len; ++byte)
00D3 2766 CLR R22
00D4 2777 CLR R23
00D5 C025 RJMP 0x00FB
(0023) {
(0024) ACC = Message[byte];
00D6 01FB MOVW R30,R22
00D7 0FE0 ADD R30,R16
00D8 1FF1 ADC R31,R17
00D9 8140 LDD R20,Z+0
00DA 2755 CLR R21
(0025) remainder ^= (ACC <<8);
00DB 011A MOVW R2,R20
00DC 2C32 MOV R3,R2
00DD 2422 CLR R2
00DE 24C2 EOR R12,R2
00DF 24D3 EOR R13,R3
(0026) for (k = 8; k > 0; --k)
00E0 E088 LDI R24,0x8
00E1 2EE8 MOV R14,R24
00E2 C013 RJMP 0x00F6
(0027) {
(0028) if (remainder & TOPBIT)
00E3 0116 MOVW R2,R12
00E4 202A AND R2,R10
00E5 203B AND R3,R11
00E6 2022 TST R2
00E7 F411 BNE 0x00EA
00E8 2033 TST R3
00E9 F049 BEQ 0x00F3
(0029) {
(0030) remainder = (remainder << 1) ^0x8005;
00EA E085 LDI R24,5
00EB E890 LDI R25,0x80
00EC 0116 MOVW R2,R12
00ED 0C22 LSL R2
00EE 1C33 ROL R3
00EF 2628 EOR R2,R24
00F0 2639 EOR R3,R25
00F1 0161 MOVW R12,R2
(0031) }
00F2 C002 RJMP 0x00F5
(0032) else
(0033) {
(0034) remainder = (remainder << 1);
00F3 0CCC LSL R12
00F4 1CDD ROL R13
00F5 94EA DEC R14
00F6 2422 CLR R2
00F7 142E CP R2,R14
00F8 F350 BCS 0x00E3
00F9 5F6F SUBI R22,0xFF
00FA 4F7F SBCI R23,0xFF
00FB 1762 CP R22,R18
00FC 0773 CPC R23,R19
00FD F2C4 BLT 0x00D6
(0035) }
(0036) }
(0037) }
(0038) return (remainder^0x0000);
00FE 0186 MOVW R16,R12
00FF 940E0241 CALL pop_gset5
0101 9508 RET
_Verify_Command:
Crc_Tmp --> R20
Len --> R10
ReceiveBuf --> R22
0102 940E0248 CALL push_gset3
0104 0159 MOVW R10,R18
0105 01B8 MOVW R22,R16
(0039) }
(0040)
(0041) //============================================================
(0042) //函 数:unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
(0043) //功 能:CRC校验处理
(0044) //入口参数:校验数据,校验数据长度
(0045) //返 回 值:0校验成功。否则不正确
(0046) //设 计 者:覃道堂
(0047) //创作时间:2006-03-16
(0048) //修改时间:
(0049) //修改目的:
(0050) //============================================================
(0051) unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
(0052) {
(0053) unsigned short Crc_Tmp;
(0054)
(0055) if(ReceiveBuf[4] != (Len - 2))//整包数据长度减去校验和为命令长度
0106 01C5 MOVW R24,R10
0107 9702 SBIW R24,2
0108 01FB MOVW R30,R22
0109 8024 LDD R2,Z+4
010A 2433 CLR R3
010B 1628 CP R2,R24
010C 0639 CPC R3,R25
010D F011 BEQ 0x0110
(0056) return 1;
010E E001 LDI R16,1
010F C01E RJMP 0x012E
(0057)
(0058) Crc_Tmp = ReceiveBuf[Len-2]*0x100 + ReceiveBuf[Len-1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -