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