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

📄 atemga128iap.s

📁 atmega128在线升级程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -