读取全球唯一ID号,有三种方式,用哪种最好呢
===有CHIP-ID的就从CHIP-ID中读,后续新产品只有这种手段了
有CHIPID的芯片必需从CHIPID读取(RAM与ROM不再存放)。没有CHIPID的芯片建议从ROM读取,因为RAM里面内容可能会被变量或者堆栈覆盖。
国学芯用 发表于 2023-2-23 14:13
有CHIPID的芯片必需从CHIPID读取(RAM与ROM不再存放)。没有CHIPID的芯片建议从ROM读取,因为RAM里面内容可 ...
是在下载时候读取吗 不是很牛逼 发表于 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(ID_ADDR);
}
while (1);
}
页:
[1]