单片机怎么设置otp位

电子元器件 时间:2023-02-16 17:42:26 回答数:9条 机械归档 醉学网
51单片机如何进行OTP加密

最佳答案


Notice: Undefined variable: v in /home/www/wwwroot/926169/file/cache/tpl/default/know/show.php on line 116

Notice: Undefined variable: v in /home/www/wwwroot/926169/file/cache/tpl/default/know/show.php on line 120
优美的眼睛

犹豫的信封

2023-02-16 17:42:26

晚了两年啊哈。我个人理解的,不见得对。欢迎拍砖、共勉。

逆向考虑。解密的方法很多,但是简单点的就是擦除片内的加密锁定位。而加密锁定位,在被烧坏以后,就不具备擦除特性了,也就能保证不被读出了,从而起到加密作用。不能被读出,自然就更不能被写入了(这样就把芯片变成了太监,呵呵)。你烧坏加密锁定位,它就不能再写入了,类似于一次性编程,所以叫它OTP加密方法。(OTP就是一次性编程的意思)

通常为了更好的加密程序,如果用户程序长度大于89C51单片机片内存储器的容量,也可使用OTP模式做加密。具体做法是:

1 按常规扩展一片大容量程序存储器,如27C512(64K)。

2 把关键的程序部分安排在整个程序的前4K中。

3 把整个程序写入27C512,再把27C512的前4K填充为0。

4 把程序的前4K固化到AT89C51中,用OTP模式做加密。

5 把单片机的EA脚接高电平。

这样程序的前4K在单片机内部运行,后60K在片外运行。盗版者无法读出程序的前4K程序,即使知道后60K也无济于事。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

当然,加密的方法很多。比如烧断一根数据总线,它也就无法读出了。(某根总线烧坏之后,它就总是显示输出1,固然就不能正确读出代码了)。

烧总线的方法不如烧加密位的方法好。因为烧总线以后这个芯片,就不能再使用总线接口扩展芯片和存储器,程序的大小也就只能是受片内程序存储器的容量限制了。但不论是烧总线还是烧加密锁定位,都将把芯片变成不可再读出的东东,想再次编程那肯定更是不可能了。所以,要确定无误后,再加密。

然而,破解方法也是有很多的。并不是非得沿着来路返回去才能回家的。你把锁定位或者总线烧坏了,我都不能读出了,那不这样读了。这就提到了更XX的解密方法。把芯片经过去层处理,把存储器进行拍照,然后把照片经过染色处理,把1和0区分读出整理,这样就得到了存储器里的代码(因为代码是以电荷的码点形式存在的)。

其他答案共有8条回答

  • 甜蜜的帆布鞋
    2023-02-16 17:42:26

    OTP是单片机的一种存储器类型,意思是一次性可编程,程序烧入单片机后,将不可再次更改和清除。

    随着嵌入式应用的越来越广泛,产品的安全也显得越来越重要。一方面是为了保护硬件设计,另外一方面也是为了产品本身的安全,防止被HACKED。

    在嵌入式系统当中,所有的代码和系统数据都是被存储在FLASH芯片内部的。FLASH芯片的特点是可多次擦写,而且掉电数据不会丢失。为了保护FLASH中的数据,越来越多的FLASH厂商在FLASH内部提供了一种特殊的寄存器:OTP寄存器。

    扩展资料:

    给OTP寄存器提供保护,一般这类FLASH芯片还会提供一个LOCK寄存器。LOCK寄存器(同属OTP)也只能烧写一次。

    LOCK寄存器的每一位对应于一个OTP寄存器。如果与OTP寄存器对应LOCK寄存器的位(BIT)从1写为0,就意味着这个被锁住的OTP寄存器再也不能进行写操作了。

    即使OTP的当前值为0xFFFFFFFF,它的值也永远不可以被改写了。通过OTP寄存器与LOCK寄存器,用户可以在OTP里保存一些特定的信息,例如软件版本号,硬件版本号,秘钥等信息。同时,这类FLASH芯片内部还会有另外一个OTP寄存器。

    写入特定的序列号,并LOCK住。如果有需要,FLASH厂商也可以根据客户的需要写入特定的序列号。这样,每个芯片都会有一个不一样的ID号,避免被复制。

    参考资料来源:百度百科-OTP

  • 耍酷的仙人掌
    2023-02-16 17:42:26

    OTP属于程序存储器,将数组直接存放在程序存储器中,要求这个数组是常量才行,在单片机运行过程中,只能读数组,是不能写的。这样,数组做为数表定义存放在程序区,声明数组时加code即可。

  • 能干的石头
    2023-02-16 17:42:26

    AT89cxx加密原理

    单片机解密简单就是擦除单片机片内的加密锁定位。由于AT89C系列单片机擦除操作时序设计上的不合理。使在擦除片内程序之前首先擦除加密锁定位成为可能。AT89C系列单片机擦除操作的时序为:擦除开始---->擦除操作硬件初始化(10微秒)---- >擦除加密锁定位(50----200微秒)--->擦除片内程序存储器内的数据(10毫秒)----->擦除结束。如果用程序监控擦除过程,一旦加密锁定位被擦除就终止擦除操作,停止进一步擦除片内程序存储器,加过密的单片机就变成没加密的单片机了。片内程序可通过总线被读出。对于 AT89C系列单片机有两种不可破解的加密方法。

    一、永久性地破坏单片机的加密位的加密方法。简称OTP加密模式。

    二、永久性地破坏单片机的数据总线的加密方法。简称烧总线加密模式。

    一、OTP加密模式原理

    这种编程加密算法烧坏加密锁定位(把芯片内的硅片击穿),面不破坏其它部分,不占用单片机任何资源。加密锁定位被烧坏后不再具有擦除特性, 89C51/52/55有3个加密位进一步增加了加密的可靠性。一旦用OTP模式加密后,单片机片内的加密位和程序存储器内的数据就不能被再次擦除, 89C51/52/55单片机就好象变成了一次性编程的OTP型单片机一样。如果用户程序长度大于89C51单片机片内存储器的容量,也可使用OPT模式做加密,具体方法如下:

    1、按常规扩展一片大容量程序存储器,如27C512(64K)。

    2、把关键的程序部分安排在程序的前4K中。

    3、把整个程序写入27C512,再把27C512的前4K填充为0。

    4、把程序的前4K固化到AT89C51中,用OPT模式做加密。

    5、把单片机的EA脚接高电平。

    这样程序的前4K在单片机内部运行,后60K在片外运行。盗版者无法读出程序的前4K程序,即使知道后60K也无济于事。

    二、炼总线加密模式原理

    因为单片机片内的程序代码最终都要通过数据总线读出,如果指导单片机的数据总线的其中一条线永久性地破坏,解密者即使擦除了加密位,也无法读出片内的程序的正确代码。89C1051/2051的数据总线为P1口烧总线模式烧坏89C2051的P1.0端口,原程序代码为02H、01H、00H。读出的数据则为03H,01H,00H。其中最低位始终为1,读出的程序代码显然为错码。这种加密模式用于加密89C1051/2051单片机。缺点是占用单片机的资源。开发设计人员在设计单片机硬件系统时只要预留出口线P1.0不用,以后就可用烧总线模式对单片机加密。

  • 爱笑的洋葱
    2023-02-16 17:42:26

    汇编指令这样写:

    在程序开头设置玩芯片信息即:list=xxx芯片后,用“__CONFIG”来配置,注意,这里的“__”是两个下划线,不是一个。CONFIG后面空格接各个配置位。例如:

    __CONFIG _WDT_OFF &_BODEN_OFF &_PWRTE_ON &_XT_OSC

    我用的芯片是16F873,配置字关闭了看门狗“_WDT_OFF”,关闭掉电检测“_BODEN_OFF”,打开上电复位“_PWRTE_ON”,振荡电路选外部标准晶振“_XT_OSC”。PIC各个不同型号的芯片之间有不同的配置位,你用那款芯片就去microchip的网站找这芯片的数据手册,里面有这芯片涉及到的配置位说明。

    对于C语言程序:

    也是“__CONFIG”用来设置配置位,但格式稍稍不同

    __CONFIG { WDTDIS &BORDIS &PWRTEN &XT }

  • 忧郁的流沙
    2023-02-16 17:42:26

    #include <HT66F2390.h>

    #include "MyType.h"

    #define LED_Port _pg //宏定义引脚

    #define LED_PortC _pgc //宏定义引脚属性的方向

    void Delayms(u16) //延时函数

    void main()

    { _wdtc=0b10101111 //关狗

    LED_PortC=0x0 //设置 LED_Port 为输出模式

    LED_Port=0xFE //设置 LED_Port 初值

    while(1)

    { while(LED_Port &0b10000000) //若MSB不为0返回继续

    { Delayms(500)

    GCC_RL(LED_Port) //左移

    }

    while(LED_Port &0b00000001) //若LSB不为0返回继续

    { Delayms(500)

    GCC_RR(LED_Port) //右移

    }

    }

    }

    void Delayms(u16 del) //延时del*200指令周期

    { u16 i //fSYS=8MH,延时del*1ms

    for(i=0i<deli++) GCC_DELAY(2000)

    }

  • 端庄的鱼
    2023-02-16 17:42:26

    在51单片机中,只要将一个值传送给累加器,这个数的奇偶校验值就会影响P。一般而言,在串行通讯中为确保传输数的准确,用到校验位的情况比较多。以下是程序代码:

    #include<reg51.h>

    main()

    {

    char dat

    TMOD=0x20

    TH1=0xfd

    TL1=0xfd

    TR1=1

    SCON=0xd0

    while(1)

    {

    dat++

    ACC=dat

    TB8=P //校验位送第九数据位TB8

    SBUF=ACC

    while(TI==0)

    TI=0

    }

    }

  • 忧伤的手链
    2023-02-16 17:42:26

    IO口的输入输出是通过对单片机寄存器的配置来实现的。

    C51的单片机IO口本来就是双向的不需要设置。

    STM32单片机的IO口用C语言的设置方法如下:

    void LED_Config(void)

    {

    GPIO_InitTypeDef GPIO_Structure

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)

    //PC10-LED(指示灯)

    GPIO_Structure.GPIO_Pin = GPIO_Pin_10

    GPIO_Structure.GPIO_Speed = GPIO_Speed_2MHz

    GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP

    GPIO_Init(GPIOC,&GPIO_Structure) //LED

    }

  • 刻苦的鲜花
    2023-02-16 17:42:26

    在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。

      串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

    方式0的波特率 =  fosc/12

    方式2的波特率 =(2SMOD/64)· fosc

    方式1的波特率 =(2SMOD/32)·(T1溢出率)

    方式3的波特率 =(2SMOD/32)·(T1溢出率)

        当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。

           T1 溢出率 = fosc /{12×[256 -(TH1)]}

       在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。