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

📄 atemga128iap.lis

📁 atmega128在线升级程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module ATEMGA128IAP.C
                        .area lit(rom, con, rel)
 0000           _startupString::
 0000 547970652027642720646F776E6C6F61  .byte 'T,'y,'p,'e,32,39,'d,39,32,'d,'o,'w,'n,'l,'o,'a
 0010 642C204F74686572732072756E206170  .byte 'd,44,32,'O,'t,'h,'e,'r,'s,32,'r,'u,'n,32,'a,'p
 0020 702E0A0D0000      .byte 'p,46,10,13,0,0
 0026                   .dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
 0026                   .dbsym e startupString _startupString A[38:38]kc
                        .area data(ram, con, rel)
 0000                   .dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
 0000           _address::
 0000                   .blkb 4
                        .area idata
 0000 00000000          .word 0,0
                        .area data(ram, con, rel)
 0004                   .dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
 0004                   .dbsym e address _address L
                        .area text(rom, con, rel)
 0000                   .dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.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 39
 0004           ; /***************************************************** 
 0004           ; 采用串行接口实现Boot_load应用的实例 
 0004           ; 华东师大电子系 马 潮 2004.07 
 0004           ; Compiler:    ICC-AVR 6.31 
 0004           ; Target:    Mega128 
 0004           ; Crystal:    16Mhz 
 0004           ; Used:        T/C0,USART0 
 0004           ; *****************************************************/ 
 0004           ; #include <iom128v.h> 
 0004           ; #define SPM_PAGESIZE 256              
 0004           ; //M128/的一个Flash页为256字节(128字) 
 0004           ; #define BAUD 38400                
 0004           ; //波特率采用38400bps 
 0004           ; #define CRYSTAL 16000000            
 0004           ; //系统时钟16MHz 
 0004           ; //计算和定义M128的波特率设置参数 
 0004           ; #define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1) 
 0004           ; #define BAUD_H (unsigned char)(BAUD_SETTING>>8) 
 0004           ; #define BAUD_L (unsigned char)BAUD_SETTING 
 0004           ; 
 0004           ; #define DATA_BUFFER_SIZE SPM_PAGESIZE        
 0004           ; //定义接收缓冲区长度 
 0004           ; //定义Xmoden控制字符 
 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           ; const char startupString[]="Type 'd' download, Others run app.\n\r\0"; 
 0004           ; char data[DATA_BUFFER_SIZE]; 
 0004           ; long address = 0; 
 0004           ; //擦除(code=0x03)和写入(code=0x05)一个Flash页 
 0004           ; void boot_page_ew(long p_address,char code) 
 0004           ; { 
 0004                   .dbline 40
 0004           ;     asm("mov r30,r16\n" 
 0004 E02F              mov r30,r16
 0006 F12F              mov r31,r17
 0008 2BBF              out 0x3b,r18
 000A                   
 000A                   .dbline 43
 000A           ;         "mov r31,r17\n" 
 000A           ;         "out 0x3b,r18\n");            //将页地址放入Z寄存器和RAMPZ的Bit0中 
 000A           ;     SPMCSR = code;                //寄存器SPMCSR中为操作码 
 000A 0C80              ldd R0,y+4
 000C 00926800          sts 104,R0
 0010                   .dbline 44
 0010           ;     asm("spm\n");                    //对指定Flash页进行操作 
 0010 E895              spm
 0012                   
 0012                   .dbline -2
 0012                   .dbline 45
 0012           ; }         
 0012           L1:
 0012 2496              adiw R28,4
 0014                   .dbline 0 ; func end
 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 -> R18,R19
 0016           ;        address -> R16,R17
                        .even
 0016           _boot_page_fill::
 0016                   .dbline -1
 0016                   .dbline 48
 0016           ; //填充Flash缓冲页中的一个字 
 0016           ; void boot_page_fill(unsigned int address,int data) 
 0016           ; { 
 0016                   .dbline 49
 0016           ;     asm("mov r30,r16\n" 
 0016 E02F              mov r30,r16
 0018 F12F              mov r31,r17
 001A 022E              mov r0,r18
 001C 132E              mov r1,r19
 001E                   
 001E                   .dbline 53
 001E           ;         "mov r31,r17\n"             //Z/寄存器中为填冲页内地址 
 001E           ;         "mov r0,r18\n" 
 001E           ;         "mov r1,r19\n");            //R0R1/中为一个指令字 
 001E           ;     SPMCSR = 0x01; 
 001E 81E0              ldi R24,1
 0020 80936800          sts 104,R24
 0024                   .dbline 54
 0024           ;     asm("spm\n"); 
 0024 E895              spm
 0026                   
 0026                   .dbline -2
 0026                   .dbline 55
 0026           ; } 
 0026           L2:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbsym r data 18 I
 0028                   .dbsym r address 16 i
 0028                   .dbend
 0028                   .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
                        .even
 0028           _wait_page_rw_ok::
 0028                   .dbline -1
 0028                   .dbline 58
 0028           ; //等待一个Flash页的写完成 
 0028           ; void wait_page_rw_ok(void) 
 0028           ; { 
 0028 08C0              xjmp L5
 002A           X0:
 002A                   .dbline 60
 002A           ;       while(SPMCSR & 0x40) 
 002A           ;      { 
 002A           L7:
 002A                   .dbline 61
 002A           L8:
 002A                   .dbline 61
 002A 20906800          lds R2,104
 002E 20FC              sbrc R2,0
 0030 FCCF              rjmp L7
 0032                   .dbline 62
 0032 81E1              ldi R24,17
 0034 80936800          sts 104,R24
 0038                   .dbline 63
 0038 E895              spm
 003A                   
 003A                   .dbline 64
 003A           L5:
 003A                   .dbline 59
 003A 20906800          lds R2,104
 003E 26FC              sbrc R2,6
 0040 F4CF              rjmp L8
 0042                   .dbline -2
 0042                   .dbline 65
 0042           ;          while(SPMCSR & 0x01); 
 0042           ;          SPMCSR = 0x11; 
 0042           ;          asm("spm\n"); 
 0042           ;      } 
 0042           ; } 
 0042           L3:
 0042                   .dbline 0 ; func end
 0042 0895              ret
 0044                   .dbend
 0044                   .dbfunc e write_one_page _write_one_page fV
 0044           ;              i -> R20,R21
                        .even
 0044           _write_one_page::
 0044 0E940000          xcall push_gset1
 0048 2197              sbiw R28,1
 004A                   .dbline -1
 004A                   .dbline 68
 004A           ; //更新一个Flash页的完整处理 
 004A           ; void write_one_page(void) 
 004A           ; { 
 004A                   .dbline 70
 004A           ;     int i; 
 004A           ;     boot_page_ew(address,0x03);                    //擦除一个Flash页 
 004A 83E0              ldi R24,3
 004C 8883              std y+0,R24
 004E 20910200          lds R18,_address+2
 0052 30910300          lds R19,_address+2+1
 0056 00910000          lds R16,_address
 005A 10910100          lds R17,_address+1
 005E D0DF              xcall _boot_page_ew
 0060                   .dbline 71
 0060           ;     wait_page_rw_ok();                            //等待擦除完成 
 0060 E3DF              xcall _wait_page_rw_ok
 0062                   .dbline 72
 0062           ;     for(i=0;i<SPM_PAGESIZE;i+=2)                //将数据填入Flash缓冲页中 
 0062 4427              clr R20
 0064 5527              clr R21
 0066           L11:
 0066                   .dbline 73
 0066                   .dbline 74
 0066 80E0              ldi R24,<_data+1
 0068 90E0              ldi R25,>_data+1
 006A FA01              movw R30,R20
 006C E80F              add R30,R24
 006E F91F              adc R31,R25
 0070 2080              ldd R2,z+0
 0072 3324              clr R3
 0074 322C              mov R3,R2
 0076 2224              clr R2
 0078 80E0              ldi R24,<_data
 007A 90E0              ldi R25,>_data
 007C FA01              movw R30,R20
 007E E80F              add R30,R24
 0080 F91F              adc R31,R25
 0082 2081              ldd R18,z+0
 0084 3327              clr R19
 0086 220D              add R18,R2
 0088 331D              adc R19,R3
 008A 8A01              movw R16,R20
 008C C4DF              xcall _boot_page_fill
 008E                   .dbline 75
 008E           L12:
 008E                   .dbline 72
 008E 4E5F              subi R20,254  ; offset = 2
 0090 5F4F              sbci R21,255
 0092                   .dbline 72
 0092 4030              cpi R20,0
 0094 E1E0              ldi R30,1
 0096 5E07              cpc R21,R30
 0098 34F3              brlt L11
 009A                   .dbline 76
 009A           ;     { 
 009A           ;         boot_page_fill(i, data[i]+(data[i+1]<<8)); 
 009A           ;     } 
 009A           ;     boot_page_ew(address,0x05);                    //将缓冲页数据写入一个Flash页 
 009A 85E0              ldi R24,5
 009C 8883              std y+0,R24
 009E 20910200          lds R18,_address+2
 00A2 30910300          lds R19,_address+2+1
 00A6 00910000          lds R16,_address
 00AA 10910100          lds R17,_address+1
 00AE A8DF              xcall _boot_page_ew
 00B0                   .dbline 77
 00B0           ;     wait_page_rw_ok();                            //等待写入完成 
 00B0 BBDF              xcall _wait_page_rw_ok
 00B2                   .dbline -2
 00B2                   .dbline 78
 00B2           ; }         
 00B2           L10:
 00B2 2196              adiw R28,1
 00B4 0E940000          xcall pop_gset1
 00B8                   .dbline 0 ; func end
 00B8 0895              ret
 00BA                   .dbsym r i 20 I
 00BA                   .dbend
 00BA                   .dbfunc e uart_putchar _uart_putchar fV
 00BA           ;              c -> R16
                        .even
 00BA           _uart_putchar::
 00BA                   .dbline -1
 00BA                   .dbline 81
 00BA           ; //从RS232发送一个字节 
 00BA           ; void uart_putchar(char c) 
 00BA           ; { 
 00BA           L17:
 00BA                   .dbline 82
 00BA           L18:
 00BA                   .dbline 82
 00BA           ;     while(!(UCSR0A & 0x20)); 
 00BA 5D9B              sbis 0xb,5
 00BC FECF              rjmp L17
 00BE                   .dbline 83
 00BE           ;     UDR0 = c; 
 00BE 0CB9              out 0xc,R16
 00C0                   .dbline -2
 00C0                   .dbline 84
 00C0           ; } 
 00C0           L16:
 00C0                   .dbline 0 ; func end
 00C0 0895              ret
 00C2                   .dbsym r c 16 c
 00C2                   .dbend
 00C2                   .dbfunc e uart_getchar _uart_getchar fI
 00C2           ;            res -> R16
 00C2           ;         status -> R18
                        .even
 00C2           _uart_getchar::
 00C2                   .dbline -1
 00C2                   .dbline 87
 00C2           ; //从RS232接收一个字节 
 00C2           ; int uart_getchar(void) 
 00C2           ; { 
 00C2                   .dbline 89
 00C2           ;     unsigned char status,res; 
 00C2           ;     if(!(UCSR0A & 0x80)) return -1;        //no/ data to be received 
 00C2 5F99              sbic 0xb,7
 00C4 03C0              rjmp L21
 00C6                   .dbline 89
 00C6 0FEF              ldi R16,-1
 00C8 1FEF              ldi R17,-1
 00CA 09C0              xjmp L20

⌨️ 快捷键说明

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