最近做项目时需要用到单片机的序列号,于是查了一下STM8S003单片机UID读取的方法。读取UID方法大概分两种,一种是直接在地址中读取,一种是通过定义一个联合体,将联合体的起始地址设置在UID起始地址处,在初始化的时候直接将UID号存入联合体中。
关于UID的描述,官方资料如下:
STM8S003F3芯片Unique ID的首地址为0X4865,连续读取后十二字节数据即为STM8S003F3芯片Unique ID。
有些STM8S系列的芯片Unique ID首地址不是0X4865,STM8S105系列芯片Unique ID首地址为0X48CD。
接下来看一下UID的读取方法:
一:直接从UID收地址开始读取12个字节
#define ID_BaseAddr 0x4865
void Get_STM8S_UniqueID( void )
{
unsigned char STM8S_ID[12];
unsigned char i = 0;
for( i = 0; i < 12; i++ )
{
STM8S_ID[i] = *( unsigned char* )( ID_BaseAddr + i );
}
}
直接从0x4865地址处读取12个字节,并存储到数组中。
读取结果如下图
二:通过定义的联合体在初始化的时候读取UID
__no_init const union //either the struct or a string
{
struct //nameless struct
{
unsigned short X_coordinate; //X-coordinate on the wafter
unsigned short Y_coordinate; //Y-coordinate on the wafer
unsigned char Wafer_Number; //wafer number
unsigned char Lot_Number[7]; //lot number
} ;
unsigned char str[12]; //or the string
} U_ID @ 0x4865; //u_id typ
void Get_UID( void )
{
unsigned char i = 0;
unsigned char addr[12] = {0};
for( i = 0; i < 12; i++ )
{
addr[i] = U_ID.str[i];
}
}
读取结果如下图
从变量监控中可以直观的看出来联合体在内存中的分配情况,X坐标值是0x003A是由0x4865和0x4866两个地址中的8位数组成的16位数,Y坐标值是0x0023是由0x4867和0x4868两个地址中的8位数组成的16位数。这样通过联合体可以直观的看到坐标信息、编号信息、产品批号信息等。
上面两种方法可以看出,通过联合体方法获取的芯片UID值看起来更直观方便。