⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lis

📁 ATEMEL AVR128 BOOT程序
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .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 + -