dabendan001 发表于 2019-6-9 12:51:00

究竟如何读取STM32的UID ?

本帖最后由 dabendan001 于 2019-6-9 15:51 编辑

方法一:
char * GetChipUniqueID_Str_STM32F10x(char* stm32id_StrBuf_32char )
{   
    uint32_t chipUniqueID32;
    chipUniqueID32 = *(__IO uint32_t*)(0X1FFFF7F0);
    chipUniqueID32 = *(__IO uint32_t*)(0X1FFFF7EC);
    chipUniqueID32 = *(__IO uint32_t*)(0X1FFFF7E8);

    snprintf(stm32id_StrBuf_32char,32,"0x%X-%X-%X", chipUniqueID32,chipUniqueID32,chipUniqueID32);
    return stm32id_StrBuf_32char;
}

读得的UID是:0x5DBFF30-43084562-43084562

方法二:
uint32_t * GetSTM32MCUIDPMing(uint32_t *id,MCUTypedef type)
{
      // type =1, idAddr =0x1FFFF7E8;
      if(id!=NULL)
      {
                id=*(uint32_t*)(idAddr);
                id=*(uint32_t*)(idAddr+4);
                id=*(uint32_t*)(idAddr+8);
      }
      
      //printf("\r\nSTM32_ID_Str(inside):0X%X-%X-%X\r\n",id,id,id);
      return id;
}

读得的UID是:0x20009068-8000165-800016D;

为何 不相同呢??(这两个函数,写在在工程中不同的.C文件中)

toofree 发表于 2019-6-10 10:25:19

如果主程序中给stm32id_StrBuf_32char和id都分配了空间的话,似乎两段程序都没问题。
还是硬件仿真看一下相应寄存器的值是多少吧。

songshiqun2010 发表于 2019-6-10 11:08:55

从代码看有个__IO (volatile) 禁止编译器优化的区别。

发表于 2019-6-10 11:12:46

楼主用的什么库,每个系列的ID地址是不同的。以对应的用户手册为主。

butterflyspring 发表于 2019-6-10 12:10:19

仿真一下,单步调式看,最直接:lol对照手册,注意地址

五哥1 发表于 2019-6-10 16:29:44

能否把源码发上来,这个没法重现问题,也就没有办法猜了。测试的环境信息也没有呀

maxtch 发表于 2019-6-11 08:53:18

这两种方法并不一致。另外,我推荐用 memcpy 来读。

天臆弄人 发表于 2019-6-11 11:15:02

2个函数功能效果是一样的,如果不同,肯定是指针地址,传参搞错了,看下你第二个方法,读出来的是什么数据,读出来的是FLASH 内部的应用程序数据。你这读的是以0x800000 开始的某位置去了。

dabendan001 发表于 2019-6-12 09:02:35

安 发表于 2019-6-10 11:12
楼主用的什么库,每个系列的ID地址是不同的。以对应的用户手册为主。

谢谢
每个系列的STM32地址是不同。我用的是STM32F105RB,地址是0x1ffff7e8

dabendan001 发表于 2019-6-12 09:04:40

天臆弄人 发表于 2019-6-11 11:15
2个函数功能效果是一样的,如果不同,肯定是指针地址,传参搞错了,看下你第二个方法,读出来的是什么数据 ...

函数内部用了printf()打印出结果呢。就这,两个写法,结果就不相同。所以我郁闷了,来发贴求援。
页: [1] 2
查看完整版本: 究竟如何读取STM32的UID ?