1.問題:筆者在前期工作中,常常遇到在做測試時,只要修改一些簡短的指令或數據時,就要再換一個全新的芯片重新燒錄一下,再測試。這樣即浪費時間,又消費芯片,還消費金錢呢。 2.解決:其實OTP不是你想象的那么“頑固”,只要你對它好一些,還是有些回報的。在燒錄前,芯片的內部全是由2進制的1組成,燒錄后,是對里面的1進行切斷成0,如此,燒錄過的不能再燒錄,是對已經把1燒錄成0的不可再燒,而是沒有把1燒成0的,還是可以再燒的。也就是說,1可以變成0,而0不可再變?yōu)?,就象保險絲一樣,燒斷了就不可再燒,而沒燒斷的,你還可以把它燒斷。要想實現重燒的過程,還是要有些技巧的。哎,廢話這么多,來些實例的講吧。
你可以在你想要的地方預留些空間,等你想要在這修改時,再從里面提取出來。
;-----------------------------------------------------------------------------;
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的區(qū)別只在于3和1,二進制為:0011B和0001B,所以你可以把0011B(十進制3)中第2位的1修改為0,即從0011B成為0001B,所以可以直接修改,當然你也要以把它修改成為你想要的數據,但前提是:你只能從二進制中的1燒成0,不可從0變?yōu)?. 比如我可以把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 后面再加幾條不一樣的指令,如:我想讓系統(tǒng)在執(zhí)行到置FP00為1時后,進入睡眠狀態(tài)。
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 (大量增加指令),筆者有個習慣,就是在寫完程序后,會把剩下的空間,全部預留起來,以防止不測(呵呵)。也為增加大量的指令做些工作,這是必要的,筆者在開發(fā)產品過程中,就碰到過這樣的情況,確定好了功能的產品,已經在生產中,卻發(fā)現了隱藏很深的漏洞,由于之前做了些準備,所以可以讓客戶再把燒過的IC發(fā)回來,修改一下,重新燒給他,這把雙方的損失降到最低點。
例如程序如下:
當要再加功能時,就可以在save_ROM 中繼續(xù)添加,方法類似于上一個例子,在此不多做描述(若看不懂,可直接與筆者聯系)。
;;**************************************;*********
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
;………
評論