📄 boot128.lst
字号:
F250 DE7C RCALL _quit
F251 C07B RJMP 0xF2CD
(0294)
(0295) while(1)
(0296) {
(0297) Rec_Len = 0;
F252 2744 CLR R20
F253 2755 CLR R21
(0298) Rec_Len = Uart_Receive_Frame(ReceiveBuf,10);
F254 E02A LDI R18,0xA
F255 E030 LDI R19,0
F256 E006 LDI R16,6
F257 E012 LDI R17,2
F258 940EF36B CALL _Uart_Receive_Frame
F25A 2F40 MOV R20,R16
F25B 2755 CLR R21
(0299) if(Rec_Len)//接收命令信号
F25C 3040 CPI R20,0
F25D 0745 CPC R20,R21
F25E F409 BNE 0xF260
F25F C06D RJMP 0xF2CD
(0300) {
(0301) if(Verify_Command(ReceiveBuf,Rec_Len))
F260 019A MOVW R18,R20
F261 E006 LDI R16,6
F262 E012 LDI R17,2
F263 940EF306 CALL _Verify_Command
F265 2300 TST R16
F266 F011 BEQ 0xF269
(0302) Ret_Value = ERR_COMMANDCRC;
F267 E161 LDI R22,0x11
F268 C05D RJMP 0xF2C6
(0303) else
(0304) {
(0305) switch(ReceiveBuf[2]) //根据不同指令执行不同的操作
F269 90A00208 LDS R10,ReceiveBuf+2
F26B 24BB CLR R11
F26C 01C5 MOVW R24,R10
F26D 3081 CPI R24,1
F26E E0E0 LDI R30,0
F26F 079E CPC R25,R30
F270 F0B1 BEQ 0xF287
F271 3082 CPI R24,2
F272 E0E0 LDI R30,0
F273 079E CPC R25,R30
F274 F0A9 BEQ 0xF28A
F275 3083 CPI R24,3
F276 E0E0 LDI R30,0
F277 079E CPC R25,R30
F278 F0B1 BEQ 0xF28F
F279 3084 CPI R24,4
F27A E0E0 LDI R30,0
F27B 079E CPC R25,R30
F27C F0B9 BEQ 0xF294
F27D 3085 CPI R24,5
F27E E0E0 LDI R30,0
F27F 079E CPC R25,R30
F280 F181 BEQ 0xF2B1
F281 3086 CPI R24,6
F282 E0E0 LDI R30,0
F283 079E CPC R25,R30
F284 F409 BNE 0xF286
F285 C03A RJMP 0xF2C0
F286 C03E RJMP 0xF2C5
(0306) {
(0307) case 0x01: //程序下载
(0308) Ret_Value = Flow_Control();
F287 DE4D RCALL _Flow_Control
F288 2F60 MOV R22,R16
(0309) break;
F289 C03C RJMP 0xF2C6
(0310) case 0x02: //设置组地址,接点地址 //Read_Eeprom(POINT,data,14);
(0311) Ret_Value = Setting_Param(ReceiveBuf);
F28A E006 LDI R16,6
F28B E012 LDI R17,2
F28C DF06 RCALL _Setting_Param
F28D 2F60 MOV R22,R16
(0312) break;
F28E C037 RJMP 0xF2C6
(0313) case 0x03: //上传表具信息
(0314) Ret_Value = Read_Param(SendData);
F28F E000 LDI R16,0
F290 E013 LDI R17,3
F291 DF3B RCALL _Read_Param
F292 2F60 MOV R22,R16
(0315) break;
F293 C032 RJMP 0xF2C6
(0316) case 0x04: //硬件检测
(0317) SendData[0] = 'R';
F294 E582 LDI R24,0x52
F295 93800300 STS SendData,R24
(0318) SendData[1] = 'T';
F297 E584 LDI R24,0x54
F298 93800301 STS SendData+1,R24
(0319) SendData[2] = 'C';
F29A E483 LDI R24,0x43
F29B 93800302 STS SendData+2,R24
(0320) SendData[3] = 'O';
F29D E48F LDI R24,0x4F
F29E 93800303 STS SendData+3,R24
(0321) SendData[4] = 'K';
F2A0 E48B LDI R24,0x4B
F2A1 93800304 STS 0x304,R24
(0322) PC_Send_Ok(SendData,0x00,SendBuf,5); //向上位机发送硬件检测情况
F2A3 E085 LDI R24,5
F2A4 E090 LDI R25,0
F2A5 839B STD Y+3,R25
F2A6 838A STD Y+2,R24
F2A7 E98C LDI R24,0x9C
F2A8 E092 LDI R25,2
F2A9 8399 STD Y+1,R25
F2AA 8388 STD Y+0,R24
F2AB 2722 CLR R18
F2AC E000 LDI R16,0
F2AD E013 LDI R17,3
F2AE 940EF3CD CALL _PC_Send_Ok
(0323) break;
F2B0 C015 RJMP 0xF2C6
(0324) case 0x05: //复位命令
(0325) PC_Send_Ok(SendData,0x00,SendBuf,0); //向上位机发送复位成功命令
F2B1 2422 CLR R2
F2B2 2433 CLR R3
F2B3 823B STD Y+3,R3
F2B4 822A STD Y+2,R2
F2B5 E98C LDI R24,0x9C
F2B6 E092 LDI R25,2
F2B7 8399 STD Y+1,R25
F2B8 8388 STD Y+0,R24
F2B9 2722 CLR R18
F2BA E000 LDI R16,0
F2BB E013 LDI R17,3
F2BC 940EF3CD CALL _PC_Send_Ok
(0326) quit();
F2BE DE0E RCALL _quit
(0327) break;
F2BF C006 RJMP 0xF2C6
(0328) case 0x06: //读取系统时钟
(0329) Ret_Value = Read_SystemTime(SendData);
F2C0 E000 LDI R16,0
F2C1 E013 LDI R17,3
F2C2 DF31 RCALL _Read_SystemTime
F2C3 2F60 MOV R22,R16
(0330) break;
F2C4 C001 RJMP 0xF2C6
(0331) default: //没有找到相应的指令,返回指令错误
(0332) Ret_Value = ERR_NOCOMMAND;
F2C5 E164 LDI R22,0x14
(0333) break;
(0334) }
(0335) }
(0336) if(Ret_Value) //执行的子程返回0时表示,成功执行命令
F2C6 2366 TST R22
F2C7 F029 BEQ 0xF2CD
(0337) PC_Send_Err(Ret_Value,SendBuf);
F2C8 E92C LDI R18,0x9C
F2C9 E032 LDI R19,2
F2CA 2F06 MOV R16,R22
F2CB 940EF3A8 CALL _PC_Send_Err
F2CD CF84 RJMP 0xF252
F2CE 9624 ADIW R28,4
F2CF 9508 RET
_CRC16:
ACC --> R20
byte --> R22
TOPBIT --> R10
k --> R14
remainder --> R12
Len --> R18
Message --> R16
F2D0 940EF5F7 CALL push_gset5
FILE: E:\程序\AVR程序\BOOTLoadICC\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;
F2D2 24CC CLR R12
F2D3 24DD CLR R13
(0020)
(0021) TOPBIT = 0x8000;
F2D4 E080 LDI R24,0
F2D5 E890 LDI R25,0x80
F2D6 015C MOVW R10,R24
(0022) for (byte = 0; byte < Len; ++byte)
F2D7 2766 CLR R22
F2D8 2777 CLR R23
F2D9 C025 RJMP 0xF2FF
(0023) {
(0024) ACC = Message[byte];
F2DA 01FB MOVW R30,R22
F2DB 0FE0 ADD R30,R16
F2DC 1FF1 ADC R31,R17
F2DD 8140 LDD R20,Z+0
F2DE 2755 CLR R21
(0025) remainder ^= (ACC <<8);
F2DF 011A MOVW R2,R20
F2E0 2C32 MOV R3,R2
F2E1 2422 CLR R2
F2E2 24C2 EOR R12,R2
F2E3 24D3 EOR R13,R3
(0026) for (k = 8; k > 0; --k)
F2E4 E088 LDI R24,0x8
F2E5 2EE8 MOV R14,R24
F2E6 C013 RJMP 0xF2FA
(0027) {
(0028) if (remainder & TOPBIT)
F2E7 0116 MOVW R2,R12
F2E8 202A AND R2,R10
F2E9 203B AND R3,R11
F2EA 2022 TST R2
F2EB F411 BNE 0xF2EE
F2EC 2033 TST R3
F2ED F049 BEQ 0xF2F7
(0029) {
(0030) remainder = (remainder << 1) ^0x8005;
F2EE E085 LDI R24,5
F2EF E890 LDI R25,0x80
F2F0 0116 MOVW R2,R12
F2F1 0C22 LSL R2
F2F2 1C33 ROL R3
F2F3 2628 EOR R2,R24
F2F4 2639 EOR R3,R25
F2F5 0161 MOVW R12,R2
(0031) }
F2F6 C002 RJMP 0xF2F9
(0032) else
(0033) {
(0034) remainder = (remainder << 1);
F2F7 0CCC LSL R12
F2F8 1CDD ROL R13
F2F9 94EA DEC R14
F2FA 2422 CLR R2
F2FB 142E CP R2,R14
F2FC F350 BCS 0xF2E7
F2FD 5F6F SUBI R22,0xFF
F2FE 4F7F SBCI R23,0xFF
F2FF 1762 CP R22,R18
F300 0773 CPC R23,R19
F301 F2C4 BLT 0xF2DA
(0035) }
(0036) }
(0037) }
(0038) return (remainder^0x0000);
F302 0186 MOVW R16,R12
F303 940EF5F5 CALL pop_gset5
F305 9508 RET
_Verify_Command:
Crc_Tmp --> R20
Len --> R10
ReceiveBuf --> R22
F306 940EF5FB CALL push_gset3
F308 0159 MOVW R10,R18
F309 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))//整包数据长度减去校验和为命令长度
F30A 01C5 MOVW R24,R10
F30B 9702 SBIW R24,2
F30C 01FB MOVW R30,R22
F30D 8024 LDD R2,Z+4
F30E 2433 CLR R3
F30F 1628 CP R2,R24
F310 0639 CPC R3,R25
F311 F011 BEQ 0xF314
(0056) return 1;
F312 E001 LDI R16,1
F313 C01E RJMP 0xF332
(0057)
(0058) Crc_Tmp = ReceiveBuf[Len-2]*0x100 + ReceiveBuf[Len-1];
F314 01F5 MOVW R30,R10
F315 9732 SBIW R30,2
F316 0FE6 ADD R30,R22
F317 1FF7 ADC R31,R23
F318 8120 LDD R18,Z+0
F319 2733 CLR R19
F31A E000 LDI R16,0
F31B E011 LDI R17,1
F31C 940EF5DF CALL empy16s
F31E 01A8 MOVW R20,R16
F31F 01F5 MOVW R30,R10
F320 9731 SBIW R30,1
F321 0FE6 ADD R30,R22
F322 1FF7 ADC R31,R23
F323 8020 LDD R2,Z+0
F324 2433 CLR R3
F325 0D42 ADD R20,R2
F326 1D53 ADC R21,R3
(0059)
(0060) if((CRC16(ReceiveBuf, Len-2)) !=Crc_Tmp)
F327 0195 MOVW R18,R10
F328 5022 SUBI R18,2
F329 4030 SBCI R19,0
F32A 018B MOVW R16,R22
F32B DFA4 RCALL _CRC16
F32C 1704 CP R16,R20
F32D 0715 CPC R17,R21
F32E F011 BEQ 0xF331
(0061) return 3;
F32F E003 LDI R16,3
F330 C001 RJMP 0xF332
(0062) return 0;
F331 2700 CLR R16
F332 940EF5F1 CALL pop_gset3
F334 9508 RET
FILE: E:\程序\AVR程序\BOOTLoadICC\Uart.c
(0001) #include <iom128v.h>
(0002) #include "Uart.h"
(0003) #include "Crc.h"
(0004)
(0005) //============================================================
(0006) //计算和设置128的波特率参数 chenzuan 2006-03-16
(0007) #define BAUD 19200
(0008) #define CRYSTAL 7372800
(0009) #define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
(0010) #define BAUD_H (unsigned char)(BAUD_SETTING>>8)
(0011) #define BAUD_L (unsigned char)BAUD_SETTING
(0012)
(0013) //============================================================
(0014) //函 数:void Init_Com(void)
(0015) //功 能:初始化串口设置
(0016) //入口参数:无
(0017) //返 回 值:无
(0018) //设 计 者:覃道堂
(0019) //创作时间:2006-03-16
(0020) //修改时间:
(0021) //修改目的:
(0022) //============================================================
(0023) void Init_Com(void)
(0024) {
(0025) UBRR0H = BAUD_H;
_Init_Com:
F335 2422 CLR R2
F336 92200090 STS 0x90,R2
(0026) UBRR0L = BAUD_L;
F338 E187 LDI R24,0x17
F339 B989 OUT 0x09,R24
(0027) UCSR0B = 0x18;
F33A E188 LDI R24,0x18
F33B B98A OUT 0x0A,R24
(0028) UCSR0C = 0x0E;
F33C E08E LDI R24,0xE
F33D 93800095 STS 0x95,R24
(0029) OCR0 = 0xEA;
F33F EE8A LDI R24,0xEA
F340 BF81 OUT 0x31,R24
(0030) TCCR0 = 0x0F;
F341 E08F LDI R24,0xF
F342 BF83 OUT 0x33,R24
F343 9508 RET
(0031) }
(0032)
(0033) //============================================================
(0034) //函 数:void Uart_PutChar(unsigned char Data)
(0035) //功 能:发送一个字符
(0036) //入口参数:发送的字符数据
(0037) //返 回 值:无
(0038) //设 计 者:覃道堂
(0039) //创作时间:2006-03-16
(0040) //修改时间:
(0041) //修改目的:
(0042) //============================================================
(0043) void Uart_PutChar(unsigned char Data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -