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

📄 self_prog.lis

📁 程序下载在M16中后
💻 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 + -