📄 self_prog.s
字号:
.module self_prog.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\self_prog.c
.dbfunc e boot_page_ew _boot_page_ew fV
; code -> y+4
; pageAddr -> y+0
.even
_boot_page_ew::
xcall push_arg4
.dbline -1
.dbline 8
; #include "init.h"
;
; /**********************************************************************
; 擦除(code=0x03)和写入(code=0x05)一个Flash页
; 特别说明,MEGA128为128K容量,分为两个64K空间。
; 两个空间之间的选择通过RAMPZ的Bit0位来实现。
; **********************************************************************/
; void boot_page_ew(unsigned long pageAddr,unsigned char code) {
.dbline 10
;
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
out 0x3b,r18
.dbline 14
; "mov r31,r17\n"
; "out 0x3b,r18\n"); /*将页地址放入Z寄存器和RAMPZ的Bit0中*/
;
; SPMCSR = code; /*寄存器SPMCSR中为操作码*/
ldd R0,y+4
sts 104,R0
.dbline 15
; asm("spm\n"); /*对指定Flash页进行操作 */
spm
.dbline -2
L1:
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l code 4 c
.dbsym l pageAddr 0 l
.dbend
.dbfunc e boot_page_fill _boot_page_fill fV
; data -> R18,R19
; address -> R16,R17
.even
_boot_page_fill::
.dbline -1
.dbline 19
; }
;
; /*填充Flash缓冲页中的一个字*/
; void boot_page_fill(unsigned int address,unsigned int data) {
.dbline 21
;
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
mov r0,r18
mov r1,r19
.dbline 25
; "mov r31,r17\n" /*Z寄存器中为填冲页内地址*/
; "mov r0,r18\n"
; "mov r1,r19\n"); /*R0R1中为一个指令字*/
; SPMCSR = (1 << SPMEN); /*SPM使能位*/
ldi R24,1
sts 104,R24
.dbline 26
; asm("spm\n"); /*执行SPM操作*/
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 30
; }
;
; /*等待一个Flash页的写完成 */
; void wait_page_rw_ok(void) {
xjmp L5
X0:
.dbline 32
;
; while (SPMCSR & (1 << RWWSB)) { /*等待忙信号*/
L7:
.dbline 33
L8:
.dbline 33
lds R2,104
sbrc R2,0
rjmp L7
.dbline 34
ldi R24,17
sts 104,R24
.dbline 35
spm
.dbline 36
L5:
.dbline 32
lds R2,104
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 40
; while (SPMCSR & (1 << SPMEN)); /*等待EN信号完成*/
; SPMCSR = (1 << RWWSRE) | (1 << SPMEN);/*SPM读使能*/
; asm("spm\n"); /*执行SPM操作*/
; }
; }
;
; /*写锁定位*/
; void write_lock_bits (unsigned char val) {
.dbline 42
;
; asm("mov r0,r16\n");
mov r0,r16
.dbline 43
; SPMCSR=(1 << BLBSET) | (1 << SPMEN);
ldi R24,9
sts 104,R24
.dbline 44
; asm("spm\n");
spm
L11:
.dbline 45
L12:
.dbline 45
; while (SPMCSR & (1 << SPMEN)); /*等待EN信号完成*/
lds R2,104
sbrc R2,0
rjmp L11
.dbline 46
; SPMCSR = (1 << RWWSRE) | (1 << SPMEN); /*SPM读使能*/
ldi R24,17
sts 104,R24
.dbline 47
; 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 60
; }
;
; /**********************************************************************
; functionName:unsigned char read_program_memory (unsigned int addr,unsigned char cmd)
; description: 返回addr地址数据,以字节为单位
; cmd:
; 0:读flashrom
; 1:读熔丝位或者锁定位
; addr=0x0001 锁定位
; addr=0x0000 熔丝位低字节
; addr=0x0003 熔丝位高字节
; **********************************************************************/
; unsigned char read_program_memory(unsigned int addr,unsigned char cmd) {
.dbline 62
;
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
.dbline 64
; "mov r31,r17\n");
; if (cmd) {
tst R18
breq L15
.dbline 64
.dbline 65
; SPMCSR=(1 << BLBSET) | (1 << SPMEN);
ldi R24,9
sts 104,R24
.dbline 66
; }
L15:
.dbline 67
; asm("lpm r0,z\n");
lpm r0,z
.dbline 68
; return(R0);
lds R16,0
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbsym r cmd 18 c
.dbsym r addr 16 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -