历史上的今天
今天是:2024年12月27日(星期五)
2019年12月27日 | PIC16系列单片机的ID码解读
2019-12-27 来源:elecfans
见过很多初学者对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用户程序,继续不断的擦写那个失效字节,如果不能擦写,则说明加密成功,否则有另一个纠错程序就不讲了,各位可以自行想办法。
史海拾趣
|
书籍推荐《Multisim 10&Ultiboard 10原理图仿真与PCB设计》 本帖最后由 dontium 于 2015-1-23 11:49 编辑 前 言 2007年3月,美国国家仪器有限公司(National Instruments)推出了NI Circuit Design Sutie 10套件。本书结合设计实例介绍了套件中的Multisim 10和Ultiboard 10软件。与其他同类软件相比, ...… 查看全部问答> |
|
现在大多数人都已经知道,LED是一种节能减排的新光源。但是还有一个很大的优点却经常被忽略,那就是无污染和环保。我们知道汞是一种极其有毒的物质,然而几乎大多数目前采用的高效电光源中都含有汞,各种电光源的含汞量如下表所示: 而汞的沸点 ...… 查看全部问答> |
|
我用流接口写了一个4*6的矩阵键盘驱动程序,现在需要将对应的按键与像PC机的键盘上的部分功能键对应起来,请问具体要如何对应呢? 具体我将每一个按键对应一个码,通过SendNotifyMessage()函数发送消息给应用,同时自己写了一个简单的WIN32应用程 ...… 查看全部问答> |
|
在程序测试串口与GPRS MODEM是否连通,发“at”返回“ok” 这样写: sp.WriteLine(\"at\\r\"); string str = sp.ReadLine(); 运行后就没反应了, ...… 查看全部问答> |
|
小弟初学WDM,发现很多例子中都要指定函数的分页或分段,如下所示: #pragma alloc_text(INIT, DriverEntry) #pragma alloc_text(PAGE, Example_Unload) 请问这样有什么特别的用途吗?好像不加这两句程序也能正常运行!… 查看全部问答> |
|
问一个问题:怎样在keil中使用扩展存储器,比如89c51+2764(8k*8 rom)两种情况:1.程序大于4k,比如是6k,那么我生成了hex文件(是连续的)后,怎样分开分别向芯片中烧制呢?2.程序小于4k比如是2k,但是将一部分放入89c51中,比如1k,将另一部分1k ...… 查看全部问答> |
|
Cyclone V GX试用报告--高频超声数据采集系统 首先感谢EEworld网站和Altera公司联合提供了这么好的活动,使得我有机会接触到Altera最新的Cyclone系列的FPGA。本次评估的目的是借助Altera 提供的Cyclone V GX FPGA开发板的平台来验证一 ...… 查看全部问答> |
|
quarus ii中的signal tap是否可以复制多个node 之前一直使用Xilinx的ISE进行开发,使用chipscope看波形时可以将探针信号进行复制、重新编组等操作,很方便。现在刚开始用Quartus ii 9.1,在使用signal tap上板调试时,发现没有办法复制node。 比如信号 a位宽为32位,第一拍,第二拍和第三拍的数 ...… 查看全部问答> |




