找回密码
 立即注册
查看: 2336|回复: 5

读取全球唯一ID号,有三种方式,用哪种最好呢 | CHIPID

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:238
  • 最近打卡:2026-05-09 08:52:01
已绑定手机

118

主题

982

回帖

2939

积分

超级版主

积分
2939
QQ
发表于 2023-2-23 14:13:16 | 显示全部楼层 |阅读模式
读取全球唯一ID好,有三种方式,用哪种最好呢-1.png

===有CHIP-ID的就从CHIP-ID中读,后续新产品只有这种手段了
热线19952583534
www.STCAI.com
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:238
  • 最近打卡:2026-05-09 08:52:01
已绑定手机

118

主题

982

回帖

2939

积分

超级版主

积分
2939
QQ
发表于 2023-2-23 14:13:36 | 显示全部楼层
有CHIPID的芯片必需从CHIPID读取(RAM与ROM不再存放)。没有CHIPID的芯片建议从ROM读取,因为RAM里面内容可能会被变量或者堆栈覆盖。
1.png
热线19952583534
www.STCAI.com
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:238
  • 最近打卡:2026-05-09 08:14:18
已绑定手机

16

主题

68

回帖

980

积分

高级会员

积分
980
发表于 2025-6-10 14:12:36 | 显示全部楼层
国学*** 发表于 2023-2-23 14:13
有CHIPID的芯片必需从CHIPID读取(RAM与ROM不再存放)。没有CHIPID的芯片建议从ROM读取,因为RAM里面内容可 ...

是在下载时候读取吗
你先做了,再说话。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:885
  • 最近打卡:2026-05-10 01:21:02

14

主题

1364

回帖

7390

积分

论坛元老

积分
7390
发表于 2025-6-20 11:20:51 | 显示全部楼层
不是*** 发表于 2025-6-10 14:12
是在下载时候读取吗

可以用程序读取。
  1. 读取全球唯一 ID 号
  2. STC32G12K128
  3. 11.5.2 读取全球唯一 ID 号
  4. //测试工作频率为 11.0592MHz
  5. //#include "stc8h.h"
  6. #include "stc32g.h"                    //头文件见下载软件
  7. #include "intrins.h"
  8. #define FOSC 11059200UL                //定义为无符号长整型,避免计算溢出
  9. #define BRT (65536 - (FOSC / 115200+2) / 4)
  10.                                        //加 2 操作是为了让 Keil 编译器
  11.                                        //自动实现四舍五入运算
  12. #define ID_ADDR (&CHIPID0)
  13. bit busy;
  14. void UartIsr() interrupt 4
  15. {
  16.         if (TI)
  17.         {
  18.                 TI = 0;
  19.                 busy = 0;
  20.         }
  21.         if (RI)
  22.         {
  23.                 RI = 0;
  24.         }
  25. }
  26. void UartInit()
  27. {
  28.         SCON = 0x50;
  29.         TMOD = 0x00;
  30.         TL1 = BRT;
  31.         TH1 = BRT >> 8;
  32.         TR1 = 1;
  33.         T1x12 = 1;
  34.         busy = 0;
  35. }
  36. void UartSend(char dat)
  37. {
  38.         while (busy);
  39.         busy = 1;
  40.         SBUF = dat;
  41. }
  42. void main()
  43. {
  44.         char i;
  45.         EAXFR = 1;                         //使能访问 XFR,没有冲突不用关闭
  46.         CKCON = 0x00;                      //设置外部数据总线速度为最快
  47.         WTST = 0x00;                       //设置程序代码等待参数,
  48.                                            //赋值为 0 可将 CPU 执行程序的速度设置为最快
  49.         P0M0 = 0x00;        P0M1 = 0x00;
  50.         P1M0 = 0x00;        P1M1 = 0x00;
  51.         P2M0 = 0x00;        P2M1 = 0x00;
  52.         P3M0 = 0x00;        P3M1 = 0x00;
  53.         P4M0 = 0x00;        P4M1 = 0x00;
  54.         P5M0 = 0x00;        P5M1 = 0x00;
  55.         UartInit();
  56.         ES = 1;
  57.         EA = 1;
  58.         for (i=0; i<7; i++)
  59.         {
  60.                 UartSend(ID_ADDR[i]);
  61.         }
  62.         while (1);
  63. }
  64. 10.5.4 读取全球唯一 ID 号 (从 CHIPID 中读取)
  65. C 语言代码
  66. //测试工作频率为 11.0592MHz
  67. #include "ai8h.h"
  68. #include "intrins.h"
  69. #define FOSC 11059200UL
  70. #define BRT (65536 - (FOSC / 115200+2) / 4)
  71. //加 2 操作是为了让 Keil 编译器
  72. //自动实现四舍五入运算
  73. #define CPUIDBASE 0xfde0
  74. #define ID_ADDR ((unsigned char volatile xdata *)(CPUIDBASE + 0x00))
  75. bit busy;
  76. void UartIsr() interrupt 4
  77. {
  78.         if (TI)
  79.         {
  80.                 TI = 0;
  81.                 busy = 0;
  82.         }
  83.         if (RI)
  84.         {
  85.                 RI = 0;
  86.         }
  87. }
  88. void UartInit()
  89. {
  90.         SCON = 0x50;
  91.         TMOD = 0x00;
  92.         TL1 = BRT;
  93.         TH1 = BRT >> 8;
  94.         TR1 = 1;
  95.         AUXR = 0x40;
  96.         busy = 0;
  97. }
  98. void UartSend(char dat)
  99. {
  100.         while (busy);
  101.         busy = 1;
  102.         SBUF = dat;
  103. }
  104. void main()
  105. {
  106.         char i;
  107.         P_SW2 |= 0x80;                     //使能访问 XFR,没有冲突不用关闭
  108.         P0M0 = 0x00;        P0M1 = 0x00;
  109.         P1M0 = 0x00;        P1M1 = 0x00;
  110.         P2M0 = 0x00;        P2M1 = 0x00;
  111.         P3M0 = 0x00;        P3M1 = 0x00;
  112.         P4M0 = 0x00;        P4M1 = 0x00;
  113.         P5M0 = 0x00;        P5M1 = 0x00;
  114.         UartInit();
  115.         ES = 1;
  116.         EA = 1;
  117.         for (i=0; i<7; i++)
  118.         {
  119.                 UartSend(ID_ADDR[i]);
  120.         }
  121.         while (1);
  122. }
  123. 12.5.2 读取全球唯一 ID 号
  124. //测试工作频率为 11.0592MHz
  125. #include "Ai8051U.H"                        //头文件见下载软件
  126. #include "intrins.h"                        //使用_nop_()函数所必须要包含的头文件,
  127. //否则延时函数中调用的_nop_()函数没有被头文件引用过来,会导致编译器找不到这个而函数而报错。
  128. #define FOSC 11059200UL                     //定义为无符号长整型,避免计算溢出
  129. #define BRT (65536 - (FOSC / 115200+2) / 4)
  130.                                             //加 2 操作是为了让 Keil 编译器
  131.                                             //自动实现四舍五入运算
  132. #define ID_ADDR (&CHIPID0)
  133. bit busy;
  134. void UartIsr() interrupt 4
  135. {
  136.         if (TI)
  137.         {
  138.                 TI = 0;
  139.                 busy = 0;
  140.         }
  141.         if (RI)
  142.         {
  143.                 RI = 0;
  144.         }
  145. }
  146. void UartInit()
  147. {
  148.         SCON = 0x50;
  149.         TMOD = 0x00;
  150.         TL1 = BRT;
  151.         TH1 = BRT >> 8;
  152.         TR1 = 1;
  153.         T1x12 = 1;
  154.         busy = 0;
  155. }
  156. void UartSend(char dat)
  157. {
  158.         while (busy);
  159.         busy = 1;
  160.         SBUF = dat;
  161. }
  162. void main()
  163. {
  164.         char i;
  165.         EAXFR = 1;                              //允许访问扩展的特殊寄存器,XFR
  166.                                                 //(32 位模式请使用这句,注释下一句)
  167.         // P_SW2 |= 0x80;                       //允许访问扩展的特殊寄存器,XFR
  168.                                                 //(8 位模式请使用这句,注释上一句)
  169.         WTST = 0;                               //设置取程序代码等待时间,
  170.                                                 //赋值为 0 表示不等待,程序以最快速度运行
  171.         CKCON = 0;                              //设置访问片内的 xdata 速度,
  172.                                                 //赋值为 0 表示用最快速度访问,不增加额外的等待时间
  173.         P0M0 = 0x00;        P0M1 = 0x00;
  174.         P1M0 = 0x00;        P1M1 = 0x00;
  175.         P2M0 = 0x00;        P2M1 = 0x00;
  176.         P3M0 = 0x00;        P3M1 = 0x00;
  177.         P4M0 = 0x00;        P4M1 = 0x00;
  178.         P5M0 = 0x00;        P5M1 = 0x00;
  179.         UartInit();
  180.         ES = 1;
  181.         EA = 1;
  182.         for (i=0; i<7; i++)
  183.         {
  184.                 UartSend(UartSend(ID_ADDR[i]);
  185.         }
  186.         while (1);
  187. }
复制代码

点评

UartSend(ID_ADDR); 是复制错误吧,应该是UartSend(ID_ADDR[i]);  发表于 2025-12-26 09:58
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:885
  • 最近打卡:2026-05-10 01:21:02

14

主题

1364

回帖

7390

积分

论坛元老

积分
7390
发表于 2025-12-26 11:38:07 | 显示全部楼层
angm*** 发表于 2025-6-20 11:20
可以用程序读取。

是的,给系统去掉了

UartSend(ID_ADDR); 是复制错误吧,应该是UartSend(ID_ADDR);

  1. UartSend(ID_ADDR); 是复制错误吧,应该是UartSend(ID_ADDR[i]);
复制代码


回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-5-10 22:23 , Processed in 0.116368 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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