📄 self_prog.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 + -