📄 avr-bootloader.lis
字号:
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 + -