| 首先,有规律可循,这样大大降低**难度. 
 UID0寄存器,代表的是芯片在Die 中的 X/Y 坐标.我的芯片对应位置0x1FF0F420.
 UID1寄存器,代表的是芯片的Die 的编号.因为我们买了一整盘的芯片,这一位是完全相等的.我芯片对应位置0x1FF0F424.
 UID2寄存器,就是Lot号,也就是真正的UID.这个和UID0是有一定计算关系和规律的.我的地址是0x1FF0F428.
 
 我买了一盘的STM32F722,目前查到的5片规律如下.分别是UID0,UID1,UID2顺序写.我整理了一下顺序.
 
 UID0        UID1      UID2
 0025002A 30365116 33383533
 
 0025032A 30365116 333B3533
 
 0025042A 30365116 333C3533
 
 0026062A 30365116 334E3533
 
 0028082A 30365116 336F3533
 
 
 UID1是不变的,UID0的坐标加1时候,UID2也加1,然后我找到了F767的原子的板子.
 
 UID0        UID1      UID2
 3341321A 31300996 3A3A6010
 
 
 意思是什么,在31300996的晶圆上,切出的坐标41,32的芯片...
 
 为了验证,FAE的指导下,我找到了这个文件.STM32Cube_FW_F7_V1.6.0ProjectsSTM32F767ZI-NucleoExamples_LLUTILSUTILS_ReadDeviceInfo
 
 [mw_shl_code=c,true]void GetMCUInfo(void)
 {
 register uint32_t size_string = 0, read_info = 0, read_info2 = 0;
 
 /* Display Device ID in string format */
 sprintf((char*)aShowDeviceID,"Device ID = 0x%lX", LL_DBGMCU_GetDeviceID());
 
 /* Display Revision ID in string format */
 sprintf((char*)aShowRevisionID,"Revision ID = 0x%lX", LL_DBGMCU_GetRevisionID());
 
 /* Display  X and Y coordinates on the wafer expressed in BCD format */
 sprintf((char*)aShowCoordinate,"X and Y coordinates = 0x%lX", LL_GetUID_Word0());
 
 /* Display Waver number and lot number in string format */
 read_info = LL_GetUID_Word1();
 read_info2 = LL_GetUID_Word2();
 sprintf((char*)aShowWaferNumber,"Wafer NB = 0x%X", (uint8_t)read_info);
 size_string = sprintf((char*)aShowLotNumber,"Lot NB = 0x%lX", read_info2);
 sprintf((char*)aShowLotNumber+size_string,"%lX", (read_info >> 8));
 }[/mw_shl_code]
 
 也就是说,利用任何一个,都不能作为唯一,ST用这种方法保证唯一性,确实很唯一,但是也是规律可寻的.
 
 换句话,ST可以通过UID1知道你买的是什么芯片!
 |