关于松翰单片机的OTP可重复烧写的技巧!

[复制链接]
查看79626 | 回复48 | 2010-1-28 18:07:44 | 显示全部楼层 |阅读模式
本帖最后由 犀牛 于 2010-2-2 14:04 编辑

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
;………
touch2sonix | 2010-3-16 23:38:21 | 显示全部楼层
这个不错
qianslong | 2010-5-18 20:13:06 | 显示全部楼层
顶一下
gwq168 | 2010-5-21 21:50:07 | 显示全部楼层
这个不错,学习下:
FOUCES | 2010-6-14 19:57:46 | 显示全部楼层
这个不错,顶......
WDL | 2010-6-26 11:08:49 | 显示全部楼层
太好啦,这真是救命之星呀
zqy511325 | 2010-6-28 15:47:50 | 显示全部楼层
这个不错
lsmfr | 2010-7-16 15:15:19 | 显示全部楼层
恩,谢谢大家的鼎力支持,我们会努力为大家解决难题的,如果您有什么建议会在需要什么帮助,都可以在这里发表,我们会及时回复您的。
啊亮 | 2010-8-3 09:28:32 | 显示全部楼层
学习了,很不错,可以继续发表多点学习资料吗
lsmfr | 2010-8-3 09:31:16 | 显示全部楼层
最近都有些忙,没有及时写文章,我会尽快写的,谢谢大家对论坛的鼎力支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则