PIC单片机该怎么加密

见过很多初学者对PIC16系列单片机的ID码的读和写犯迷糊。说实话,这方面的资料也不怎么全。有些教材可能会涉及ID区域的介绍,可是往往是一代而过。这对初学者来说是比较容易犯错的地方。今天有空,对相关的问题作了一些整理,分享给大家。可能有些地方说的不够妥当,欢迎大家多多探讨。


        1.什么是ID区域?


ID区域是独立于EEPROM,FLASH,RAM的区域。程序设计人员可以利用该区域存放软件的版本号,编写日期,烧录日期,产品标识等信息。不过该区域很小PIC16系列只能存放4个字节。


       2.ID码怎么烧录到ID区域里面去?


可以利用PICC自带的宏命令IDLOC(X)来实现。具体操作如下:


.....................................//头文件  其它宏定义


__IDLOC(76F4);         //注意:前面是两个下划线。括号里面最多可以有2个字节


void main()


{


...................................//程序主体


 


}


编译以后再用烧录工具烧到单片机中即可。这里要提醒一下,IDLOC(X)里面最多有2个字节的16进制数,超过部分会无效。比如你写个987FE3,E3会丢掉。另外得说一下这两个16进制数在ID区域是怎么放的。我们已经知道IDLOC(X)里面能又个字节,而ID区域能放4个字节。以X=76F4为例,它们是这样放的07060F04。也就是说,在每个16进制数前加1个0。如果你写的不是2个字节的16进制数,比如是1个字节的78。编译器会在前面补0,那就成了0078。写到ID区域的就是00000708


 


3.ID码怎么读出来?


可以通过烧录工具跟编译器配合读出来。我用的是PICC跟ICD2。连好线,单片机上电以后,在编程模式下,通过执行Read Target Device操作,然后在Configure菜单下的Id memory


选项可以看到刚才编程的时候设置的ID码。




其实,多数PIC都没有唯一ID,有人通过烧断PIC读出总线来实现加密,但设备需要自制。
只要是市场上大量销售的芯片,解密都不是什么麻烦事,只能尽量用新型号或者生僻的型号。

有人用MCU内部的EEPROM这么搞过,但不是这么简单的这么搞,对于大批量生产来说,还需要一些技巧才能比较好的处理这个问题。
1、设置一个自检程序,通过特殊操作(我有一个自制工装,可以把MCU的各个相关IO强行固定在某个逻辑电平上,软件判断逻辑组合,必须符合一个特定组合才能进入特殊操作启动代码,UART接受工装的通信数据,通信数据传入EEPROM要被擦写的次数和位置等)。
2、进入自检后,MCU疯狂的擦写EEPROM中设定的某个位置(适当提高一点VCC电压以加快失效),最多擦写200万次后停止操作,一般MCU自带的EEPROM擦写次数都不到100万次,EEPROM某个字节在0XAA和0X55之间不断的被循环擦写。
3、这个擦写的时间还是比较长的,一般要数十分钟以上,我一般放在产品通电老化阶段进行这个自检程序(产品一般要在老化房4~6个小时候通电老化时间,自检程序兼容这个时间执行,避免产生新的工时损失)
4、擦写过程中在RAM中记录EEPROM该字节失效时的操作次数,并存入到EEPROM其他字节中。
5、产品正常销售中,执行APP用户程序,继续不断的擦写那个失效字节,如果不能擦写,则说明加密成功,否则有另一个纠错程序就不讲了,各位可以自行想办法。


下面是一段用汇编语言实现的模拟琴键的代码,使用数字键1~8模拟琴键1~1(高音),并通过PC扬声器发出相应的音调: ``` .MODEL SMALL .STACK 100H .DATA NOTE1 DB 0C9H ;音调1的频率值 NOTE2 DB 0D1H ;音调2的频率值 NOTE3 DB 0D9H ;音调3的频率值 NOTE4 DB 0E1H ;音调4的频率值 NOTE5 DB 0E9H ;音调5的频率值 NOTE6 DB 0F1H ;音调6的频率值 NOTE7 DB 0F9H ;音调7的频率值 NOTE8 DB 101H ;音调8的频率值 .CODE MAIN PROC MOV AX, @DATA MOV DS, AX ;初始化数据段寄存器 MOV DX, 61H MOV AL, 0B6H OUT DX, AL ;初始化PC扬声器控制寄存器 WAIT: IN AL, 60H CMP AL, 31H JE PLAY1 CMP AL, 32H JE PLAY2 CMP AL, 33H JE PLAY3 CMP AL, 34H JE PLAY4 CMP AL, 35H JE PLAY5 CMP AL, 36H JE PLAY6 CMP AL, 37H JE PLAY7 CMP AL, 38H JE PLAY8 JMP WAIT PLAY1: MOV AL, NOTE1 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT PLAY2: MOV AL, NOTE2 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT PLAY3: MOV AL, NOTE3 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT PLAY4: MOV AL, NOTE4 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT PLAY5: MOV AL, NOTE5 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT PLAY6: MOV AL, NOTE6 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT PLAY7: MOV AL, NOTE7 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT PLAY8: MOV AL, NOTE8 OUT 42H, AL MOV AL, AH OUT 42H, AL MOV AL, 0B6H OUT DX, AL JMP WAIT MAIN ENDP END MAIN ``` 在这段代码中,我们使用了8254芯片控制PC扬声器的工作频率,通过按下数字键1~8来选择不同的音调,同时使用了循环来不断等待键盘输入。注意,这段代码只能在实模式下运行,而且需要在DOS或类DOS操作系统下运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值