📄 main.lis
字号:
.module main.c
.area bss(ram, con, rel)
0000 L2:
0000 .blkb 2
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\main.c
0000 .dbfunc e main _main fV
0000 .dbsym s msgCounter L2 i
0000 ; rec_data -> R20
.even
0000 _main::
0000 .dbline -1
0000 .dbline 23
0000 ; /*
0000 ; 实验十九:
0000 ; mega128 BOOT实验。
0000 ; 1、AVR单片机IAP实验,使用AVRISP协议及上位机软件,进行IAP升级实验。
0000 ; 进入IAP方法:在启动时按住S7键。
0000 ; 退出IAP方法:在不按S7按键的情况下复位CPU即可。
0000 ; 使用方法:和正常的AVRISP下载方式相同。
0000 ; 2、外部3.6864 M晶振。
0000 ; 3、进行此实验请插上LED短路块,与PC机的通信由UART0完成。
0000 ; 4、这个实验是一个高难度实验,同样也是一个很有意义的实验,
0000 ; 此实验可以移植到产品里面使用。
0000 ;
0000 ; AVR mega128学习板
0000 ; www.iccavr.com 阿发
0000 ; 5:18 2007-10-20
0000 ;
0000 ; 本实验代码主要参考了小松工程和马潮老师的作品。
0000 ; */
0000 ;
0000 ; #include "init.h"
0000 ;
0000 ; /*主函数*/
0000 ; void main(void) {
0000 .dbline 27
0000 ;
0000 ; unsigned char rec_data;
0000 ; static unsigned int msgCounter;
0000 ; init();
0000 0E940000 xcall _init
0004 A1C0 xjmp L4
0006 L3:
0006 .dbline 28
0006 ; while (1) {
0006 .dbline 29
0006 ; rec_data=getChar();
0006 0E940000 xcall _getChar
000A 402F mov R20,R16
000C .dbline 30
000C ; if (statusMachine == ST_START) {
000C 80910000 lds R24,_statusMachine
0010 803F cpi R24,240
0012 51F4 brne L6
0014 .dbline 30
0014 .dbline 33
0014 ; //flag = 1;
0014 ; //TCCR1B = 0x00;
0014 ; if (rec_data==MESSAGE_START) { /*同步*/
0014 0B31 cpi R16,27
0016 09F0 breq X1
0018 97C0 xjmp L7
001A X1:
001A .dbline 33
001A .dbline 34
001A ; statusMachine = ST_GET_SEQ_NUM;
001A 81EF ldi R24,241
001C 80930000 sts _statusMachine,R24
0020 .dbline 35
0020 ; checkSum = MESSAGE_START;
0020 8BE1 ldi R24,27
0022 80930000 sts _checkSum,R24
0026 .dbline 36
0026 ; }
0026 .dbline 37
0026 ; }
0026 90C0 xjmp L7
0028 L6:
0028 .dbline 38
0028 ; else if (statusMachine == ST_GET_SEQ_NUM) { /*序号*/
0028 80910000 lds R24,_statusMachine
002C 813F cpi R24,241
002E 59F4 brne L10
0030 .dbline 38
0030 .dbline 39
0030 ; seqNumber = rec_data;
0030 40930000 sts _seqNumber,R20
0034 .dbline 40
0034 ; checkSum ^= rec_data;
0034 20900000 lds R2,_checkSum
0038 2426 eor R2,R20
003A 20920000 sts _checkSum,R2
003E .dbline 41
003E ; statusMachine = ST_MSG_SIZE_1;
003E 82EF ldi R24,242
0040 80930000 sts _statusMachine,R24
0044 .dbline 42
0044 ; }
0044 81C0 xjmp L11
0046 L10:
0046 .dbline 43
0046 ; else if (statusMachine == ST_MSG_SIZE_1) { /*长度*/
0046 80910000 lds R24,_statusMachine
004A 823F cpi R24,242
004C A9F4 brne L12
004E .dbline 43
004E .dbline 44
004E ; msgSize = rec_data;
004E 242E mov R2,R20
0050 3324 clr R3
0052 30920100 sts _msgSize+1,R3
0056 20920000 sts _msgSize,R2
005A .dbline 45
005A ; msgSize <<=8;
005A 322C mov R3,R2
005C 2224 clr R2
005E 30920100 sts _msgSize+1,R3
0062 20920000 sts _msgSize,R2
0066 .dbline 46
0066 ; checkSum ^= rec_data;
0066 20900000 lds R2,_checkSum
006A 2426 eor R2,R20
006C 20920000 sts _checkSum,R2
0070 .dbline 47
0070 ; statusMachine = ST_MSG_SIZE_2;
0070 83EF ldi R24,243
0072 80930000 sts _statusMachine,R24
0076 .dbline 48
0076 ; }
0076 68C0 xjmp L13
0078 L12:
0078 .dbline 49
0078 ; else if (statusMachine == ST_MSG_SIZE_2) { /*长度*/
0078 80910000 lds R24,_statusMachine
007C 833F cpi R24,243
007E A9F4 brne L14
0080 .dbline 49
0080 .dbline 50
0080 ; msgSize |= rec_data;
0080 242E mov R2,R20
0082 3324 clr R3
0084 40900000 lds R4,_msgSize
0088 50900100 lds R5,_msgSize+1
008C 4228 or R4,R2
008E 5328 or R5,R3
0090 50920100 sts _msgSize+1,R5
0094 40920000 sts _msgSize,R4
0098 .dbline 51
0098 ; checkSum ^= rec_data;
0098 20900000 lds R2,_checkSum
009C 2426 eor R2,R20
009E 20920000 sts _checkSum,R2
00A2 .dbline 52
00A2 ; statusMachine = ST_GET_TOKEN;
00A2 84EF ldi R24,244
00A4 80930000 sts _statusMachine,R24
00A8 .dbline 53
00A8 ; }
00A8 4FC0 xjmp L15
00AA L14:
00AA .dbline 54
00AA ; else if (statusMachine == ST_GET_TOKEN) { /*关键字*/
00AA 80910000 lds R24,_statusMachine
00AE 843F cpi R24,244
00B0 A9F4 brne L16
00B2 .dbline 54
00B2 .dbline 55
00B2 ; if (rec_data==TOKEN) {
00B2 4E30 cpi R20,14
00B4 79F4 brne L18
00B6 .dbline 55
00B6 .dbline 56
00B6 ; checkSum ^= rec_data;
00B6 20900000 lds R2,_checkSum
00BA 2426 eor R2,R20
00BC 20920000 sts _checkSum,R2
00C0 .dbline 57
00C0 ; statusMachine = ST_GET_DATA;
00C0 85EF ldi R24,245
00C2 80930000 sts _statusMachine,R24
00C6 .dbline 58
00C6 ; msgCounter=0;
00C6 2224 clr R2
00C8 3324 clr R3
00CA 30920100 sts L2+1,R3
00CE 20920000 sts L2,R2
00D2 .dbline 59
00D2 ; }
00D2 3AC0 xjmp L17
00D4 L18:
00D4 .dbline 60
00D4 ; else {
00D4 .dbline 61
00D4 ; statusMachine = ST_START;
00D4 80EF ldi R24,240
00D6 80930000 sts _statusMachine,R24
00DA .dbline 62
00DA ; }
00DA .dbline 63
00DA ; }
00DA 36C0 xjmp L17
00DC L16:
00DC .dbline 64
00DC ; else if (statusMachine == ST_GET_DATA) { /*读取数据*/
00DC 80910000 lds R24,_statusMachine
00E0 853F cpi R24,245
00E2 21F5 brne L20
00E4 .dbline 64
00E4 .dbline 65
00E4 ; msg_buffer[msgCounter++]=rec_data;
00E4 20900000 lds R2,L2
00E8 30900100 lds R3,L2+1
00EC C101 movw R24,R2
00EE 0196 adiw R24,1
00F0 90930100 sts L2+1,R25
00F4 80930000 sts L2,R24
00F8 80E0 ldi R24,<_msg_buffer
00FA 90E0 ldi R25,>_msg_buffer
00FC F101 movw R30,R2
00FE E80F add R30,R24
0100 F91F adc R31,R25
0102 4083 std z+0,R20
0104 .dbline 66
0104 ; checkSum ^= rec_data;
0104 20900000 lds R2,_checkSum
0108 2426 eor R2,R20
010A 20920000 sts _checkSum,R2
010E .dbline 67
010E ; if (msgCounter==msgSize) { /*判断是否完成*/
010E 20900000 lds R2,_msgSize
0112 30900100 lds R3,_msgSize+1
0116 40900000 lds R4,L2
011A 50900100 lds R5,L2+1
011E 4214 cp R4,R2
0120 5304 cpc R5,R3
0122 91F4 brne L21
0124 .dbline 67
0124 .dbline 68
0124 ; statusMachine = ST_GET_CHECK;
0124 86EF ldi R24,246
0126 80930000 sts _statusMachine,R24
012A .dbline 69
012A ; }
012A .dbline 70
012A ; }
012A 0EC0 xjmp L21
012C L20:
012C .dbline 71
012C ; else if (statusMachine == ST_GET_CHECK) { /*数据校验*/
012C 80910000 lds R24,_statusMachine
0130 863F cpi R24,246
0132 51F4 brne L24
0134 .dbline 71
0134 .dbline 72
0134 ; if (rec_data == checkSum) {
0134 20900000 lds R2,_checkSum
0138 4215 cp R20,R2
013A 19F4 brne L26
013C .dbline 72
013C .dbline 73
013C ; packageProcess(seqNumber);
013C 00910000 lds R16,_seqNumber
0140 05D0 xcall _packageProcess
0142 .dbline 74
0142 ; }
0142 L26:
0142 .dbline 75
0142 ; statusMachine = ST_START;
0142 80EF ldi R24,240
0144 80930000 sts _statusMachine,R24
0148 .dbline 76
0148 ; }
0148 L24:
0148 L21:
0148 L17:
0148 L15:
0148 L13:
0148 L11:
0148 L7:
0148 .dbline 77
0148 L4:
0148 .dbline 28
0148 5ECF xjmp L3
014A X0:
014A .dbline -2
014A L1:
014A .dbline 0 ; func end
014A 0895 ret
014C .dbsym r rec_data 20 c
014C .dbend
014C .dbfunc e packageProcess _packageProcess fV
014C ; temp16 -> R10,R11
014C ; start_address -> y+2
014C ; cmd -> R14
014C ; tmp -> y+8
014C ; num_bytes -> y+6
014C ; i -> R12,R13
014C ; seqNum -> y+19
.even
014C _packageProcess::
014C 1A93 st -y,r17
014E 0A93 st -y,r16
0150 0E940000 xcall push_gset5
0154 2997 sbiw R28,9
0156 .dbline -1
0156 .dbline 81
0156 ; }
0156 ; }
0156 ;
0156 ; /*数据包的处理*/
0156 ; void packageProcess(unsigned char seqNum) {
0156 .dbline 83
0156 ; unsigned char cmd;
0156 ; unsigned char tmp = 0;
0156 0024 clr R0
0158 0886 std y+8,R0
015A .dbline 85
015A ; unsigned int i;
015A ; unsigned int num_bytes=0;
015A 1124 clr R1
015C 1F82 std y+7,R1
015E 0E82 std y+6,R0
0160 .dbline 87
0160 ; unsigned int temp16;
0160 ; unsigned long start_address = address;
0160 40900200 lds R4,_address+2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -