找回密码
 立即注册
查看: 2562|回复: 18

自动增量/做自己的全球唯一产品ID/动态密码

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-7-14 13:48:32 | 显示全部楼层 |阅读模式

相信用过单片机的朋友都知道一般的单片机都有这种号称全球唯一的ID号,甚至有的公司还可以用和这个ID号推算这是第几批次的芯片,例如STC的芯片的ID号获取方法就如下面的图片所示。



当然看到这里,估计不少人会思考,那自己有没有办法在程序里也加个自己产品的全球唯一ID号的,我也想从一个指定编号编起,比如我从0开始,生产了几个这个编号就变成几,方便自己的管理。这里其实方法也不少,
方案一:这里很多人就会想到首先是一个宏定义直接定义一个ID号,例如
  1. #define  ID  0x00000000
复制代码
当然问题也很明显,就是每次下载一个程序就要开始重新修改下数值,编译一下程序,而且还容易改错,那么就有了如下的这个

方案二:串口修改数据
每次下载完程序之后,手动的用串口发送一个数据给单片机,作为ID号保存到EEPROM里,但是每次还是需要手动的修改这个参数,但是不需要重复的去编译程序了, 虽然能解决一些问题但是还是没有办法从源头解决问题



方案三:通过单独的MCU制作一个ID号生成工具或者制作一个上位机,每次程序下载完成之后,将板子连接上位机或者这个工具,然后第二次写入数据,写入成功之后序号自加,虽然能解决手动写入出错的可能,但是也增大了操作的工作量,换我我也不愿意这么干!


那么我们有没有办法能把下载和这个编码一步搞定呢?!很明显答案是有的,没有的话到这里这个帖子就全剧终了!



这里就可以用到这个自动增量的界面,当然这部分的资料可能不是特别多,导致很多人都不知道这个神奇的功能,那这里统一来讲解下。
首先顾名思义,这个自动增量的字面意思就是说,可以往某个指定的地址里写入数据,且这个数据可以实现自动增量,比如从0开始写,写完一次变成1,在写一次变成2,在写一次变成3等等
这里可以通过存储地址设置保存的数据的地址,增量长度用来确定这是几个字节的数据,当前值就是即将要写入的数据,递增值就是每次写完之后数据需要自加多少,存储格式按自己的需要设置就好
注意这里要区分的就是存储在用户代码区还是存储在EEPROM区,且存的时候千万不要覆盖了原本的数据。例如程序占用了从地址0开始的200字节的eeprom,结果这个自动增量数据设置在了地址0就完犊子了。

这里以STC32举例。



STC32的程序区是从0XFF0000开始的64K字节,EEPROM是从0XFE0000的最大64K字节。且需要注意的是,自动增量页面的地址会自动从0XFE0000开始偏移!意思就是说,写入地址0,实际上写入的就是0XFE0000的地址
所以由此可得知



上述页面的存储地址 在0 - 0x9999之间,



上述页面的存储地址 在0x10000 - 0x19999之间,因为0X10000+0XFF0000就是程序区的0XFF0000.


所以确定了地址之后这里就可以这样写入了,配置内容按照自己的需求自定义即可。这里需要注意下,程序区和EEPROM区有什么区别,程序区的数据只有下载的时候才能修改,但是EEPROM区域的数据就可以用程序动态的修改,所以有ID之类固定的就可以写死在用户代码区,而初始密码之类的就可以写在EEPROM区。

上述已经设置好了ISP软件上的物理位置,那我们怎么在程序中区调用这个位置的数据呢,这里可以直接用到一个强大的关键词  _at_  ,他可以强制访问绝对地址,只需要在定义变量或者常量的时候在末尾加上这个即可,例如
  1. const unsigned long  id                 _at_ 0xFffffc;                //这个不可修改的id ,定义在程序区域
  2. const unsigned long  passward         _at_ 0xFE0001;                //这个可修改的密码,定义在EEPROM区域
复制代码
这样就可以从绝对地址访问数据了,这里我将密码数据定义了一个32位的长整数,放置在了0XFE0001的区域,也就是EEPROM的0地址,且32位的变量最大数值可以为



这里定义一个8位的数字密码绰绰有余!!!


这里将ID定义了在了0xFffffc,这里是将数据保存在了程序区的最末尾,防止用户程序干扰他。且id可以到42亿多,完全够用了。
最后找一个现成的串口1的程序,在编写一段串口打印id和密码的一个程序
  1. sprintf(dat,"当前序列:%lu\r\n",id);
  2.         PrintString1(dat);
  3.        
  4.         sprintf(dat,"当前密码:%lu\r\n",passward);
  5.         PrintString1(dat);
复制代码
这样单片机端的程序就编写完成了,超级简单!直接下载进单片机里,再来修改ISp软件上的数据



先修改程序区的,这里地址写0X1FBFF,这里需要注意的是这个地址有0x400的偏移,写的是0x1fbff,但是实际的地址是在0xfe0000 + 0x1fbff+0x400的位置,所以可以看到这里修改完之后这个数据位于程序区的0XFFFFFC-0XFFFFFF,所以我们单片机的程序的地址写的就是0xFffffc!这样这个程序区的ID就对上了。





再来看这个EEPROM的数据,这里写入的地址是4,增量长度4字节,当前值1,增量值1,可以看到这个EEPROM文件里首字节是0xff,然后紧接着4个字节就是我们的增量数据,这里写入的是1,可以看到地址0xfe0001-0xfe0004就是我们的数据,所以单片机程序地址就是0xfe0001,这样配置完成之后我们下载下程序来看看效果!!




可以看到串口直接打印出了我们预算的参数,且原本的自动增量窗口的当前值也已经发生了变化,再次下载观察下效果



是不是就实现了我们的预期功能,这个功能可以轻松的视线我们的全球唯一产品ID,或者动态的密码,且不需要我们手动的去重复编译程序!!

自动增量测试.rar

47.9 KB, 下载次数: 171

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2023-7-20 15:19:14 | 显示全部楼层
STC-ISP的宝藏应用
自动增量 有些客户称之为滚动烧写  实用!!
热线19952583534
www.STCAI.com
回复 支持 反对

使用道具 举报 送花

2

主题

2

回帖

24

积分

新手上路

积分
24
发表于 2023-7-21 11:46:59 | 显示全部楼层
有什么用,ID号一号,解密后,原封不动,直接写入MCU, 照样运行。

点评

正确,必须绑定硬件,纯软件方法可以被全套复制  发表于 2024-2-10 20:14
不得不说学会举一反三比动嘴皮子有用! 1.首先这个产品ID可以写入MCU的ID号,不匹配就禁止运行程序,这样“解密后,原封不动,直接写入MCU”的问题就不存在了 2.这个产品ID可以用来给产品做动态密码的,比如客户尾款  详情 回复 发表于 2023-11-15 08:14
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-11-15 08:14:46 | 显示全部楼层
bulk*** 发表于 2023-7-21 11:46
有什么用,ID号一号,解密后,原封不动,直接写入MCU, 照样运行。

不得不说学会举一反三比动嘴皮子有用!
1.首先这个产品ID可以写入MCU的ID号,不匹配就禁止运行程序,这样“解密后,原封不动,直接写入MCU”的问题就不存在了
2.这个产品ID可以用来给产品做动态密码的,比如客户尾款没付,定时一个月锁机,锁机之后根据这两串号码加一个特定的算法计算密码的,分12期付钱的话会动态生成12组密码,客户报这两串数字来领取密码
3.产品出售之后,尤其是贵重的设备可以登记产品ID和客户信息,如果说后期市面上出现了大批量的这个ID的复制品,那么谁的泄密问题就很那啥了~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:117
  • 最近打卡:2024-04-25 05:05:05

0

主题

43

回帖

114

积分

注册会员

积分
114
发表于 2023-12-7 19:34:32 | 显示全部楼层
感谢分享
心里装着小星星生活才能亮晶晶
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2024-11-22 14:52:51

1

主题

8

回帖

845

积分

高级会员

积分
845
发表于 2023-12-26 22:57:35 | 显示全部楼层
感谢分享,正想了解怎么将产品ID编号写入芯片中。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-01 14:39:53
已绑定手机

5

主题

49

回帖

1179

积分

金牌会员

积分
1179
发表于 2024-1-9 10:20:14 | 显示全部楼层
谢谢你,在实际项目中可以用来当作遥控器的识别ID,避免了遥控器一对多的问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:133
  • 最近打卡:2025-04-30 13:40:52

13

主题

65

回帖

594

积分

高级会员

积分
594
发表于 2024-1-9 14:18:28 | 显示全部楼层
什么价位的产品需要这种加密功能?来聊一聊
回复 支持 反对

使用道具 举报 送花

2

主题

4

回帖

18

积分

新手上路

积分
18
发表于 2024-1-26 09:24:40 | 显示全部楼层
楼主能做一个 STC-ISP自带的ID号加密的例子么?几个地址设置,如何读不是很清楚
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-03-01 16:21:56

0

主题

1

回帖

6

积分

新手上路

积分
6
发表于 2024-3-1 16:36:01 | 显示全部楼层
本帖最后由 qq250061277 于 2024-3-1 16:37 编辑

还是一头雾水,在8H3k64s4上操作,遇到了很多问题,8h的手册上没有程序区从多少开始到多少结束,也不知道在哪里查,也就不知道偏移量,是不是isp软件上的右边程序文件上,显示在什么地址上就在那个地址上? 另外,那个地址在程序中进行绝对地址定义的时候,会出现main.c(19): error C274: 'danpianji_id': absolute specifier illegal错误,前面需要加 xdata才行
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:32 , Processed in 0.227766 second(s), 123 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表