📄 self_prog.lis
字号:
.module self_prog.c
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\self_prog.c
0000 .dbfunc e boot_page_ew _boot_page_ew fV
0000 ; code -> y+4
0000 ; pageAddr -> y+0
.even
0000 _boot_page_ew::
0000 0E940000 xcall push_arg4
0004 .dbline -1
0004 .dbline 8
0004 ; #include "init.h"
0004 ;
0004 ; /**********************************************************************
0004 ; 擦除(code=0x03)和写入(code=0x05)一个Flash页
0004 ; 特别说明,MEGA128为128K容量,分为两个64K空间。
0004 ; 两个空间之间的选择通过RAMPZ的Bit0位来实现。
0004 ; **********************************************************************/
0004 ; void boot_page_ew(unsigned long pageAddr,unsigned char code) {
0004 .dbline 10
0004 ;
0004 ; asm("mov r30,r16\n"
0004 E02F mov r30,r16
0006 F12F mov r31,r17
0008 2BBF out 0x3b,r18
000A
000A .dbline 14
000A ; "mov r31,r17\n"
000A ; "out 0x3b,r18\n"); /*将页地址放入Z寄存器和RAMPZ的Bit0中*/
000A ;
000A ; SPMCSR = code; /*寄存器SPMCSR中为操作码*/
000A 0C80 ldd R0,y+4
000C 00926800 sts 104,R0
0010 .dbline 15
0010 ; asm("spm\n"); /*对指定Flash页进行操作 */
0010 E895 spm
0012
0012 .dbline -2
0012 L1:
0012 2496 adiw R28,4
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbsym l code 4 c
0016 .dbsym l pageAddr 0 l
0016 .dbend
0016 .dbfunc e boot_page_fill _boot_page_fill fV
0016 ; data -> R18,R19
0016 ; address -> R16,R17
.even
0016 _boot_page_fill::
0016 .dbline -1
0016 .dbline 19
0016 ; }
0016 ;
0016 ; /*填充Flash缓冲页中的一个字*/
0016 ; void boot_page_fill(unsigned int address,unsigned int data) {
0016 .dbline 21
0016 ;
0016 ; asm("mov r30,r16\n"
0016 E02F mov r30,r16
0018 F12F mov r31,r17
001A 022E mov r0,r18
001C 132E mov r1,r19
001E
001E .dbline 25
001E ; "mov r31,r17\n" /*Z寄存器中为填冲页内地址*/
001E ; "mov r0,r18\n"
001E ; "mov r1,r19\n"); /*R0R1中为一个指令字*/
001E ; SPMCSR = (1 << SPMEN); /*SPM使能位*/
001E 81E0 ldi R24,1
0020 80936800 sts 104,R24
0024 .dbline 26
0024 ; asm("spm\n"); /*执行SPM操作*/
0024 E895 spm
0026
0026 .dbline -2
0026 L2:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbsym r data 18 i
0028 .dbsym r address 16 i
0028 .dbend
0028 .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
0028 _wait_page_rw_ok::
0028 .dbline -1
0028 .dbline 30
0028 ; }
0028 ;
0028 ; /*等待一个Flash页的写完成 */
0028 ; void wait_page_rw_ok(void) {
0028 08C0 xjmp L5
002A X0:
002A .dbline 32
002A ;
002A ; while (SPMCSR & (1 << RWWSB)) { /*等待忙信号*/
002A L7:
002A .dbline 33
002A L8:
002A .dbline 33
002A 20906800 lds R2,104
002E 20FC sbrc R2,0
0030 FCCF rjmp L7
0032 .dbline 34
0032 81E1 ldi R24,17
0034 80936800 sts 104,R24
0038 .dbline 35
0038 E895 spm
003A
003A .dbline 36
003A L5:
003A .dbline 32
003A 20906800 lds R2,104
003E 26FC sbrc R2,6
0040 F4CF rjmp L8
0042 .dbline -2
0042 L3:
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbend
0044 .dbfunc e write_lock_bits _write_lock_bits fV
0044 ; val -> R16
.even
0044 _write_lock_bits::
0044 .dbline -1
0044 .dbline 40
0044 ; while (SPMCSR & (1 << SPMEN)); /*等待EN信号完成*/
0044 ; SPMCSR = (1 << RWWSRE) | (1 << SPMEN);/*SPM读使能*/
0044 ; asm("spm\n"); /*执行SPM操作*/
0044 ; }
0044 ; }
0044 ;
0044 ; /*写锁定位*/
0044 ; void write_lock_bits (unsigned char val) {
0044 .dbline 42
0044 ;
0044 ; asm("mov r0,r16\n");
0044 002E mov r0,r16
0046
0046 .dbline 43
0046 ; SPMCSR=(1 << BLBSET) | (1 << SPMEN);
0046 89E0 ldi R24,9
0048 80936800 sts 104,R24
004C .dbline 44
004C ; asm("spm\n");
004C E895 spm
004E
004E L11:
004E .dbline 45
004E L12:
004E .dbline 45
004E ; while (SPMCSR & (1 << SPMEN)); /*等待EN信号完成*/
004E 20906800 lds R2,104
0052 20FC sbrc R2,0
0054 FCCF rjmp L11
0056 .dbline 46
0056 ; SPMCSR = (1 << RWWSRE) | (1 << SPMEN); /*SPM读使能*/
0056 81E1 ldi R24,17
0058 80936800 sts 104,R24
005C .dbline 47
005C ; asm("spm\n");
005C E895 spm
005E
005E .dbline -2
005E L10:
005E .dbline 0 ; func end
005E 0895 ret
0060 .dbsym r val 16 c
0060 .dbend
0060 .dbfunc e read_program_memory _read_program_memory fc
0060 ; cmd -> R18
0060 ; addr -> R16,R17
.even
0060 _read_program_memory::
0060 .dbline -1
0060 .dbline 60
0060 ; }
0060 ;
0060 ; /**********************************************************************
0060 ; functionName:unsigned char read_program_memory (unsigned int addr,unsigned char cmd)
0060 ; description: 返回addr地址数据,以字节为单位
0060 ; cmd:
0060 ; 0:读flashrom
0060 ; 1:读熔丝位或者锁定位
0060 ; addr=0x0001 锁定位
0060 ; addr=0x0000 熔丝位低字节
0060 ; addr=0x0003 熔丝位高字节
0060 ; **********************************************************************/
0060 ; unsigned char read_program_memory(unsigned int addr,unsigned char cmd) {
0060 .dbline 62
0060 ;
0060 ; asm("mov r30,r16\n"
0060 E02F mov r30,r16
0062 F12F mov r31,r17
0064
0064 .dbline 64
0064 ; "mov r31,r17\n");
0064 ; if (cmd) {
0064 2223 tst R18
0066 19F0 breq L15
0068 .dbline 64
0068 .dbline 65
0068 ; SPMCSR=(1 << BLBSET) | (1 << SPMEN);
0068 89E0 ldi R24,9
006A 80936800 sts 104,R24
006E .dbline 66
006E ; }
006E L15:
006E .dbline 67
006E ; asm("lpm r0,z\n");
006E 0490 lpm r0,z
0070
0070 .dbline 68
0070 ; return(R0);
0070 00910000 lds R16,0
0074 .dbline -2
0074 L14:
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbsym r cmd 18 c
0076 .dbsym r addr 16 i
0076 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -