📄 self_prog.lis
字号:
.module self_prog.c
.area text(rom, con, rel)
0000 .dbfile D:\iccv7avr\AVRBOO~1\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 19
0000 ; /****************************************Copyright (c)*****************************
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 20
0000 ; asm("mov r30,r16\n"
0000 E02F mov r30,r16
0002 F12F mov r31,r17
0004
0004 .dbline 22
0004 ; "mov r31,r17\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
0004 ; SPMCR = code; //寄存器SPMCSR中为操作码
0004 27BF out 0x37,R18
0006 .dbline 23
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 31
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 32
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 36
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 37
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 45
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 47
001C ; while(SPMCR & 0x40)
001C ; {
001C L7:
001C .dbline 48
001C L8:
001C .dbline 48
001C 27B6 in R2,0x37
001E 20FC sbrc R2,0
0020 FDCF rjmp L7
0022 .dbline 49
0022 81E1 ldi R24,17
0024 87BF out 0x37,R24
0026 .dbline 50
0026 E895 spm
0028
0028 .dbline 51
0028 L5:
0028 .dbline 46
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 62
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 63
0030 ; asm("mov r0,r16\n");
0030 002E mov r0,r16
0032
0032 .dbline 64
0032 ; SPMCR=0x09;
0032 89E0 ldi R24,9
0034 87BF out 0x37,R24
0036 .dbline 65
0036 ; asm("spm\n");
0036 E895 spm
0038
0038 L11:
0038 .dbline 66
0038 L12:
0038 .dbline 66
0038 ; while(SPMCR&BIT(0));
0038 27B6 in R2,0x37
003A 20FC sbrc R2,0
003C FDCF rjmp L11
003E .dbline 67
003E ; SPMCR = 0x11;
003E 81E1 ldi R24,17
0040 87BF out 0x37,R24
0042 .dbline 68
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 82
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 83
0046 ; asm("mov r30,r16\n"
0046 E02F mov r30,r16
0048 F12F mov r31,r17
004A
004A .dbline 85
004A ; "mov r31,r17\n");
004A ; if(cmd)
004A 2223 tst R18
004C 11F0 breq L15
004E .dbline 86
004E ; {
004E .dbline 87
004E ; SPMCR=0x09;
004E 89E0 ldi R24,9
0050 87BF out 0x37,R24
0052 .dbline 88
0052 ; }
0052 L15:
0052 .dbline 89
0052 ; asm("lpm r0,z\n");
0052 0490 lpm r0,z
0054
0054 .dbline 90
0054 ; return(R0);
0054 00910000 lds R16,0
0058 .dbline -2
0058 L14:
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r cmd 18 c
005A .dbsym r addr 16 i
005A .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -