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

📄 avr-bootloader.lis

📁 ATMEG128在线升级程序,运行稳定可靠
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module AVR-Bootloader.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
                        .area lit(rom, con, rel)
 0000           _startupString::
 0000 506C6561736520707265737320276427  .byte 'P,'l,'e,'a,'s,'e,32,'p,'r,'e,'s,'s,32,39,'d,39
 0010 20746F20626F6F746C6F616465722077  .byte 32,'t,'o,32,'b,'o,'o,'t,'l,'o,'a,'d,'e,'r,32,'w
 0020 697468696E2033207365636F6E647321  .byte 'i,'t,'h,'i,'n,32,51,32,'s,'e,'c,'o,'n,'d,'s,33
 0030 5B456E63727970746564215D0A0D0000  .byte 91,'E,'n,'c,'r,'y,'p,'t,'e,'d,33,93,10,13,0,0
 0040                   .dbsym e startupString _startupString A[64:64]kc
                        .area data(ram, con, rel)
 0000                   .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
 0000           _address::
 0000                   .blkb 4
                        .area idata
 0000 00000000          .word 0,0
                        .area data(ram, con, rel)
 0004                   .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
 0004                   .dbsym e address _address L
                        .area text(rom, con, rel)
 0000                   .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
 0000                   .dbfunc e boot_page_ew _boot_page_ew fV
 0000           ;           code -> y+4
 0000           ;      p_address -> y+0
                        .even
 0000           _boot_page_ew::
 0000 0E940000          xcall push_arg4
 0004                   .dbline -1
 0004                   .dbline 27
 0004           ; #include <iom128v.h>
 0004           ; #define SPM_PAGESIZE 256
 0004           ; 
 0004           ; #define BAUD_H 0x00
 0004           ; #define BAUD_L 0x17
 0004           ; #define DATA_BUFFER_SIZE SPM_PAGESIZE
 0004           ; 
 0004           ; //定义Xmodem控制字符
 0004           ; #define XMODEM_NUL 0x00
 0004           ; #define XMODEM_SOH 0x01
 0004           ; #define XMODEM_STX 0x02
 0004           ; #define XMODEM_EOT 0x04
 0004           ; #define XMODEM_ACK 0x06
 0004           ; #define XMODEM_NAK 0x15
 0004           ; #define XMODEM_CAN 0x18
 0004           ; #define XMODEM_EOF 0x1A
 0004           ; #define XMODEM_RECIEVING_WAIT_CHAR 'C'
 0004           ; 
 0004           ; //定义全局变量
 0004           ; //const char startupString[]="Type 'd' download,Others run app.\n\r\0";
 0004           ; const char startupString[]="Please press 'd' to bootloader within 3 seconds![Encrypted!]\n\r\0";
 0004           ; char data[DATA_BUFFER_SIZE];
 0004           ; long address=0;
 0004           ; 
 0004           ; //擦除(code==0x03)和写入(code==0x05)一个Flash页
 0004           ; void boot_page_ew(long p_address,char code)
 0004           ; {
 0004                   .dbline 28
 0004           ;  asm("mov r30,r16\n"
 0004 E02F              mov r30,r16
 0006 F12F              mov r31,r17
 0008 2BBF              out 0x3b,r18
 000A                   
 000A                   .dbline 31
 000A           ;      "mov r31,r17\n"
 000A           ;        "out 0x3b,r18\n");
 000A           ;  SPMCSR=code;
 000A 0C80              ldd R0,y+4
 000C 00926800          sts 104,R0
 0010                   .dbline 32
 0010           ;  asm("spm\n");
 0010 E895              spm
 0012                   
 0012                   .dbline -2
 0012           L1:
 0012                   .dbline 0 ; func end
 0012 2496              adiw R28,4
 0014 0895              ret
 0016                   .dbsym l code 4 c
 0016                   .dbsym l p_address 0 L
 0016                   .dbend
 0016                   .dbfunc e boot_page_fill _boot_page_fill fV
 0016           ;           data -> <dead>
 0016           ;        address -> <dead>
                        .even
 0016           _boot_page_fill::
 0016 0E940000          xcall push_arg4
 001A                   .dbline -1
 001A                   .dbline 36
 001A           ; }
 001A           ; //填充Flash缓冲页中的一个字
 001A           ; void boot_page_fill(unsigned int address,int data)
 001A           ; {
 001A                   .dbline 37
 001A           ;  asm("mov r30,r16\n"
 001A E02F              mov r30,r16
 001C F12F              mov r31,r17
 001E 022E              mov r0,r18
 0020 132E              mov r1,r19
 0022                   
 0022                   .dbline 41
 0022           ;      "mov r31,r17\n"
 0022           ;        "mov r0,r18\n"
 0022           ;        "mov r1,r19\n");
 0022           ;  SPMCSR=0x01;
 0022 81E0              ldi R24,1
 0024 80936800          sts 104,R24
 0028                   .dbline 42
 0028           ;  asm("spm\n");
 0028 E895              spm
 002A                   
 002A                   .dbline -2
 002A           L2:
 002A                   .dbline 0 ; func end
 002A 2496              adiw R28,4
 002C 0895              ret
 002E                   .dbsym l data 2 I
 002E                   .dbsym l address 0 i
 002E                   .dbend
 002E                   .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
                        .even
 002E           _wait_page_rw_ok::
 002E                   .dbline -1
 002E                   .dbline 46
 002E           ; }
 002E           ; //等待一个Flash页的写完成
 002E           ; void wait_page_rw_ok(void)
 002E           ; {
 002E 08C0              xjmp L5
 0030           L7:
 0030                   .dbline 49
 0030           ;       while(SPMCSR&0x40)
 0030           ;       {
 0030           ;               while(SPMCSR&0x01);
 0030           L8:
 0030                   .dbline 49
 0030 20906800          lds R2,104
 0034 20FC              sbrc R2,0
 0036 FCCF              rjmp L7
 0038           X0:
 0038                   .dbline 50
 0038           ;               SPMCSR=0x11;
 0038 81E1              ldi R24,17
 003A 80936800          sts 104,R24
 003E                   .dbline 51
 003E           ;               asm("spm\n");
 003E E895              spm
 0040                   
 0040                   .dbline 52
 0040           ;       }
 0040           L5:
 0040                   .dbline 47
 0040 20906800          lds R2,104
 0044 26FC              sbrc R2,6
 0046 F4CF              rjmp L8
 0048           X1:
 0048                   .dbline -2
 0048           L3:
 0048                   .dbline 0 ; func end
 0048 0895              ret
 004A                   .dbend
 004A                   .dbfunc e de_encryptdata _de_encryptdata fc
 004A           ;        tmpchrL -> R10
 004A           ;        tmpchrH -> R22
 004A           ;            chr -> R20
 004A           ;              i -> R16
                        .even
 004A           _de_encryptdata::
 004A 0E940000          xcall push_xgsetF00C
 004E                   .dbline -1
 004E                   .dbline 56
 004E           ; }
 004E           ; ///对BIN文件的数据进行解密
 004E           ; char de_encryptdata(char i)
 004E           ; {     
 004E                   .dbline 58
 004E           ;       char chr,tmpchrH,tmpchrL;
 004E           ;       chr=data[i];
 004E 80E0              ldi R24,<_data
 0050 90E0              ldi R25,>_data
 0052 E02F              mov R30,R16
 0054 FF27              clr R31
 0056 E80F              add R30,R24
 0058 F91F              adc R31,R25
 005A 4081              ldd R20,z+0
 005C                   .dbline 59
 005C           ;       tmpchrH=0xf0&chr;
 005C 642F              mov R22,R20
 005E 607F              andi R22,240
 0060                   .dbline 60
 0060           ;       tmpchrL=0x0f&chr;
 0060 842F              mov R24,R20
 0062 8F70              andi R24,15
 0064 A82E              mov R10,R24
 0066                   .dbline 61
 0066           ;       chr=tmpchrH/16+tmpchrL*16;
 0066 80E1              ldi R24,16
 0068 8A9D              mul R24,R10
 006A 462F              mov R20,R22
 006C 4295              swap R20
 006E 4F70              andi R20,#0x0F
 0070 400D              add R20,R0
 0072                   .dbline 62
 0072           ;       return (0xff-0x86^chr);         
 0072 89E7              ldi R24,121
 0074 042F              mov R16,R20
 0076 0827              eor R16,R24
 0078                   .dbline -2
 0078           L10:
 0078                   .dbline 0 ; func end
 0078 0C940000          xjmp pop_xgsetF00C
 007C                   .dbsym r tmpchrL 10 c
 007C                   .dbsym r tmpchrH 22 c
 007C                   .dbsym r chr 20 c
 007C                   .dbsym r i 16 c
 007C                   .dbend
 007C                   .dbfunc e write_one_page _write_one_page fV
 007C           ;              i -> R20,R21
                        .even
 007C           _write_one_page::
 007C 4A93              st -y,R20
 007E 5A93              st -y,R21
 0080 2197              sbiw R28,1
 0082                   .dbline -1
 0082                   .dbline 66
 0082           ; }
 0082           ; //更新一个Flash页的完整处理
 0082           ; void write_one_page(void)
 0082           ; {
 0082                   .dbline 68
 0082           ;       int i;
 0082           ;       boot_page_ew(address,0x03);
 0082 83E0              ldi R24,3
 0084 8883              std y+0,R24
 0086 20910200          lds R18,_address+2
 008A 30910300          lds R19,_address+2+1
 008E 00910000          lds R16,_address
 0092 10910100          lds R17,_address+1
 0096 B4DF              xcall _boot_page_ew
 0098                   .dbline 69
 0098           ;       wait_page_rw_ok();
 0098 CADF              xcall _wait_page_rw_ok
 009A                   .dbline 70
 009A           ;       for(i=0;i<SPM_PAGESIZE;i+=2)
 009A 4427              clr R20
 009C 5527              clr R21
 009E           L12:
 009E                   .dbline 71
 009E           ;       {
 009E                   .dbline 72
 009E           ;               boot_page_fill(i,de_encryptdata(i)+(de_encryptdata(i+1)<<8));
 009E 042F              mov R16,R20
 00A0 D4DF              xcall _de_encryptdata
 00A2 402E              mov R4,R16
 00A4 042F              mov R16,R20
 00A6 0F5F              subi R16,255  ; offset = 1
 00A8 1F4F              sbci R17,255
 00AA 4F92              push R4
 00AC CEDF              xcall _de_encryptdata
 00AE 4F90              pop R4
 00B0 202E              mov R2,R16
 00B2 3324              clr R3
 00B4 322C              mov R3,R2
 00B6 2224              clr R2
 00B8 242D              mov R18,R4
 00BA 3327              clr R19
 00BC 220D              add R18,R2
 00BE 331D              adc R19,R3
 00C0 8A01              movw R16,R20
 00C2 A9DF              xcall _boot_page_fill
 00C4                   .dbline 73
 00C4           ;       } 
 00C4           L13:
 00C4                   .dbline 70
 00C4 4E5F              subi R20,254  ; offset = 2
 00C6 5F4F              sbci R21,255
 00C8                   .dbline 70
 00C8 4030              cpi R20,0
 00CA E1E0              ldi R30,1
 00CC 5E07              cpc R21,R30
 00CE 3CF3              brlt L12
 00D0           X2:
 00D0                   .dbline 74
 00D0           ;       boot_page_ew(address,0x05);
 00D0 85E0              ldi R24,5
 00D2 8883              std y+0,R24
 00D4 20910200          lds R18,_address+2
 00D8 30910300          lds R19,_address+2+1
 00DC 00910000          lds R16,_address
 00E0 10910100          lds R17,_address+1
 00E4 8DDF              xcall _boot_page_ew
 00E6                   .dbline 75
 00E6           ;       wait_page_rw_ok();
 00E6 A3DF              xcall _wait_page_rw_ok
 00E8                   .dbline -2
 00E8           L11:
 00E8                   .dbline 0 ; func end
 00E8 2196              adiw R28,1
 00EA 5991              ld R21,y+
 00EC 4991              ld R20,y+
 00EE 0895              ret
 00F0                   .dbsym r i 20 I
 00F0                   .dbend
 00F0                   .dbfunc e uart_putchar _uart_putchar fV
 00F0           ;              c -> R16
                        .even
 00F0           _uart_putchar::
 00F0                   .dbline -1
 00F0                   .dbline 79
 00F0           ; }
 00F0           ; //从RS232发送1个字节
 00F0           ; void uart_putchar(char c)
 00F0           ; {
 00F0           L17:
 00F0                   .dbline 80
 00F0           ;       while(!(UCSR0A&0x20));
 00F0           L18:
 00F0                   .dbline 80
 00F0 5D9B              sbis 0xb,5
 00F2 FECF              rjmp L17
 00F4           X3:
 00F4                   .dbline 81
 00F4           ;       UDR0=c;
 00F4 0CB9              out 0xc,R16
 00F6                   .dbline -2
 00F6           L16:
 00F6                   .dbline 0 ; func end
 00F6 0895              ret
 00F8                   .dbsym r c 16 c
 00F8                   .dbend
 00F8                   .dbfunc e uart_getchar _uart_getchar fI
 00F8           ;         status -> R18
 00F8           ;            res -> R16
                        .even
 00F8           _uart_getchar::
 00F8                   .dbline -1
 00F8                   .dbline 85
 00F8           ; }
 00F8           ; //从RS232接收1个字节
 00F8           ; int uart_getchar(void)

⌨️ 快捷键说明

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