国学芯用 发表于 2023-2-23 14:13:16

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



===有CHIP-ID的就从CHIP-ID中读,后续新产品只有这种手段了

国学芯用 发表于 2023-2-23 14:13:36

有CHIPID的芯片必需从CHIPID读取(RAM与ROM不再存放)。没有CHIPID的芯片建议从ROM读取,因为RAM里面内容可能会被变量或者堆栈覆盖。

不是很牛逼 发表于 2025-6-10 14:12:36

国学芯用 发表于 2023-2-23 14:13
有CHIPID的芯片必需从CHIPID读取(RAM与ROM不再存放)。没有CHIPID的芯片建议从ROM读取,因为RAM里面内容可 ...

是在下载时候读取吗

angmall 发表于 2025-6-20 11:20:51

不是很牛逼 发表于 2025-6-10 14:12
是在下载时候读取吗
可以用程序读取。



读取全球唯一 ID 号
STC32G12K128
11.5.2 读取全球唯一 ID 号

//测试工作频率为 11.0592MHz
//#include "stc8h.h"
#include "stc32g.h"                  //头文件见下载软件
#include "intrins.h"
#define FOSC 11059200UL                //定义为无符号长整型,避免计算溢出
#define BRT (65536 - (FOSC / 115200+2) / 4)
                                       //加 2 操作是为了让 Keil 编译器
                                       //自动实现四舍五入运算
#define ID_ADDR (&CHIPID0)
bit busy;
void UartIsr() interrupt 4
{
      if (TI)
      {
                TI = 0;
                busy = 0;
      }
      if (RI)
      {
                RI = 0;
      }
}
void UartInit()
{
      SCON = 0x50;
      TMOD = 0x00;
      TL1 = BRT;
      TH1 = BRT >> 8;
      TR1 = 1;
      T1x12 = 1;
      busy = 0;
}
void UartSend(char dat)
{
      while (busy);
      busy = 1;
      SBUF = dat;
}
void main()
{
      char i;
      EAXFR = 1;                         //使能访问 XFR,没有冲突不用关闭
      CKCON = 0x00;                      //设置外部数据总线速度为最快
      WTST = 0x00;                     //设置程序代码等待参数,
                                           //赋值为 0 可将 CPU 执行程序的速度设置为最快

      P0M0 = 0x00;      P0M1 = 0x00;
      P1M0 = 0x00;      P1M1 = 0x00;
      P2M0 = 0x00;      P2M1 = 0x00;
      P3M0 = 0x00;      P3M1 = 0x00;
      P4M0 = 0x00;      P4M1 = 0x00;
      P5M0 = 0x00;      P5M1 = 0x00;
      UartInit();
      ES = 1;
      EA = 1;
      for (i=0; i<7; i++)
      {
                UartSend(ID_ADDR);
      }
      while (1);
}







10.5.4 读取全球唯一 ID 号 (从 CHIPID 中读取)
C 语言代码
//测试工作频率为 11.0592MHz
#include "ai8h.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - (FOSC / 115200+2) / 4)
//加 2 操作是为了让 Keil 编译器
//自动实现四舍五入运算
#define CPUIDBASE 0xfde0
#define ID_ADDR ((unsigned char volatile xdata *)(CPUIDBASE + 0x00))
bit busy;
void UartIsr() interrupt 4
{
      if (TI)
      {
                TI = 0;
                busy = 0;
      }
      if (RI)
      {
                RI = 0;
      }
}
void UartInit()
{
      SCON = 0x50;
      TMOD = 0x00;
      TL1 = BRT;
      TH1 = BRT >> 8;
      TR1 = 1;
      AUXR = 0x40;
      busy = 0;
}
void UartSend(char dat)
{
      while (busy);
      busy = 1;
      SBUF = dat;
}
void main()
{
      char i;
      P_SW2 |= 0x80;                     //使能访问 XFR,没有冲突不用关闭
      P0M0 = 0x00;      P0M1 = 0x00;
      P1M0 = 0x00;      P1M1 = 0x00;
      P2M0 = 0x00;      P2M1 = 0x00;
      P3M0 = 0x00;      P3M1 = 0x00;
      P4M0 = 0x00;      P4M1 = 0x00;
      P5M0 = 0x00;      P5M1 = 0x00;
      UartInit();
      ES = 1;
      EA = 1;
      for (i=0; i<7; i++)
      {
                UartSend(ID_ADDR);
      }
      while (1);
}






12.5.2 读取全球唯一 ID 号
//测试工作频率为 11.0592MHz
#include "Ai8051U.H"                        //头文件见下载软件
#include "intrins.h"                        //使用_nop_()函数所必须要包含的头文件,
//否则延时函数中调用的_nop_()函数没有被头文件引用过来,会导致编译器找不到这个而函数而报错。

#define FOSC 11059200UL                     //定义为无符号长整型,避免计算溢出
#define BRT (65536 - (FOSC / 115200+2) / 4)
                                          //加 2 操作是为了让 Keil 编译器
                                          //自动实现四舍五入运算
#define ID_ADDR (&CHIPID0)
bit busy;
void UartIsr() interrupt 4
{
      if (TI)
      {
                TI = 0;
                busy = 0;
      }
      if (RI)
      {
                RI = 0;
      }
}
void UartInit()
{
      SCON = 0x50;
      TMOD = 0x00;
      TL1 = BRT;
      TH1 = BRT >> 8;
      TR1 = 1;
      T1x12 = 1;
      busy = 0;
}
void UartSend(char dat)
{
      while (busy);
      busy = 1;
      SBUF = dat;
}
void main()
{
      char i;
      EAXFR = 1;                              //允许访问扩展的特殊寄存器,XFR
                                                //(32 位模式请使用这句,注释下一句)
      // P_SW2 |= 0x80;                     //允许访问扩展的特殊寄存器,XFR
                                                //(8 位模式请使用这句,注释上一句)
      WTST = 0;                               //设置取程序代码等待时间,
                                                //赋值为 0 表示不等待,程序以最快速度运行
      CKCON = 0;                              //设置访问片内的 xdata 速度,
                                                //赋值为 0 表示用最快速度访问,不增加额外的等待时间
      P0M0 = 0x00;      P0M1 = 0x00;
      P1M0 = 0x00;      P1M1 = 0x00;
      P2M0 = 0x00;      P2M1 = 0x00;
      P3M0 = 0x00;      P3M1 = 0x00;
      P4M0 = 0x00;      P4M1 = 0x00;
      P5M0 = 0x00;      P5M1 = 0x00;
      UartInit();
      ES = 1;
      EA = 1;
      for (i=0; i<7; i++)
      {
                UartSend(UartSend(ID_ADDR);
      }
      while (1);
}


angmall 发表于 2025-12-26 11:38:07

angmall 发表于 2025-6-20 11:20
可以用程序读取。
是的,给系统去掉了

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

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

页: [1]
查看完整版本: 读取全球唯一ID号,有三种方式,用哪种最好呢 | CHIPID