最近做項目時需要用到單片機的序列號,於是查了一下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值看起來更直觀方便。