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

📄 avr-bootloader.lis

📁 ATMEG128在线升级程序,运行稳定可靠
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 00F8           ; {
 00F8                   .dbline 87
 00F8           ;       unsigned char status,res;
 00F8           ;       if(!(UCSR0A&0x80)) return -1;
 00F8 5F99              sbic 0xb,7
 00FA 03C0              rjmp L21
 00FC           X4:
 00FC                   .dbline 87
 00FC 0FEF              ldi R16,-1
 00FE 1FEF              ldi R17,-1
 0100 09C0              xjmp L20
 0102           L21:
 0102                   .dbline 88
 0102           ;       status=UCSR0A;
 0102 2BB1              in R18,0xb
 0104                   .dbline 89
 0104           ;       res=UDR0;
 0104 0CB1              in R16,0xc
 0106                   .dbline 90
 0106           ;       res=res;
 0106                   .dbline 91
 0106           ;       if(status&0x1c) return -1;
 0106 822F              mov R24,R18
 0108 8C71              andi R24,28
 010A 19F0              breq L23
 010C           X5:
 010C                   .dbline 91
 010C 0FEF              ldi R16,-1
 010E 1FEF              ldi R17,-1
 0110 01C0              xjmp L20
 0112           L23:
 0112                   .dbline 92
 0112           ;       return res;
 0112 1127              clr R17
 0114                   .dbline -2
 0114           L20:
 0114                   .dbline 0 ; func end
 0114 0895              ret
 0116                   .dbsym r status 18 c
 0116                   .dbsym r res 16 c
 0116                   .dbend
 0116                   .dbfunc e uart_waitchar _uart_waitchar fc
 0116           ;              c -> R10,R11
                        .even
 0116           _uart_waitchar::
 0116 AA92              st -y,R10
 0118 BA92              st -y,R11
 011A                   .dbline -1
 011A                   .dbline 96
 011A           ; }
 011A           ; //等待从RS232接收1个有效字节
 011A           ; char uart_waitchar(void)
 011A           ; {
 011A           L26:
 011A                   .dbline 98
 011A           ;       int c;
 011A           ;       while((c=uart_getchar())==-1);
 011A           L27:
 011A                   .dbline 98
 011A EEDF              xcall _uart_getchar
 011C 5801              movw R10,R16
 011E 0F3F              cpi R16,255
 0120 EFEF              ldi R30,255
 0122 1E07              cpc R17,R30
 0124 D1F3              breq L26
 0126           X6:
 0126                   .dbline 99
 0126           ;       return (char)c;
 0126                   .dbline -2
 0126           L25:
 0126                   .dbline 0 ; func end
 0126 B990              ld R11,y+
 0128 A990              ld R10,y+
 012A 0895              ret
 012C                   .dbsym r c 10 I
 012C                   .dbend
 012C                   .dbfunc e calcrc _calcrc fI
 012C           ;              i -> R20
 012C           ;            crc -> R10,R11
 012C           ;          count -> R18,R19
 012C           ;            ptr -> R16,R17
                        .even
 012C           _calcrc::
 012C 0E940000          xcall push_xgset300C
 0130                   .dbline -1
 0130                   .dbline 103
 0130           ; }
 0130           ; //计算CRC
 0130           ; int calcrc(char *ptr,int count)
 0130           ; {
 0130                   .dbline 104
 0130           ;       int crc=0;
 0130 AA24              clr R10
 0132 BB24              clr R11
 0134 1BC0              xjmp L31
 0136           L30:
 0136                   .dbline 107
 0136           ;       char i;
 0136           ;       while(--count>=0)
 0136           ;       {
 0136                   .dbline 108
 0136           ;               crc=crc^(int)*ptr++<<8;
 0136 F801              movw R30,R16
 0138 2190              ld R2,Z+
 013A 8F01              movw R16,R30
 013C 3324              clr R3
 013E 322C              mov R3,R2
 0140 2224              clr R2
 0142 A224              eor R10,R2
 0144 B324              eor R11,R3
 0146                   .dbline 109
 0146           ;               i=8;
 0146 48E0              ldi R20,8
 0148           L33:
 0148                   .dbline 111
 0148           ;               do
 0148           ;               {
 0148                   .dbline 112
 0148           ;                       if(crc&0x8000)
 0148 B7FE              sbrs R11,7
 014A 09C0              rjmp L36
 014C           X7:
 014C                   .dbline 113
 014C           ;                               crc=crc<<1^0x1021;
 014C 81E2              ldi R24,4129
 014E 90E1              ldi R25,16
 0150 1501              movw R2,R10
 0152 220C              lsl R2
 0154 331C              rol R3
 0156 2826              eor R2,R24
 0158 3926              eor R3,R25
 015A 5101              movw R10,R2
 015C 02C0              xjmp L37
 015E           L36:
 015E                   .dbline 115
 015E           ;                       else
 015E           ;                               crc=crc<<1;
 015E AA0C              lsl R10
 0160 BB1C              rol R11
 0162           L37:
 0162                   .dbline 116
 0162           ;               }
 0162           L34:
 0162                   .dbline 117
 0162           ;               while(--i);
 0162 842F              mov R24,R20
 0164 8150              subi R24,1
 0166 482F              mov R20,R24
 0168 4423              tst R20
 016A 71F7              brne L33
 016C           X8:
 016C                   .dbline 118
 016C           ;       }
 016C           L31:
 016C                   .dbline 106
 016C C901              movw R24,R18
 016E 0197              sbiw R24,1
 0170 9C01              movw R18,R24
 0172 2030              cpi R18,0
 0174 E0E0              ldi R30,0
 0176 3E07              cpc R19,R30
 0178 F4F6              brge L30
 017A           X9:
 017A                   .dbline 119
 017A           ;       return (crc);
 017A 8501              movw R16,R10
 017C                   .dbline -2
 017C           L29:
 017C                   .dbline 0 ; func end
 017C 0C940000          xjmp pop_xgset300C
 0180                   .dbsym r i 20 c
 0180                   .dbsym r crc 10 I
 0180                   .dbsym r count 18 I
 0180                   .dbsym r ptr 16 pc
 0180                   .dbend
 0180                   .dbfunc e quit _quit fV
                        .even
 0180           _quit::
 0180                   .dbline -1
 0180                   .dbline 123
 0180           ; }
 0180           ; //退出Bootloader程序,从0x0000处执行应用程序
 0180           ; void quit(void)
 0180           ; {
 0180                   .dbline 124
 0180           ;       uart_putchar('O');uart_putchar('K');uart_putchar('?');
 0180 0FE4              ldi R16,79
 0182 B6DF              xcall _uart_putchar
 0184                   .dbline 124
 0184 0BE4              ldi R16,75
 0186 B4DF              xcall _uart_putchar
 0188                   .dbline 124
 0188 0FE3              ldi R16,63
 018A B2DF              xcall _uart_putchar
 018C                   .dbline 125
 018C           ;       uart_putchar(0x0d);uart_putchar(0x0a);
 018C 0DE0              ldi R16,13
 018E B0DF              xcall _uart_putchar
 0190                   .dbline 125
 0190 0AE0              ldi R16,10
 0192 AEDF              xcall _uart_putchar
 0194           L39:
 0194                   .dbline 126
 0194           ;       while(!(UCSR0A&0x20));
 0194           L40:
 0194                   .dbline 126
 0194 5D9B              sbis 0xb,5
 0196 FECF              rjmp L39
 0198           X10:
 0198                   .dbline 127
 0198           ;       MCUCR=0x01;
 0198 81E0              ldi R24,1
 019A 85BF              out 0x35,R24
 019C                   .dbline 128
 019C           ;       MCUCR=0x00;
 019C 2224              clr R2
 019E 25BE              out 0x35,R2
 01A0                   .dbline 129
 01A0           ;       RAMPZ=0x00;
 01A0 2BBE              out 0x3b,R2
 01A2                   .dbline 130
 01A2           ;       asm("jmp 0x0000\n");
 01A2 0C940000          jmp 0x0000
 01A6                   
 01A6                   .dbline -2
 01A6           L38:
 01A6                   .dbline 0 ; func end
 01A6 0895              ret
 01A8                   .dbend
 01A8                   .dbfunc e main _main fV
 01A8           ;     timercount -> R12
 01A8           ;            crc -> R10,R11
 01A8           ;         packNO -> R22
 01A8           ;              i -> R10,R11
 01A8           ;    bufferPoint -> R20,R21
                        .even
 01A8           _main::
 01A8                   .dbline -1
 01A8                   .dbline 135
 01A8           ;  }
 01A8           ; 
 01A8           ;  //主程序
 01A8           ;  void main(void)
 01A8           ;  {
 01A8                   .dbline 136
 01A8           ;       int i=0;
 01A8 AA24              clr R10
 01AA BB24              clr R11
 01AC                   .dbline 137
 01AC           ;       unsigned char timercount=0;
 01AC CC24              clr R12
 01AE                   .dbline 138
 01AE           ;       unsigned char packNO=1;
 01AE 61E0              ldi R22,1
 01B0                   .dbline 139
 01B0           ;       int bufferPoint=0;
 01B0 4427              clr R20
 01B2 5527              clr R21
 01B4                   .dbline 142
 01B4           ;       unsigned int crc;
 01B4           ;       //初始化M128的USART0
 01B4           ;       UBRR0H=BAUD_H; 
 01B4 2224              clr R2
 01B6 20929000          sts 144,R2
 01BA                   .dbline 143
 01BA           ;       UBRR0L=BAUD_L;
 01BA 87E1              ldi R24,23
 01BC 89B9              out 0x9,R24
 01BE                   .dbline 144
 01BE           ;       UCSR0B=0x18;
 01BE 88E1              ldi R24,24
 01C0 8AB9              out 0xa,R24
 01C2                   .dbline 145
 01C2           ;       UCSR0C=0x0E;  
 01C2 8EE0              ldi R24,14
 01C4 80939500          sts 149,R24
 01C8                   .dbline 146
 01C8           ;       OCR0=0xEA;
 01C8 8AEE              ldi R24,234
 01CA 81BF              out 0x31,R24
 01CC                   .dbline 148
 01CC           ;       //////////
 01CC           ;       MCUCR = 0x00;
 01CC 25BE              out 0x35,R2
 01CE                   .dbline 149
 01CE           ;       EICRA = 0x00; //extended ext ints
 01CE 20926A00          sts 106,R2
 01D2                   .dbline 150
 01D2           ;       EICRB = 0x00; //extended ext ints
 01D2 2ABE              out 0x3a,R2
 01D4                   .dbline 151
 01D4           ;       EIMSK = 0x00;
 01D4 29BE              out 0x39,R2
 01D6                   .dbline 152
 01D6           ;       TIMSK = 0x00; //timer interrupt sources
 01D6 27BE              out 0x37,R2
 01D8                   .dbline 153
 01D8           ;       ETIMSK = 0x00; //extended timer interrupt sources
 01D8 20927D00          sts 125,R2
 01DC                   .dbline 155
 01DC           ; 
 01DC           ;       TCCR0 = 0x00; //stop
 01DC 23BE              out 0x33,R2
 01DE                   .dbline 156
 01DE           ;       ASSR  = 0x00; //set async mode
 01DE 20BE              out 0x30,R2
 01E0                   .dbline 157
 01E0           ;       TCNT0 = 0x29; //set count
 01E0 89E2              ldi R24,41
 01E2 82BF              out 0x32,R24
 01E4                   .dbline 158
 01E4           ;       OCR0  = 0xD7;
 01E4 87ED              ldi R24,215
 01E6 81BF              out 0x31,R24
 01E8 0AC0              xjmp L44
 01EA           L43:
 01EA                   .dbline 162
 01EA           ;       //TCCR0 = 0x07; //start timer
 01EA           ;       /////////// 
 01EA           ;       while(startupString[i]!='\0')
 01EA           ;       {
 01EA                   .dbline 163
 01EA           ;               uart_putchar(startupString[i]);
 01EA 80E0              ldi R24,<_startupString
 01EC 90E0              ldi R25,>_startupString
 01EE F501              movw R30,R10
 01F0 E80F              add R30,R24
 01F2 F91F              adc R31,R25
 01F4 0691              elpm R16,Z
 01F6 7CDF              xcall _uart_putchar
 01F8                   .dbline 164
 01F8           ;               i++;
 01F8 C501              movw R24,R10
 01FA 0196              adiw R24,1
 01FC 5C01              movw R10,R24
 01FE                   .dbline 165
 01FE           ;       }  
 01FE           L44:
 01FE                   .dbline 161

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -