究竟如何读取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文件中)
如果主程序中给stm32id_StrBuf_32char和id都分配了空间的话,似乎两段程序都没问题。
还是硬件仿真看一下相应寄存器的值是多少吧。 从代码看有个__IO (volatile) 禁止编译器优化的区别。 楼主用的什么库,每个系列的ID地址是不同的。以对应的用户手册为主。 仿真一下,单步调式看,最直接:lol对照手册,注意地址 能否把源码发上来,这个没法重现问题,也就没有办法猜了。测试的环境信息也没有呀 这两种方法并不一致。另外,我推荐用 memcpy 来读。 2个函数功能效果是一样的,如果不同,肯定是指针地址,传参搞错了,看下你第二个方法,读出来的是什么数据,读出来的是FLASH 内部的应用程序数据。你这读的是以0x800000 开始的某位置去了。 安 发表于 2019-6-10 11:12
楼主用的什么库,每个系列的ID地址是不同的。以对应的用户手册为主。
谢谢
每个系列的STM32地址是不同。我用的是STM32F105RB,地址是0x1ffff7e8 天臆弄人 发表于 2019-6-11 11:15
2个函数功能效果是一样的,如果不同,肯定是指针地址,传参搞错了,看下你第二个方法,读出来的是什么数据 ...
函数内部用了printf()打印出结果呢。就这,两个写法,结果就不相同。所以我郁闷了,来发贴求援。
页:
[1]
2