你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

究竟如何读取STM32的UID ?

[复制链接]
dabendan001 提问时间:2019-6-9 12:51 /
本帖最后由 dabendan001 于 2019-6-9 15:51 编辑

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

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

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

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

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

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

收藏 评论15 发布时间:2019-6-9 12:51

举报

15个回答
七哥 回答时间:2019-6-10 10:25:19
如果主程序中给stm32id_StrBuf_32char和id都分配了空间的话,似乎两段程序都没问题。
还是硬件仿真看一下相应寄存器的值是多少吧。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

byronsong 回答时间:2019-6-10 11:08:55
从代码看  有个__IO (volatile) 禁止编译器优化的区别。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

废鱼 回答时间:2019-6-10 11:12:46
楼主用的什么库,每个系列的ID地址是不同的。以对应的用户手册为主。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

butterflyspring 回答时间:2019-6-10 12:10:19
仿真一下,单步调式看,最直接  对照手册,注意地址

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

五哥1 回答时间:2019-6-10 16:29:44
能否把源码发上来,这个没法重现问题,也就没有办法猜了。测试的环境信息也没有呀

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

maxtch 回答时间:2019-6-11 08:53:18
这两种方法并不一致。另外,我推荐用 memcpy 来读。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

天臆弄人 回答时间:2019-6-11 11:15:02
2个函数功能效果是一样的,如果不同,肯定是指针地址,传参搞错了,看下你第二个方法,读出来的是什么数据,读出来的是FLASH 内部的应用程序数据。你这读的是以0x800000 开始的某位置去了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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()打印出结果呢。就这,两个写法,结果就不相同。所以我郁闷了,来发贴求援。
dabendan001 回答时间:2019-6-15 17:06:38
五哥1 发表于 2019-6-10 16:29
能否把源码发上来,这个没法重现问题,也就没有办法猜了。测试的环境信息也没有呀 ...

在不同的位置,直接调用这两个函数,就是了。不需要其他的代码呢。
这两个函数体内直接有printf()语句,打印出来就看到信息。

谢谢
dabendan001 回答时间:2019-6-16 10:24:46
本帖最后由 dabendan001 于 2019-6-19 23:52 编辑
五哥1 发表于 2019-6-10 16:29
能否把源码发上来,这个没法重现问题,也就没有办法猜了。测试的环境信息也没有呀 ...

是照搬这里的代码。http://blog.csdn.net/foxclever/article/details/80294516
(版主,不好意思哈。纯技术交流,无他意,请见谅。)
五哥1 回答时间:2019-6-17 12:59:03
dabendan001 发表于 2019-6-16 10:24
是照搬这里的代码。http://blog.csdn.net/hxlawf/article/details/90405395  
(版主,不好意思哈。纯技 ...

不是版主,只是个热心的人而已。
五哥1 回答时间:2019-6-17 13:24:44
建议你再看看这个STM32F7xx —— 96位唯一ID - 血染风采2019 - CSDN博客 http://blog.csdn.net/wqx521/article/details/86615401

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

dabendan001 回答时间:2019-6-19 23:49:09
本帖最后由 dabendan001 于 2019-6-19 23:53 编辑
五哥1 发表于 2019-6-17 13:24
建议你再看看这个STM32F7xx —— 96位唯一ID - 血染风采2019 - CSDN博客 http://blog.csdn.net/wqx521/art ...

非常感谢!

似乎算法相同呢。STM32F10X系列的首地址都是:0x1FFFF7E8, 后面两个分别+4 和+8;http://blog.csdn.net/foxclever/article/details/80294516   (是这个的源码,我前面好像贴错链接了)
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版