您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 8bitOTP_编程技巧
1.问题:笔者在前期工作中,常常遇到在做测试时,只要修改一些简短的指令或数据时,就要再换一个全新的芯片重新烧录一下,再测试。这样即浪费时间,又消费芯片,还消费金钱呢。2.解决:其实OTP不是你想象的那么“顽固”,只要你对它好一些,还是有些回报的。在烧录前,芯片的内部全是由2进制的1组成,烧录后,是对里面的1进行切断成0,如此,烧录过的不能再烧录,是对已经把1烧录成0的不可再烧,而是没有把1烧成0的,还是可以再烧的。也就是说,1可以变成0,而0不可再变为1,就象保险丝一样,烧断了就不可再烧,而没烧断的,你还可以把它烧断。要想实现重烧的过程,还是要有些技巧的。哎,废话这么多,来些实例的讲吧。你可以在你想要的地方预留些空间,等你想要在这修改时,再从里面提取出来。;-----------------------------------------------------------------------------;3.实例1:在已经烧过程序的IC上修改数据:incmst_enter_io;500ms进入一次nop;mova,#0xFF;1预留数据修改(二进制为:11111111b)mova,#0xFF;2预留数据修改mova,#0xFF;3预留数据修改mova,#0xFF;4预留数据修改mova,#0xFF;5预留数据修改mova,#0xF3;等待被修改的数据cjbt_enter_io,a,e_tele_io;249次进入一下clrt_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条:mova,0xFF,这是为了修改各种数据而预留的。你可以把0xFF(二进制:11111111B)修改成0~255范围的任意一个数据。修改过程为:先把在最下面的不想要的数据(直接送数指令:mova,0xF3;此指令生成的机器指令为:2DF3),用NOP(机器指令为:0000)给填充掉。然后第5条的0xFF修改为你想要的数据),比如修改为:0x45,修改后的程序如下:incmst_enter_io;500ms进入一次nop;mova,#0xFF;1预留数据修改(二进制为:11111111b)mova,#0xFF;2预留数据修改mova,#0xFF;3预留数据修改mova,#0xFF;4预留数据修改mova,#0x45;0xFF;5预留数据修改已经修改为0x45;;;mova,#0xF3;此条指令用NOP取代等待被修改的数据NOPcjbt_enter_io,a,e_tele_io;249次进入一下clrt_enter_io;;-----------------------------------------------------------------------------;实例2:只修改数据而已,有时还是不能达到我们想要的结果,有没有一种可以写任意的命令的呢?笔者给你的回答是:有!在下面的一个实例中,给大伙分享下,预留空间的事。3.2.1.(增加或修改部分指令)在已经存在的程序里,修改或增加部分指令。我们注意到,在已经烧过的IC中,里面有dw0ffffh,就相当于在里面全部用1去填充,当然还可以再烧了。如下面的程序,我想在下面的b0bsetfp00后面再加几条不一样的指令,如:我想让系统在执行到置FP00为1时后,进入睡眠状态。incmst_enter_io;500ms进入一次nop;mova,#0xF3;此条指令用NOP取代等待被修改的数据cjbt_enter_io,a,e_tele_io;249次进入一下clrt_enter_io;;b0bsetfp00;;jmp@F;预留空间30个dw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh@@:;修改完后,程序如下:incmst_enter_io;500ms进入一次nop;mova,#0xF3;此条指令用NOP取代等待被修改的数据cjbt_enter_io,a,e_tele_io;249次进入一下clrt_enter_io;;b0bsetfp00;;;;;;;jmp@F;预留空间30个将此条屏蔽,用NOP取代NOP;b0bclrfcpum1;睡吧@@@!b0bsetfcpum0;jmp@F;用去了3条,只剩下27条指令空间了!dw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh;;;;;;0ffffh0ffffh0ffffh;从这里释放3条指令出来dw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh@@:;-----------------------------------------------------------------------------;3.2.2(大量增加指令),笔者有个习惯,就是在写完程序后,会把剩下的空间,全部预留起来,以防止不测(呵呵)。也为增加大量的指令做些工作,这是必要的,笔者在开发产品过程中,就碰到过这样的情况,确定好了功能的产品,已经在生产中,却发现了隐藏很深的漏洞,由于之前做了些准备,所以可以让客户再把烧过的IC发回来,修改一下,重新烧给他,这把双方的损失降到最低点。例如程序如下:当要再加功能时,就可以在save_ROM中继续添加,方法类似于上一个例子,在此不多做描述(若看不懂,可直接与笔者联系)。;;**************************************;*********main:;@rst_wdt;清看门狗b0bts0f_int_tc1;calltime_treat;;;b0bts0f_check_buzzer;callbuzzer;;;callsave_ROM;把剩下的空间预留下来jmpmain;;;**************************************;*********;;***********************************************;*********;此文件为预留空间所用!;;***********************************************;*********save_ROM:;预留空间e_save_ROM:;ret;;;***********************************************;*********;100dw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh;dw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh;100dw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh;dw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffhdw0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh0ffffh;………OTP,单片机,技巧
本文标题:8bitOTP_编程技巧
链接地址:https://www.777doc.com/doc-2892395 .html