STM32L0 读取唯一序列号UID
直接寻址
STM32L0的UID首地址为0x1FF80050,采用如下方式可以读取3个字共96位的UID。
#define UID_BASE 0x1FF80050
uint32_t UID[3];
UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 8)));
测试发现两片不同的STM32L031芯片,读出的UID是相同的!!
HAL库读取
直接采用HAL读取UID的库函数进行读取,HAL库支持如下的读取:
uint32_t HAL_GetHalVersion(void);
uint32_t HAL_GetREVID(void);
uint32_t HAL_GetDEVID(void);
uint32_t HAL_GetUIDw0(void);
uint32_t HAL_GetUIDw1(void);
uint32_t HAL_GetUIDw2(void);
因此,读取代码如下:
uint32_t UID[3];
UID[0] = HAL_GetUIDw0();
UID[1] = HAL_GetUIDw1();
UID[2] = HAL_GetUIDw2();
测试发现两片不同的STM32L031芯片,读出的UID是不同的!!
查找原因
对HAL_GetUIDw0(),HAL_GetUIDw1(), HAL_GetUIDw2()进行分析,发现:
uint32_t HAL_GetUIDw0(void)
{
return(READ_REG(*((uint32_t *)UID_BASE)));
}
uint32_t HAL_GetUIDw1(void)
{
return(READ_REG(*((uint32_t *)(UID_BASE + 0x04U))));
}
uint32_t HAL_GetUIDw2(void)
{
return(READ_REG(*((uint32_t *)(UID_BASE + 0x14U))));
}
问题找到,第三个字的偏移地址是14,而不是8。因此,直接读取的方式改为:
UID[0] = (uint32_t)(*((uint32_t *)UID_BASE));
UID[1] = (uint32_t)(*((uint32_t *)(UID_BASE + 4)));
UID[2] = (uint32_t)(*((uint32_t *)(UID_BASE + 14)));
则读取UID正确.
-End-