STM8学习笔记---读取STM8S003单片机序列号

最近做项目时需要用到单片机的序列号,于是查了一下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值看起来更直观方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章