STM32L0 读取唯一序列号UID

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-

猜你喜欢

转载自blog.csdn.net/hwytree/article/details/103390733