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

📄 self_prog.s

📁 avr的bootloader,bootloader实验
💻 S
字号:
	.module self_prog.c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~2\icc\017-BOOT\self_prog.c
	.dbfunc e boot_page_ew _boot_page_ew fV
;           code -> R18
;       pageAddr -> R16,R17
	.even
_boot_page_ew::
	.dbline -1
	.dbline 22
; /****************************************Copyright (c)**************************************************
; **                               
; **                                     开	发	部
; **                               
; ** 文   件   名: self_prog.c
; ** 最后修改日期: 2006-1-24 13:00
; ** 描        述: SPM操作函数
; ** 版	     本: V1.0,根据machao程序改编
; ** 主  控  芯 片:M16  晶振频率:3.6864MHZ
; **********************************************************************************************************/
; #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 23
;    	asm("mov r30,r16\n" 
	mov r30,r16
	mov r31,r17
	
	.dbline 25
;         "mov r31,r17\n");            	//将页地址放入Z寄存器和RAMPZ的Bit0中 
;    	SPMCR = code;                		//寄存器SPMCSR中为操作码 
	out 0x37,R18
	.dbline 26
;    	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 34
; }         
; 
; /**********************************************************************
; functionName:void boot_page_fill(uint16 address,uint16 data)  
; description: 填充Flash缓冲页中的一个字 
; **********************************************************************/
; void boot_page_fill(uint16 address,uint16 data) 
; { 
	.dbline 35
;     asm("mov r30,r16\n" 
	mov r30,r16
	mov r31,r17
	mov r0,r18
	mov r1,r19
	
	.dbline 39
;     	"mov r31,r17\n"             //Z寄存器中为填冲页内地址 
;     	"mov r0,r18\n" 
;         "mov r1,r19\n");            //R0R1中为一个指令字 
;     SPMCR = 0x01; 
	ldi R24,1
	out 0x37,R24
	.dbline 40
;     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 48
; } 
; 
; /**********************************************************************
; functionName:void wait_page_rw_ok(void) 
; description: 等待一个Flash页的写完成 
; **********************************************************************/
; void wait_page_rw_ok(void) 
; { 
	xjmp L5
X0:
	.dbline 50
; 	while(SPMCR & 0x40) 
; 	{ 
L7:
	.dbline 51
L8:
	.dbline 51
	in R2,0x37
	sbrc R2,0
	rjmp L7
	.dbline 52
	ldi R24,17
	out 0x37,R24
	.dbline 53
	spm
	
	.dbline 54
L5:
	.dbline 49
	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 65
;     	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 66
; 	asm("mov r0,r16\n");
	mov r0,r16
	
	.dbline 67
; 	SPMCR=0x09;
	ldi R24,9
	out 0x37,R24
	.dbline 68
; 	asm("spm\n");
	spm
	
L11:
	.dbline 69
L12:
	.dbline 69
; 	while(SPMCR&BIT(0));
	in R2,0x37
	sbrc R2,0
	rjmp L11
	.dbline 70
; 	SPMCR = 0x11; 
	ldi R24,17
	out 0x37,R24
	.dbline 71
;     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 85
; }
; 
; /**********************************************************************
; 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 86
; 	asm("mov r30,r16\n" 		
	mov r30,r16
	mov r31,r17
	
	.dbline 88
;         "mov r31,r17\n");  
;     if(cmd)
	tst R18
	breq L15
	.dbline 89
;     {
	.dbline 90
;     	SPMCR=0x09;
	ldi R24,9
	out 0x37,R24
	.dbline 91
;     }               
L15:
	.dbline 92
; 	asm("lpm r0,z\n");
	lpm r0,z
	
	.dbline 93
; 	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 + -