?? self_prog.s
字號:
.module self_prog.c
.area text(rom, con, rel)
.dbfile F:\job\stk500\AVRMEG~1\bldSTK500\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)**************************************************
; **
; ** 開 發(fā) 部
; **
; ** 文 件 名: self_prog.c
; ** 最后修改日期: 2006-1-24 13:00
; ** 描 述: SPM操作函數(shù)
; ** 版 本: V1.0,根據(jù)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 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寄存器中為填沖頁內(nèi)地址
; "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地址數(shù)據(jù),以字節(jié)為單位
; cmd:
; 0:讀flashrom
; 1:讀熔絲位或者鎖定位
; addr=0x0001 鎖定位
; addr=0x0000 熔絲位低字節(jié)
; addr=0x0003 熔絲位高字節(jié)
; **********************************************************************/
; 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);
clr R30
clr R31
ldd R16,z+0
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbsym r cmd 18 c
.dbsym r addr 16 i
.dbend
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -