stm32 unique device id (UDID)
stm32l系列的和STm32F系列的不同
stm32L1的參考如下連結;
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSTM32L162%20-%20unique%20device%20id%2c%20address%20offset&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=355
STM32L151RCT6 :
//0x1FF800D0,0x1FF800D4,0x1FF800E4
uint32_t GetBikeID(void)
{
uint32_t CpuID[3],BikeID;
//獲取CPU唯一ID
CpuID[0] = *(uint32_t*)(0x1FF800D0);
CpuID[1] = *(uint32_t*)(0x1FF800D4);
CpuID[2] = *(uint32_t*)(0x1FF800E4);
//加密演算法,很簡單的加密演算法
BikeID =(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
return BikeID;
}
【轉載請註明出處: blog.csdn.net/lanmanck】
注意,CPU ID和Unique ID對ST來講是不同的定義,CPU ID是CortexM3自帶的,復位值是一致的,在PM0056.pdf中有定義說明。
Unique ID是每個晶片的不同ID,在RM0008.PDF中定義,像F103就在30.2節中定義。
Flash size register是晶片的Flash大小,在RM0008.PDF中定義,像F103就在30.1中定義。
可以推理,如果知道了Flash大小,就可以根據手冊來推出Page的大小了,所以就不要找page size register了,沒有這個專門的暫存器。
要注意的是,L15x系列的地址基址和F103不一樣,要參考對應的手冊。
產品唯一的身份標識非常適合:
● 用來作為序列號(例如USB字元序列號或者其他的終端應用)
● 用來作為密碼,在編寫快閃記憶體時,將此唯一標識與軟體加解密演算法結合使用,提高程式碼在快閃記憶體儲存器內的安全性。
● 用來啟用帶安全機制的自舉過程
96位的產品唯一身份標識所提供的參考號碼對任意一個STM32微控制器,在任何情況下都是唯一的。使用者在何種情況下,都不能修改這個身份標識。
這個96位的產品唯一身份標識,按照使用者不同的用法,可以以位元組(8位)為單位讀取,也可以以半字(16位)或者全字(32位)讀取。
基地址:0x1FFF F7E8
每個CPU 出廠的時候都
配置的一個ID,96 位的.這個唯一碼可以利用作軟體加密.......
static u32 CpuID[3];
static u32 Lock_Code;
void GetLockCode(void)
{
//獲取CPU唯一ID
CpuID[0]=*(vu32*)(0x1ffff7e8);(stm32f1系列)
CpuID[1]=*(vu32*)(0x1ffff7ec);
CpuID[2]=*(vu32*)(0x1ffff7f0);
//加密演算法,很簡單的加密演算法
Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);
}
然後再用上次所用的 FLASH_ProgramWord(LOCK_ADDR,Lock_Code); 寫到FLASH 的某個角落就好了,然後再在程式中驗證這個值是否正確。感覺ID的調取很是方便倒是加密演算法讓人頭痛,當然了要是把MD5移植過來應該不是太難。現在市場中這麼多的廉價J-link還不是中國牛人xxx.