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

📄 newmain.lis

📁 单片机MEGA128的BOOTLOADER程序。
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module newmain.c
                        .area data(ram, con, rel)
 0000           _address::
 0000                   .blkb 4
                        .area idata
 0000 00000000          .word 0,0
                        .area data(ram, con, rel)
 0004                   .dbfile E:\cqt\cqt_boot\newmain.c
 0004                   .dbsym e address _address L
                        .area text(rom, con, rel)
 0000                   .dbfile E:\cqt\cqt_boot\newmain.c
 0000                   .dbfunc e delay_us _delay_us fV
 0000           ;           time -> R16,R17
                        .even
 0000           _delay_us::
 0000                   .dbline -1
 0000                   .dbline 30
 0000           ; 
 0000           ; #include <macros.h>
 0000           ; #include <iom128v.h>
 0000           ; #include <eeprom.h>
 0000           ; #include <string.h>
 0000           ; #define SPM_PAGESIZE 256              //M128的一个Flash页为256字节(128字) 
 0000           ; #define DATA_BUFFER_SIZE SPM_PAGESIZE
 0000           ; //定义at45db161 控制I/O 
 0000           ; #define CS     4      //PB4   at45db161 片选
 0000           ; #define BUSY   5      //PB5   at45db161 忙
 0000           ; #define WP     6      //PB6   at45db161 写
 0000           ; #define RESET  7      //PB7   at45db161 复位
 0000           ; 
 0000           ; 
 0000           ; //定义全局变量 
 0000           ; 
 0000           ; char data[DATA_BUFFER_SIZE]; 
 0000           ; unsigned char Senddata[30];
 0000           ; long  Filelength;
 0000           ; long address = 0; 
 0000           ; unsigned int page_counter_rd;
 0000           ; unsigned int page_offset_rd;
 0000           ; 
 0000           ; unsigned char lengthbak1,lengthbak2;
 0000           ; int timenum;
 0000           ; int length;length1;
 0000           ; unsigned char ROK_flag,Num;
 0000           ; //延时
 0000           ; void delay_us(int time)
 0000           ;        {     
 0000           L2:
 0000                   .dbline 32
 0000           ;         do
 0000           ;               {
 0000                   .dbline 33
 0000           ;                time--;
 0000 0150              subi R16,1
 0002 1040              sbci R17,0
 0004                   .dbline 34
 0004           ;               }       
 0004           L3:
 0004                   .dbline 35
 0004           ;         while (time!=0);
 0004 0030              cpi R16,0
 0006 0107              cpc R16,R17
 0008 D9F7              brne L2
 000A           X0:
 000A                   .dbline -2
 000A           L1:
 000A                   .dbline 0 ; func end
 000A 0895              ret
 000C                   .dbsym r time 16 I
 000C                   .dbend
 000C                   .dbfunc e boot_page_ew _boot_page_ew fV
 000C           ;           code -> y+4
 000C           ;      p_address -> y+0
                        .even
 000C           _boot_page_ew::
 000C 0E940000          xcall push_arg4
 0010                   .dbline -1
 0010                   .dbline 41
 0010           ;        }        
 0010           ; 
 0010           ; 
 0010           ; //擦除(code=0x03)和写入(code=0x05)一个Flash页 
 0010           ; void boot_page_ew(long p_address,char code) 
 0010           ; { 
 0010                   .dbline 42
 0010           ;     asm("mov r30,r16\n" 
 0010 E02F              mov r30,r16
 0012 F12F              mov r31,r17
 0014 2BBF              out 0x3b,r18
 0016                   
 0016                   .dbline 45
 0016           ;         "mov r31,r17\n" 
 0016           ;         "out 0x3b,r18\n");            //将页地址放入Z寄存器和RAMPZ的Bit0中 
 0016           ;     SPMCSR = code;                //寄存器SPMCSR中为操作码 
 0016 0C80              ldd R0,y+4
 0018 00926800          sts 104,R0
 001C                   .dbline 46
 001C           ;     asm("spm\n");                    //对指定Flash页进行操作 
 001C E895              spm
 001E                   
 001E                   .dbline -2
 001E           L5:
 001E 2496              adiw R28,4
 0020                   .dbline 0 ; func end
 0020 0895              ret
 0022                   .dbsym l code 4 c
 0022                   .dbsym l p_address 0 L
 0022                   .dbend
 0022                   .dbfunc e boot_page_fill _boot_page_fill fV
 0022           ;           data -> R18,R19
 0022           ;        address -> R16,R17
                        .even
 0022           _boot_page_fill::
 0022                   .dbline -1
 0022                   .dbline 50
 0022           ; }         
 0022           ; //填充Flash缓冲页中的一个字 
 0022           ; void boot_page_fill(unsigned int address,int data) 
 0022           ; { 
 0022                   .dbline 51
 0022           ;     asm("mov r30,r16\n" 
 0022 E02F              mov r30,r16
 0024 F12F              mov r31,r17
 0026 022E              mov r0,r18
 0028 132E              mov r1,r19
 002A                   
 002A                   .dbline 55
 002A           ;         "mov r31,r17\n"             //Z寄存器中为填冲页内地址 
 002A           ;         "mov r0,r18\n" 
 002A           ;         "mov r1,r19\n");            //R0R1中为一个指令字 
 002A           ;     SPMCSR = 0x01; 
 002A 81E0              ldi R24,1
 002C 80936800          sts 104,R24
 0030                   .dbline 56
 0030           ;     asm("spm\n"); 
 0030 E895              spm
 0032                   
 0032                   .dbline -2
 0032           L6:
 0032                   .dbline 0 ; func end
 0032 0895              ret
 0034                   .dbsym r data 18 I
 0034                   .dbsym r address 16 i
 0034                   .dbend
 0034                   .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
                        .even
 0034           _wait_page_rw_ok::
 0034                   .dbline -1
 0034                   .dbline 60
 0034           ; } 
 0034           ; //等待一个Flash页的写完成 
 0034           ; void wait_page_rw_ok(void) 
 0034           ; { 
 0034 08C0              xjmp L9
 0036           X1:
 0036                   .dbline 62
 0036           ;       while(SPMCSR & 0x40) 
 0036           ;      { 
 0036           L11:
 0036                   .dbline 63
 0036           L12:
 0036                   .dbline 63
 0036 20906800          lds R2,104
 003A 20FC              sbrc R2,0
 003C FCCF              rjmp L11
 003E                   .dbline 64
 003E 81E1              ldi R24,17
 0040 80936800          sts 104,R24
 0044                   .dbline 65
 0044 E895              spm
 0046                   
 0046                   .dbline 66
 0046           L9:
 0046                   .dbline 61
 0046 20906800          lds R2,104
 004A 26FC              sbrc R2,6
 004C F4CF              rjmp L12
 004E                   .dbline -2
 004E           L7:
 004E                   .dbline 0 ; func end
 004E 0895              ret
 0050                   .dbend
 0050                   .dbfunc e write_one_page _write_one_page fV
 0050           ;              i -> R20,R21
                        .even
 0050           _write_one_page::
 0050 0E940000          xcall push_gset1
 0054 2197              sbiw R28,1
 0056                   .dbline -1
 0056                   .dbline 70
 0056           ;          while(SPMCSR & 0x01); 
 0056           ;          SPMCSR = 0x11; 
 0056           ;          asm("spm\n"); 
 0056           ;      } 
 0056           ; } 
 0056           ; //更新一个Flash页的完整处理 
 0056           ; void write_one_page(void) 
 0056           ; { 
 0056                   .dbline 72
 0056           ;     int i; 
 0056           ;     boot_page_ew(address,0x03);                    //擦除一个Flash页 
 0056 83E0              ldi R24,3
 0058 8883              std y+0,R24
 005A 20910200          lds R18,_address+2
 005E 30910300          lds R19,_address+2+1
 0062 00910000          lds R16,_address
 0066 10910100          lds R17,_address+1
 006A D0DF              xcall _boot_page_ew
 006C                   .dbline 73
 006C           ;     wait_page_rw_ok();                            //等待擦除完成 
 006C E3DF              xcall _wait_page_rw_ok
 006E                   .dbline 74
 006E           ;     for(i=0;i<SPM_PAGESIZE;i+=2)  //jia
 006E 4427              clr R20
 0070 5527              clr R21
 0072           L15:
 0072                   .dbline 75
 0072                   .dbline 76
 0072 80E0              ldi R24,<_data+1
 0074 90E0              ldi R25,>_data+1
 0076 FA01              movw R30,R20
 0078 E80F              add R30,R24
 007A F91F              adc R31,R25
 007C 2080              ldd R2,z+0
 007E 3324              clr R3
 0080 322C              mov R3,R2
 0082 2224              clr R2
 0084 80E0              ldi R24,<_data
 0086 90E0              ldi R25,>_data
 0088 FA01              movw R30,R20
 008A E80F              add R30,R24
 008C F91F              adc R31,R25
 008E 2081              ldd R18,z+0
 0090 3327              clr R19
 0092 220D              add R18,R2
 0094 331D              adc R19,R3
 0096 8A01              movw R16,R20
 0098 C4DF              xcall _boot_page_fill
 009A                   .dbline 77
 009A           L16:
 009A                   .dbline 74
 009A 4E5F              subi R20,254  ; offset = 2
 009C 5F4F              sbci R21,255
 009E                   .dbline 74
 009E 4030              cpi R20,0
 00A0 E1E0              ldi R30,1
 00A2 5E07              cpc R21,R30
 00A4 34F3              brlt L15
 00A6                   .dbline 78
 00A6           ;         { 
 00A6           ;         boot_page_fill(i, data[i]+(data[i+1]<<8)); 
 00A6           ;     } 
 00A6           ;     boot_page_ew(address,0x05);                    //将缓冲页数据写入一个Flash页 
 00A6 85E0              ldi R24,5
 00A8 8883              std y+0,R24
 00AA 20910200          lds R18,_address+2
 00AE 30910300          lds R19,_address+2+1
 00B2 00910000          lds R16,_address
 00B6 10910100          lds R17,_address+1
 00BA A8DF              xcall _boot_page_ew
 00BC                   .dbline 79
 00BC           ;     wait_page_rw_ok();                            //等待写入完成 
 00BC BBDF              xcall _wait_page_rw_ok
 00BE                   .dbline -2
 00BE           L14:
 00BE 2196              adiw R28,1
 00C0 0E940000          xcall pop_gset1
 00C4                   .dbline 0 ; func end
 00C4 0895              ret
 00C6                   .dbsym r i 20 I
 00C6                   .dbend
 00C6                   .dbfunc e quit _quit fV
                        .even
 00C6           _quit::
 00C6                   .dbline -1
 00C6                   .dbline 84
 00C6           ; }         
 00C6           ; 
 00C6           ; //退出Bootloader程序,从0x0000处执行应用程序 
 00C6           ; void quit(void) 
 00C6           ; {     
 00C6                   .dbline 85
 00C6           ;        MCUCR = 0x01; 
 00C6 81E0              ldi R24,1
 00C8 85BF              out 0x35,R24
 00CA                   .dbline 86
 00CA           ;      MCUCR = 0x00;                    //将中断向量表迁移到应用程序区头部 
 00CA 2224              clr R2
 00CC 25BE              out 0x35,R2
 00CE                   .dbline 87
 00CE           ;      RAMPZ = 0x00;                    //RAMPZ清零初始化 
 00CE 2BBE              out 0x3b,R2
 00D0                   .dbline 88
 00D0           ;      asm("jmp 0x0000\n");                //跳转到Flash的0x0000处,执行用户的应用程序 
 00D0 0C940000          jmp 0x0000
 00D4                   
 00D4                   .dbline -2
 00D4           L20:
 00D4                   .dbline 0 ; func end
 00D4 0895              ret
 00D6                   .dbend
 00D6                   .dbfunc e Init_mag128 _Init_mag128 fV
                        .even
 00D6           _Init_mag128::
 00D6                   .dbline -1
 00D6                   .dbline 92
 00D6           ; } 
 00D6           ; //初始化I/O
 00D6           ; void Init_mag128(void)
 00D6           ; {
 00D6                   .dbline 93
 00D6           ;  PORTA = 0x00;
 00D6 2224              clr R2
 00D8 2BBA              out 0x1b,R2
 00DA                   .dbline 94
 00DA           ;  DDRA  = 0x00;
 00DA 2ABA              out 0x1a,R2
 00DC                   .dbline 95
 00DC           ;  PORTB = 0xd7;
 00DC 87ED              ldi R24,215
 00DE 88BB              out 0x18,R24
 00E0                   .dbline 96
 00E0           ;  DDRB  = 0xd7;
 00E0 87BB              out 0x17,R24
 00E2                   .dbline 97
 00E2           ;  PORTC = 0xff; //m103 output only
 00E2 8FEF              ldi R24,255
 00E4 85BB              out 0x15,R24
 00E6                   .dbline 98
 00E6           ;  DDRC  = 0x00;
 00E6 24BA              out 0x14,R2
 00E8                   .dbline 99
 00E8           ;  PORTD = 0x01;
 00E8 81E0              ldi R24,1
 00EA 82BB              out 0x12,R24
 00EC                   .dbline 100
 00EC           ;  DDRD  = 0xf1;
 00EC 81EF              ldi R24,241

⌨️ 快捷键说明

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