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

📄 self_prog.s

📁 ATEMEL AVR128 BOOT程序
💻 S
字号:
	.module self_prog.c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\self_prog.c
	.dbfunc e boot_page_ew _boot_page_ew fV
;           code -> y+4
;       pageAddr -> y+0
	.even
_boot_page_ew::
	xcall push_arg4
	.dbline -1
	.dbline 8
; #include "init.h"
; 
; /**********************************************************************
; 擦除(code=0x03)和写入(code=0x05)一个Flash页 
; 特别说明,MEGA128为128K容量,分为两个64K空间。
; 两个空间之间的选择通过RAMPZ的Bit0位来实现。
; **********************************************************************/
; void boot_page_ew(unsigned long pageAddr,unsigned char code) {
	.dbline 10
; 
; 	asm("mov r30,r16\n"
	mov r30,r16
	mov r31,r17
	out 0x3b,r18
	
	.dbline 14
; 		"mov r31,r17\n"
; 		"out 0x3b,r18\n");				/*将页地址放入Z寄存器和RAMPZ的Bit0中*/
; 
; 	SPMCSR = code;                		/*寄存器SPMCSR中为操作码*/
	ldd R0,y+4
	sts 104,R0
	.dbline 15
; 	asm("spm\n");                    	/*对指定Flash页进行操作 */
	spm
	
	.dbline -2
L1:
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l code 4 c
	.dbsym l pageAddr 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 19
; }
; 
; /*填充Flash缓冲页中的一个字*/
; void boot_page_fill(unsigned int address,unsigned int data) {
	.dbline 21
; 
; 	asm("mov r30,r16\n"
	mov r30,r16
	mov r31,r17
	mov r0,r18
	mov r1,r19
	
	.dbline 25
; 		"mov r31,r17\n"             		/*Z寄存器中为填冲页内地址*/
; 		"mov r0,r18\n"
; 		"mov r1,r19\n");            		/*R0R1中为一个指令字*/
; 	SPMCSR = (1 << SPMEN);					/*SPM使能位*/
	ldi R24,1
	sts 104,R24
	.dbline 26
; 	asm("spm\n");							/*执行SPM操作*/
	spm
	
	.dbline -2
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 30
; }
; 
; /*等待一个Flash页的写完成 */
; void wait_page_rw_ok(void) {
	xjmp L5
X0:
	.dbline 32
; 
; 	while (SPMCSR & (1 << RWWSB)) {			/*等待忙信号*/
L7:
	.dbline 33
L8:
	.dbline 33
	lds R2,104
	sbrc R2,0
	rjmp L7
	.dbline 34
	ldi R24,17
	sts 104,R24
	.dbline 35
	spm
	
	.dbline 36
L5:
	.dbline 32
	lds R2,104
	sbrc R2,6
	rjmp L8
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e write_lock_bits _write_lock_bits fV
;            val -> R16
	.even
_write_lock_bits::
	.dbline -1
	.dbline 40
; 		while (SPMCSR & (1 << SPMEN));		/*等待EN信号完成*/
; 		SPMCSR = (1 << RWWSRE) | (1 << SPMEN);/*SPM读使能*/
; 		asm("spm\n");						/*执行SPM操作*/
; 		}
; } 
; 
; /*写锁定位*/
; void write_lock_bits (unsigned char val) {
	.dbline 42
; 
; 	asm("mov r0,r16\n");
	mov r0,r16
	
	.dbline 43
; 	SPMCSR=(1 << BLBSET) | (1 << SPMEN);
	ldi R24,9
	sts 104,R24
	.dbline 44
; 	asm("spm\n");
	spm
	
L11:
	.dbline 45
L12:
	.dbline 45
; 	while (SPMCSR & (1 << SPMEN));			/*等待EN信号完成*/
	lds R2,104
	sbrc R2,0
	rjmp L11
	.dbline 46
; 	SPMCSR = (1 << RWWSRE) | (1 << SPMEN);	/*SPM读使能*/
	ldi R24,17
	sts 104,R24
	.dbline 47
; 	asm("spm\n"); 
	spm
	
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbsym r val 16 c
	.dbend
	.dbfunc e read_program_memory _read_program_memory fc
;            cmd -> R18
;           addr -> R16,R17
	.even
_read_program_memory::
	.dbline -1
	.dbline 60
; }
; 
; /**********************************************************************
; functionName:unsigned char read_program_memory (unsigned int addr,unsigned char cmd)
; description: 返回addr地址数据,以字节为单位
; cmd:
; 0:读flashrom
; 1:读熔丝位或者锁定位 
; addr=0x0001		锁定位
; addr=0x0000		熔丝位低字节
; addr=0x0003 	熔丝位高字节
; **********************************************************************/
; unsigned char read_program_memory(unsigned int addr,unsigned char cmd) {
	.dbline 62
; 
; 	asm("mov r30,r16\n"
	mov r30,r16
	mov r31,r17
	
	.dbline 64
; 		"mov r31,r17\n");
; 	if (cmd) {
	tst R18
	breq L15
	.dbline 64
	.dbline 65
; 		SPMCSR=(1 << BLBSET) | (1 << SPMEN);
	ldi R24,9
	sts 104,R24
	.dbline 66
; 		}
L15:
	.dbline 67
; 	asm("lpm r0,z\n");
	lpm r0,z
	
	.dbline 68
; 	return(R0);
	lds R16,0
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbsym r cmd 18 c
	.dbsym r addr 16 i
	.dbend

⌨️ 快捷键说明

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