📄 atemga128iap.s
字号:
.module ATEMGA128IAP.C
.area lit(rom, con, rel)
_startupString::
.byte 'T,'y,'p,'e,32,39,'d,39,32,'d,'o,'w,'n,'l,'o,'a
.byte 'd,44,32,'O,'t,'h,'e,'r,'s,32,'r,'u,'n,32,'a,'p
.byte 'p,46,10,13,0,0
.dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
.dbsym e startupString _startupString A[38:38]kc
.area data(ram, con, rel)
.dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
_address::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
.dbsym e address _address L
.area text(rom, con, rel)
.dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
.dbfunc e boot_page_ew _boot_page_ew fV
; code -> y+4
; p_address -> y+0
.even
_boot_page_ew::
xcall push_arg4
.dbline -1
.dbline 39
; /*****************************************************
; 采用串行接口实现Boot_load应用的实例
; 华东师大电子系 马 潮 2004.07
; Compiler: ICC-AVR 6.31
; Target: Mega128
; Crystal: 16Mhz
; Used: T/C0,USART0
; *****************************************************/
; #include <iom128v.h>
; #define SPM_PAGESIZE 256
; //M128/的一个Flash页为256字节(128字)
; #define BAUD 38400
; //波特率采用38400bps
; #define CRYSTAL 16000000
; //系统时钟16MHz
; //计算和定义M128的波特率设置参数
; #define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
; #define BAUD_H (unsigned char)(BAUD_SETTING>>8)
; #define BAUD_L (unsigned char)BAUD_SETTING
;
; #define DATA_BUFFER_SIZE SPM_PAGESIZE
; //定义接收缓冲区长度
; //定义Xmoden控制字符
; #define XMODEM_NUL 0x00
; #define XMODEM_SOH 0x01
; #define XMODEM_STX 0x02
; #define XMODEM_EOT 0x04
; #define XMODEM_ACK 0x06
; #define XMODEM_NAK 0x15
; #define XMODEM_CAN 0x18
; #define XMODEM_EOF 0x1A
; #define XMODEM_RECIEVING_WAIT_CHAR 'C'
; //定义全局变量
; const char startupString[]="Type 'd' download, Others run app.\n\r\0";
; char data[DATA_BUFFER_SIZE];
; long address = 0;
; //擦除(code=0x03)和写入(code=0x05)一个Flash页
; void boot_page_ew(long p_address,char code)
; {
.dbline 40
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
out 0x3b,r18
.dbline 43
; "mov r31,r17\n"
; "out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
; SPMCSR = code; //寄存器SPMCSR中为操作码
ldd R0,y+4
sts 104,R0
.dbline 44
; asm("spm\n"); //对指定Flash页进行操作
spm
.dbline -2
.dbline 45
; }
L1:
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l code 4 c
.dbsym l p_address 0 L
.dbend
.dbfunc e boot_page_fill _boot_page_fill fV
; data -> R18,R19
; address -> R16,R17
.even
_boot_page_fill::
.dbline -1
.dbline 48
; //填充Flash缓冲页中的一个字
; void boot_page_fill(unsigned int address,int data)
; {
.dbline 49
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
mov r0,r18
mov r1,r19
.dbline 53
; "mov r31,r17\n" //Z/寄存器中为填冲页内地址
; "mov r0,r18\n"
; "mov r1,r19\n"); //R0R1/中为一个指令字
; SPMCSR = 0x01;
ldi R24,1
sts 104,R24
.dbline 54
; asm("spm\n");
spm
.dbline -2
.dbline 55
; }
L2:
.dbline 0 ; func end
ret
.dbsym r data 18 I
.dbsym r address 16 i
.dbend
.dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
_wait_page_rw_ok::
.dbline -1
.dbline 58
; //等待一个Flash页的写完成
; void wait_page_rw_ok(void)
; {
xjmp L5
X0:
.dbline 60
; while(SPMCSR & 0x40)
; {
L7:
.dbline 61
L8:
.dbline 61
lds R2,104
sbrc R2,0
rjmp L7
.dbline 62
ldi R24,17
sts 104,R24
.dbline 63
spm
.dbline 64
L5:
.dbline 59
lds R2,104
sbrc R2,6
rjmp L8
.dbline -2
.dbline 65
; while(SPMCSR & 0x01);
; SPMCSR = 0x11;
; asm("spm\n");
; }
; }
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e write_one_page _write_one_page fV
; i -> R20,R21
.even
_write_one_page::
xcall push_gset1
sbiw R28,1
.dbline -1
.dbline 68
; //更新一个Flash页的完整处理
; void write_one_page(void)
; {
.dbline 70
; int i;
; boot_page_ew(address,0x03); //擦除一个Flash页
ldi R24,3
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 71
; wait_page_rw_ok(); //等待擦除完成
xcall _wait_page_rw_ok
.dbline 72
; for(i=0;i<SPM_PAGESIZE;i+=2) //将数据填入Flash缓冲页中
clr R20
clr R21
L11:
.dbline 73
.dbline 74
ldi R24,<_data+1
ldi R25,>_data+1
movw R30,R20
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
ldi R24,<_data
ldi R25,>_data
movw R30,R20
add R30,R24
adc R31,R25
ldd R18,z+0
clr R19
add R18,R2
adc R19,R3
movw R16,R20
xcall _boot_page_fill
.dbline 75
L12:
.dbline 72
subi R20,254 ; offset = 2
sbci R21,255
.dbline 72
cpi R20,0
ldi R30,1
cpc R21,R30
brlt L11
.dbline 76
; {
; boot_page_fill(i, data[i]+(data[i+1]<<8));
; }
; boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
ldi R24,5
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 77
; wait_page_rw_ok(); //等待写入完成
xcall _wait_page_rw_ok
.dbline -2
.dbline 78
; }
L10:
adiw R28,1
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbend
.dbfunc e uart_putchar _uart_putchar fV
; c -> R16
.even
_uart_putchar::
.dbline -1
.dbline 81
; //从RS232发送一个字节
; void uart_putchar(char c)
; {
L17:
.dbline 82
L18:
.dbline 82
; while(!(UCSR0A & 0x20));
sbis 0xb,5
rjmp L17
.dbline 83
; UDR0 = c;
out 0xc,R16
.dbline -2
.dbline 84
; }
L16:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e uart_getchar _uart_getchar fI
; res -> R16
; status -> R18
.even
_uart_getchar::
.dbline -1
.dbline 87
; //从RS232接收一个字节
; int uart_getchar(void)
; {
.dbline 89
; unsigned char status,res;
; if(!(UCSR0A & 0x80)) return -1; //no/ data to be received
sbic 0xb,7
rjmp L21
.dbline 89
ldi R16,-1
ldi R17,-1
xjmp L20
L21:
.dbline 90
; status = UCSR0A;
in R18,0xb
.dbline 91
; res = UDR0;
in R16,0xc
.dbline 92
; if (status & 0x1c) return -1; // If error, return -1
mov R24,R18
andi R24,28
breq L23
.dbline 92
ldi R16,-1
ldi R17,-1
xjmp L20
L23:
.dbline 93
; return res;
clr R17
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbsym r res 16 c
.dbsym r status 18 c
.dbend
.dbfunc e uart_waitchar _uart_waitchar fc
; c -> R20,R21
.even
_uart_waitchar::
xcall push_gset1
.dbline -1
.dbline 97
; }
; //等待从RS232接收一个有效的字节
; char uart_waitchar(void)
; {
L26:
.dbline 99
L27:
.dbline 99
; int c;
; while((c=uart_getchar())==-1);
xcall _uart_getchar
movw R20,R16
cpi R20,255
ldi R30,255
cpc R21,R30
breq L26
.dbline 100
; return (char)c;
.dbline -2
L25:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r c 20 I
.dbend
.dbfunc e calcrc _calcrc fI
; i -> R22
; crc -> R20,R21
; count -> R18,R19
; ptr -> R16,R17
.even
_calcrc::
xcall push_gset2
.dbline -1
.dbline 104
; }
; //计算CRC
; int calcrc(char *ptr, int count)
; {
.dbline 105
; int crc = 0;
clr R20
clr R21
xjmp L31
L30:
.dbline 109
; char i;
;
; while (--count >= 0)
; {
.dbline 110
; crc = crc ^ (int) *ptr++ << 8;
movw R30,R16
ld R2,Z+
movw R16,R30
clr R3
mov R3,R2
clr R2
eor R20,R2
eor R21,R3
.dbline 111
; i = 8;
ldi R22,8
L33:
.dbline 113
; do
; {
.dbline 114
; if (crc & 0x8000)
sbrs R21,7
rjmp L36
.dbline 115
; crc = crc << 1 ^ 0x1021;
ldi R24,4129
ldi R25,16
movw R2,R20
lsl R2
rol R3
eor R2,R24
eor R3,R25
movw R20,R2
xjmp L37
L36:
.dbline 117
; else
; crc = crc << 1;
lsl R20
rol R21
L37:
.dbline 118
L34:
.dbline 118
mov R24,R22
subi R24,1
mov R22,R24
tst R24
brne L33
.dbline 119
L31:
.dbline 108
movw R24,R18
sbiw R24,1
movw R18,R24
cpi R18,0
ldi R30,0
cpc R19,R30
brge L30
.dbline 120
; } while(--i);
; }
; return (crc);
movw R16,R20
.dbline -2
L29:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 22 c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -