历史上的今天
今天是:2025年01月02日(星期四)
2020年01月02日 | STM8学习笔记---读取STM8S003单片机序列号
2020-01-02 来源:eefocus
最近做项目时需要用到单片机的序列号,于是查了一下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值看起来更直观方便。
史海拾趣
|
对Wince/WM系统启动过程熟悉的高手请进,似乎文件系统出了问题 系统烧录完image后,第一次可以正常启动,断电后重启出现问题 下面是使用kitl抓到的trace Loaded symbols for \'D:\\WM\\RELEASE\\WPC_QCMSM_RETAIL_SNCAAPAA\\WPC\\MSPART.DLL\' Loaded symbols for \'D:\\WM\\RELEASE\\WPC_QCMSM_RETAIL_SNCAA ...… 查看全部问答> |
|
#include unsigned int pwm_start,pwm_end,pwm_wide=0; float fre=0.000; #define uchar unsigned char #define uint unsigned int #define lint long int unsigned int start,end; float data,num,m ...… 查看全部问答> |
|
if(OSTCBPrioTb1[prio]==(OS_TCB*)0) if(OSTCBPrioTb1[prio]==(OS_TCB*)0) 这个(OS_TCB*)0)的“0”怎么理解?… 查看全部问答> |




