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

📄 self_prog.s

📁 程序下载在M16中后
💻 S
字号:
	.module self_prog.c
	.area text(rom, con, rel)
	.dbfile D:\iccv7avr\AVRBOO~1\self_prog.c
	.dbfunc e boot_page_ew _boot_page_ew fV
;           code -> R18
;       pageAddr -> R16,R17
	.even
_boot_page_ew::
	.dbline -1
	.dbline 19
; /****************************************Copyright (c)*****************************
;  文件名:			self_prog.c
;  修改日期:			2006-1-24 13:00
;  描述: 				SPM操作函数
;  版本:				V1.0,根据machao程序改编
;  主控  芯 片:		M16  晶振频率:7.3728MHZ
; ********************************************************************************/
; #include<iom16v.h>
; #include<macros.h>
; #include"define.h"
; #include"extern.h"
; 
; 
; /**********************************************************************
; functionName:void someNop(void)
; description: 擦除(code=0x03)和写入(code=0x05)一个Flash页 
; **********************************************************************/
; void boot_page_ew(uint16 pageAddr,uint08 code) 
; { 
	.dbline 20
;    	asm("mov r30,r16\n" 
	mov r30,r16
	mov r31,r17
	
	.dbline 22
;         "mov r31,r17\n");            	//将页地址放入Z寄存器和RAMPZ的Bit0中 
;    	SPMCR = code;                		//寄存器SPMCSR中为操作码 
	out 0x37,R18
	.dbline 23
;    	asm("spm\n");                    	//对指定Flash页进行操作 
	spm
	
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r code 18 c
	.dbsym r pageAddr 16 i
	.dbend
	.dbfunc e boot_page_fill _boot_page_fill fV
;           data -> R18,R19
;        address -> R16,R17
	.even
_boot_page_fill::
	.dbline -1
	.dbline 31
; }         
; 
; /**********************************************************************
; functionName:void boot_page_fill(uint16 address,uint16 data)  
; description: 填充Flash缓冲页中的一个字 
; **********************************************************************/
; void boot_page_fill(uint16 address,uint16 data) 
; { 
	.dbline 32
;     asm("mov r30,r16\n" 
	mov r30,r16
	mov r31,r17
	mov r0,r18
	mov r1,r19
	
	.dbline 36
;     	"mov r31,r17\n"             //Z寄存器中为填冲页内地址 
;     	"mov r0,r18\n" 
;         "mov r1,r19\n");            //R0R1中为一个指令字 
;     SPMCR = 0x01; 
	ldi R24,1
	out 0x37,R24
	.dbline 37
;     asm("spm\n"); 
	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 45
; } 
; 
; /**********************************************************************
; functionName:void wait_page_rw_ok(void) 
; description: 等待一个Flash页的写完成 
; **********************************************************************/
; void wait_page_rw_ok(void) 
; { 
	xjmp L5
X0:
	.dbline 47
; 	while(SPMCR & 0x40) 
; 	{ 
L7:
	.dbline 48
L8:
	.dbline 48
	in R2,0x37
	sbrc R2,0
	rjmp L7
	.dbline 49
	ldi R24,17
	out 0x37,R24
	.dbline 50
	spm
	
	.dbline 51
L5:
	.dbline 46
	in R2,0x37
	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 62
;     	while(SPMCR & 0x01); 
;         SPMCR = 0x11; 
;         asm("spm\n"); 
;      } 
; } 
; 
; 
; 
; 
; /**********************************************************************
; functionName:void write_lock_bits (unsigned char val)
; description:写锁定位
; **********************************************************************/
; void write_lock_bits (unsigned char val)
; {
	.dbline 63
; 	asm("mov r0,r16\n");
	mov r0,r16
	
	.dbline 64
; 	SPMCR=0x09;
	ldi R24,9
	out 0x37,R24
	.dbline 65
; 	asm("spm\n");
	spm
	
L11:
	.dbline 66
L12:
	.dbline 66
; 	while(SPMCR&BIT(0));
	in R2,0x37
	sbrc R2,0
	rjmp L11
	.dbline 67
; 	SPMCR = 0x11; 
	ldi R24,17
	out 0x37,R24
	.dbline 68
;     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 82
; }
; 
; /**********************************************************************
; functionName:uint08 read_program_memory (uint16 addr,uint08 cmd)
; description: 返回addr地址数据,以字节为单位
; cmd:
; 0:读flashrom
; 1:读熔丝位或者锁定位 
; addr=0x0001		锁定位
; addr=0x0000		熔丝位低字节
; addr=0x0003 	熔丝位高字节
; **********************************************************************/
; uint08 read_program_memory(uint16 addr,uint08 cmd)
; {
	.dbline 83
; 	asm("mov r30,r16\n" 		
	mov r30,r16
	mov r31,r17
	
	.dbline 85
;         "mov r31,r17\n");  
;     if(cmd)
	tst R18
	breq L15
	.dbline 86
;     {
	.dbline 87
;     	SPMCR=0x09;
	ldi R24,9
	out 0x37,R24
	.dbline 88
;     }               
L15:
	.dbline 89
; 	asm("lpm r0,z\n");
	lpm r0,z
	
	.dbline 90
; 	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 + -