?? self_prog.lis
字號:
.module self_prog.c
.area text(rom, con, rel)
0000 .dbfile F:\job\stk500\AVRMEG~1\bldSTK500\self_prog.c
0000 .dbfunc e boot_page_ew _boot_page_ew fV
0000 ; code -> R18
0000 ; pageAddr -> R16,R17
.even
0000 _boot_page_ew::
0000 .dbline -1
0000 .dbline 22
0000 ; /****************************************Copyright (c)**************************************************
0000 ; **
0000 ; ** 開 發 部
0000 ; **
0000 ; ** 文 件 名: self_prog.c
0000 ; ** 最后修改日期: 2006-1-24 13:00
0000 ; ** 描 述: SPM操作函數
0000 ; ** 版 本: V1.0,根據machao程序改編
0000 ; ** 主 控 芯 片:M16 晶振頻率:7.3728MHZ
0000 ; **********************************************************************************************************/
0000 ; #include<iom16v.h>
0000 ; #include<macros.h>
0000 ; #include"define.h"
0000 ; #include"extern.h"
0000 ;
0000 ;
0000 ; /**********************************************************************
0000 ; functionName:void someNop(void)
0000 ; description: 擦除(code=0x03)和寫入(code=0x05)一個Flash頁
0000 ; **********************************************************************/
0000 ; void boot_page_ew(uint16 pageAddr,uint08 code)
0000 ; {
0000 .dbline 23
0000 ; asm("mov r30,r16\n"
0000 E02F mov r30,r16
0002 F12F mov r31,r17
0004
0004 .dbline 25
0004 ; "mov r31,r17\n"); //將頁地址放入Z寄存器和RAMPZ的Bit0中
0004 ; SPMCR = code; //寄存器SPMCSR中為操作碼
0004 27BF out 0x37,R18
0006 .dbline 26
0006 ; asm("spm\n"); //對指定Flash頁進行操作
0006 E895 spm
0008
0008 .dbline -2
0008 L1:
0008 .dbline 0 ; func end
0008 0895 ret
000A .dbsym r code 18 c
000A .dbsym r pageAddr 16 i
000A .dbend
000A .dbfunc e boot_page_fill _boot_page_fill fV
000A ; data -> R18,R19
000A ; address -> R16,R17
.even
000A _boot_page_fill::
000A .dbline -1
000A .dbline 34
000A ; }
000A ;
000A ; /**********************************************************************
000A ; functionName:void boot_page_fill(uint16 address,uint16 data)
000A ; description: 填充Flash緩沖頁中的一個字
000A ; **********************************************************************/
000A ; void boot_page_fill(uint16 address,uint16 data)
000A ; {
000A .dbline 35
000A ; asm("mov r30,r16\n"
000A E02F mov r30,r16
000C F12F mov r31,r17
000E 022E mov r0,r18
0010 132E mov r1,r19
0012
0012 .dbline 39
0012 ; "mov r31,r17\n" //Z寄存器中為填沖頁內地址
0012 ; "mov r0,r18\n"
0012 ; "mov r1,r19\n"); //R0R1中為一個指令字
0012 ; SPMCR = 0x01;
0012 81E0 ldi R24,1
0014 87BF out 0x37,R24
0016 .dbline 40
0016 ; asm("spm\n");
0016 E895 spm
0018
0018 .dbline -2
0018 L2:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbsym r data 18 i
001A .dbsym r address 16 i
001A .dbend
001A .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
001A _wait_page_rw_ok::
001A .dbline -1
001A .dbline 48
001A ; }
001A ;
001A ; /**********************************************************************
001A ; functionName:void wait_page_rw_ok(void)
001A ; description: 等待一個Flash頁的寫完成
001A ; **********************************************************************/
001A ; void wait_page_rw_ok(void)
001A ; {
001A 06C0 xjmp L5
001C X0:
001C .dbline 50
001C ; while(SPMCR & 0x40)
001C ; {
001C L7:
001C .dbline 51
001C L8:
001C .dbline 51
001C 27B6 in R2,0x37
001E 20FC sbrc R2,0
0020 FDCF rjmp L7
0022 .dbline 52
0022 81E1 ldi R24,17
0024 87BF out 0x37,R24
0026 .dbline 53
0026 E895 spm
0028
0028 .dbline 54
0028 L5:
0028 .dbline 49
0028 27B6 in R2,0x37
002A 26FC sbrc R2,6
002C F7CF rjmp L8
002E .dbline -2
002E L3:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbend
0030 .dbfunc e write_lock_bits _write_lock_bits fV
0030 ; val -> R16
.even
0030 _write_lock_bits::
0030 .dbline -1
0030 .dbline 65
0030 ; while(SPMCR & 0x01);
0030 ; SPMCR = 0x11;
0030 ; asm("spm\n");
0030 ; }
0030 ; }
0030 ;
0030 ;
0030 ;
0030 ;
0030 ; /**********************************************************************
0030 ; functionName:void write_lock_bits (unsigned char val)
0030 ; description:寫鎖定位
0030 ; **********************************************************************/
0030 ; void write_lock_bits (unsigned char val)
0030 ; {
0030 .dbline 66
0030 ; asm("mov r0,r16\n");
0030 002E mov r0,r16
0032
0032 .dbline 67
0032 ; SPMCR=0x09;
0032 89E0 ldi R24,9
0034 87BF out 0x37,R24
0036 .dbline 68
0036 ; asm("spm\n");
0036 E895 spm
0038
0038 L11:
0038 .dbline 69
0038 L12:
0038 .dbline 69
0038 ; while(SPMCR&BIT(0));
0038 27B6 in R2,0x37
003A 20FC sbrc R2,0
003C FDCF rjmp L11
003E .dbline 70
003E ; SPMCR = 0x11;
003E 81E1 ldi R24,17
0040 87BF out 0x37,R24
0042 .dbline 71
0042 ; asm("spm\n");
0042 E895 spm
0044
0044 .dbline -2
0044 L10:
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbsym r val 16 c
0046 .dbend
0046 .dbfunc e read_program_memory _read_program_memory fc
0046 ; cmd -> R18
0046 ; addr -> R16,R17
.even
0046 _read_program_memory::
0046 .dbline -1
0046 .dbline 85
0046 ; }
0046 ;
0046 ; /**********************************************************************
0046 ; functionName:uint08 read_program_memory (uint16 addr,uint08 cmd)
0046 ; description: 返回addr地址數據,以字節為單位
0046 ; cmd:
0046 ; 0:讀flashrom
0046 ; 1:讀熔絲位或者鎖定位
0046 ; addr=0x0001 鎖定位
0046 ; addr=0x0000 熔絲位低字節
0046 ; addr=0x0003 熔絲位高字節
0046 ; **********************************************************************/
0046 ; uint08 read_program_memory(uint16 addr,uint08 cmd)
0046 ; {
0046 .dbline 86
0046 ; asm("mov r30,r16\n"
0046 E02F mov r30,r16
0048 F12F mov r31,r17
004A
004A .dbline 88
004A ; "mov r31,r17\n");
004A ; if(cmd)
004A 2223 tst R18
004C 11F0 breq L15
004E .dbline 89
004E ; {
004E .dbline 90
004E ; SPMCR=0x09;
004E 89E0 ldi R24,9
0050 87BF out 0x37,R24
0052 .dbline 91
0052 ; }
0052 L15:
0052 .dbline 92
0052 ; asm("lpm r0,z\n");
0052 0490 lpm r0,z
0054
0054 .dbline 93
0054 ; return(R0);
0054 EE27 clr R30
0056 FF27 clr R31
0058 0081 ldd R16,z+0
005A .dbline -2
005A L14:
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r cmd 18 c
005C .dbsym r addr 16 i
005C .dbend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -