1.问题:笔者在前期作业中,常常遇到在做测验时,只需修正一些简略的指令或数据时,就要再换一个全新的芯片从头烧录一下,再测验。这样即糟蹋时间,又消费芯片,还消费金钱呢。
2.处理:其实
OTP不是你幻想的那么“固执”,只需你对它好一些,仍是有些报答的。在烧录前,芯片的内部满是由2进制的1组成,烧录后,是对里边的1进行切断成0,如此,烧录过的不能再烧录,是对现已把1烧录成0的不行再烧,而是没有把1烧成0的,仍是能够再烧的。也就是说,1能够变成0,而0不行再变为1,就象保险丝相同,烧断了就不行再烧,而没烧断的,你还能够把它烧断。要想完成重烧的进程,仍是要有些技巧的。哎,废话这么多,来些实例的讲吧。
你能够在你想要的当地预留些空间,等你想要在这修正时,再从里边提取出来。
;—————————————————————————–;
3.实例1:在现已烧进程序的IC上修正数据:
incms t_enter_io ;500ms 进入一次
nop ;
mov a,#0xFF ;1 预留数据修正(二进制为:11111111b)
mov a,#0xFF ;2 预留数据修正
mov a,#0xFF ;3 预留数据修正
mov a,#0xFF ;4 预留数据修正
mov a,#0xFF ;5 预留数据修正
mov a,#0xF3 ;等候被修正的数据
cjb t_enter_io,a,e_tele_io ;249次进入一下
clr t_enter_io ;
;—————————————————————————–;
3.1.1 (直接修正)比方我想在现已烧有上面程序的IC的基础上,修正a=0xF3(2二进制:11110011B)为a=0xF1,此刻,你就不要再糟蹋IC了,直接在上面修正就能够。你能够看到,0xF3与0xF1的区别只在于3和1,二进制为:0011B和0001B,所以你能够把0011B(十进制3)中第2位的1修正为0,即从0011B成为0001B,所以能够直接修正,当然你也要以把它修正成为你想要的数据,但条件是:你只能从二进制中的1烧成0,不行从0变为1. 比方我能够把0xF1再烧成0xA1或0xA0或0x01或0x00等等。
;—————————————————————————–;
3.1.2 (掩盖修正)是否有一种能够在上面的程序中恣意修正数据呢?这是有的!读者能够看到,我上面的程序为了避免修正不同的数据而所预留的5条 :mov a,0xFF ,这是为了修正各种数据而预留的。你能够把 0xFF(二进制:11111111B)修正成0~255规模的恣意一个数据。修正进程为:先把在最下面的不想要的数据(直接送数指令:mov a,0xF3 ;此指令生成的机器指令为:2DF3),用 NOP(机器指令为:0000 )给填充掉。然后第5条的0xFF修正为你想要的数据),比方修正为:0x45,修正后的程序如下:
incms t_enter_io ;500ms 进入一次
nop ;
mov a,#0xFF ;1 预留数据修正(二进制为:11111111b)
mov a,#0xFF ;2 预留数据修正
mov a,#0xFF ;3 预留数据修正
mov a,#0xFF ;4 预留数据修正
mov a,#0x45;0xFF ;5 预留数据修正 现已修正为0x45
;;;mov a,#0xF3 ;此条指令用 NOP 替代 等候被修正的数据
NOP
cjb t_enter_io,a,e_tele_io ;249次进入一下
clr t_enter_io ;
;—————————————————————————–;
实例2:只修正数据罢了,有时仍是不能到达咱们想要的成果,有没有一种能够写恣意的指令的呢?笔者给你的答复是:有!
鄙人面的一个实例中,给大伙共享下,预留空间的事。
3.2.1.(增加或修正部分指令)在现已存在的程序里,修正或增加部分指令。咱们注意到,在现已烧过的IC中,里边有dw 0ffffh ,就相当于在里边全 部用1去填充,当然还能够再烧了。如下面的程序,我想鄙人面的 b0bset fp00 后边再加几条不相同的指令,如:我想让体系在履行到置FP00为1时后,进入睡觉状况。
incms t_enter_io ;500ms 进入一次
nop ;
mov a,#0xF3 ;此条指令用 NOP 替代 等候被修正的数据
cjb t_enter_io,a,e_tele_io ;249次进入一下
clr t_enter_io ;
;
b0bset fp00 ;
;
jmp @F ;预留空间30个
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh
@@: ;
修正完后,程序如下:
incms t_enter_io ;500ms 进入一次
nop ;
mov a,#0xF3 ;此条指令用 NOP 替代 等候被修正的数据
cjb t_enter_io,a,e_tele_io ;249次进入一下
clr t_enter_io ;
;
b0bset fp00 ;
;
;;;;;jmp @F ;预留空间30个将此条屏蔽,用NOP替代
NOP ;
b0bclr fcpum1 ;睡吧@@@!
b0bset fcpum0 ;
jmp @F ;用去了3条,只剩余27条指令空间了!
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh ;;;;;;0ffffh 0ffffh 0ffffh ;从这儿开释3条指令出来
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh
@@:
;—————————————————————————–;
3.2.2 (很多增加指令),笔者有个习气,就是在写完程序后,会把剩余的空间,悉数预留起来,以避免意外(呵呵)。也为增加很多的指令做些作业,这是必要的,笔者在开发产品进程中,就碰到过这样的状况,确认好了功用的产品,现已在生产中,却发现了躲藏很深的缝隙,因为之前做了些预备,所以能够让客户再把烧过的IC发回来,修正一下,从头烧给他,这把两边的丢失降到最低点。
例如程序如下:
当要再加功用时,就能够在save_ROM 中持续增加,办法类似于上一个比如,在此不多做描绘(若看不懂,可直接与笔者联络)。
;;**************************************;*********
main: ;
@rst_wdt ;清看门狗
b0bts0 f_int_tc1 ;
call time_treat ;
; ;
b0bts0 f_check_buzzer ;
call buzzer ;
; ;
call save_ROM ; 把剩余的空间预留下来
jmp main ;
;;**************************************;*********
;;***********************************************;*********
;此文件为预留空间所用!
;;***********************************************;*********
save_ROM: ;预留空间
e_save_ROM: ;
ret ;
;;***********************************************;*********
;100
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh;
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
;100
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh;
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
dw 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh 0ffffh0ffffh 0ffffh
;………