历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2021年12月29日 | STM32F103单片机读取芯片自身ID

2021-12-29 来源:eefocus

  每一个STM32单片机出厂的时候都有全球唯一的ID,当在数据安全性比较高的地方,需要对每一个接入系统的芯片进行身份验证,那么这个芯片自身的ID号就可以作为它的身份信息。


产品唯一的身份标识非常适合:


用来作为序列号(例如USB字符序列号或者其他的终端应用)

用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。


用来激活带安全机制的自举过程

  96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。


  这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。

image.png?imageView2/2/w/550
image.png?imageView2/2/w/550
image.png?imageView2/2/w/550
image.png?imageView2/2/w/550

  不仅可以读取到芯片的ID,还能读出芯片的存储器容量。

image.png?imageView2/2/w/550

  芯片型号也同样可以读出来。

image.png?imageView2/2/w/550
image.png?imageView2/2/w/550

下面就通过代码来读取这几个数据。


//读取芯片ID

void GetChipID ( void )

{

    u32 CpuID[3]; //小端模式

    CpuID[0] = * ( vu32 * ) ( 0x1ffff7e8 ); //高32位地址

    CpuID[1] = * ( vu32 * ) ( 0x1ffff7ec ); //中32位地址

    CpuID[2] = * ( vu32 * ) ( 0x1ffff7f0 ); //低32位地址

    printf ( "此芯片唯一ID为:0x%x-%x-%x rn", CpuID[0], CpuID[1], CpuID[2] );

}

//获取芯片Flash大小

void GetFlashSize ( void )

{

    u16 stm32_Flash_Size;

    stm32_Flash_Size = * ( u16 * ) ( 0x1FFFF7E0 ); //闪存容量寄存器

    printf ( "芯片闪存容量大小为:%x rn", stm32_Flash_Size );

}


//读取芯片型号

void Main_Chip_Type(void)

{

u32 type;

type = *( unsigned  int * )( 0xE0042000 ); //MCU ID

printf ( "芯片型号为:0x%x rn", type );

}


int main ( void )

{

    NVIC_PriorityGroupConfig ( NVIC_PriorityGroup_2 );

    uart_init ( 115200 );

    delay_init();       //延时函数初始化

    LED_Init();         //初始化与LED连接的硬件接口

    

    GetChipID();

    GetFlashSize();

    Main_Chip_Type();

    

    while(1);

 }


通过串口打印出芯片的ID


此芯片唯一ID为: 0x66eff51-51578248-87074312 

芯片闪存容量大小为:   40 

芯片型号为:  0x20036410 

image.png?imageView2/2/w/550

然后通过单步调试,直接观察内存中的数据。

image.png?imageView2/2/w/550

然后观察内存中地址0x1FFFF7E0开始的数据

image.png?imageView2/2/w/550

  可以看出0x1FFFF7E0开始的16位数据为0x0040换算为10进制数据就是64,说明当前用的芯片的容量是64K。接下来从0x1ffff7e8地址开始的12个字节,也就是96位存储的就是芯片的ID。内存中ID号存储为低位在前高位在后,而打印出来的数据是高位在前,低位在后。打印的前32位是 06 6e ff 51对应在内存中的存储顺序51应该是第一位,06是最后一位。


  最后在0xE0042000地址查看单片机的型号。

image.png?imageView2/2/w/550

  低12位数据是 0x410,也就是设备编码为0x410,通过对比文档可以看出这个是中容量产品。高16位是0x2003,对比文档可以看出,这个是中容量产品,版本号为Y。


  由于这些ID号都存储在指定的内存地址中,而系统没有提供专用的读取这些ID号的函数,所以读取数据的时候,只能通过指针的方式去读取,首先将数据加一级指针转换为地址,然后加二级指针,表示读取当前地址中存储的内容。这种操作方法在库函数的头文件中使用的比较多。比如在stm32f10x.h中就可以看到对GPIOA的定义。


#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */


#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)


#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)


#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)


typedef struct

{

  __IO uint32_t CRL;

  __IO uint32_t CRH;

  __IO uint32_t IDR;

  __IO uint32_t ODR;

  __IO uint32_t BSRR;

  __IO uint32_t BRR;

  __IO uint32_t LCKR;

} GPIO_TypeDef;


将地址值逐个替换后为 #define GPIOA ((GPIO_TypeDef *) 0x4001 0800),相当于在 0x4001 0800 地址处定义了GPIOA的结构体。查阅芯片资料可知,GPIOA的起始地址就是0x4001 0800。

image.png?imageView2/2/w/550

这样操作GPIOA的的时候就和上面读取ID的方法是一样的,相当于直接读写对应地址中的值。

推荐阅读

史海拾趣

D1 International Inc公司的发展小趣事

在快速扩张的过程中,D1 International Inc公司始终坚守品质管理的原则。公司严格把控产品的每一个环节,从原材料采购到生产流程,再到最终的产品检验,都力求做到精益求精。这种对品质的执着追求,使得D1 International Inc公司的产品在市场上赢得了良好的口碑,也为公司的长期发展提供了有力保障。

深圳杜因特(DOINGTER)公司的发展小趣事

在竞争激烈的电子行业中,杜因特始终将创新作为公司发展的核心动力。公司不断投入大量资源进行新产品的研发和技术创新,特别是在Super-Junction MOSFET和Super-Trench MOSFET等高端产品领域取得了显著成果。这些创新产品不仅满足了市场对高品质MOSFET的日益增长需求,还进一步巩固了杜因特在电子行业的技术领先地位。

Advanced Technology Corp公司的发展小趣事

为了进一步提升市场份额和品牌影响力,ATC公司积极开展市场拓展活动。公司加强与国际市场的联系,与多家知名企业建立了战略合作关系,共同开拓新的市场领域。同时,ATC公司还注重品牌塑造,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和美誉度。这些努力使得ATC公司在全球电子市场中占据了一席之地。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司注重企业文化建设和团队建设,通过营造积极向上的工作氛围和提供广阔的发展平台,吸引了大量优秀人才的加入。公司注重员工的培训和成长,为员工提供多样化的职业发展路径。同时,公司还积极开展团队建设活动,增强员工的归属感和凝聚力。这种企业文化和团队建设为公司的发展提供了有力的保障。


请注意,这些故事是基于一般性的电子行业和公司发展情况进行构想的,可能与Aerotronics Marketing Inc公司的实际情况存在差异。如果需要更具体、准确的故事,建议您直接查阅该公司的官方网站、新闻报道或相关资料。

Ecera Comtek Corp公司的发展小趣事

随着公司实力的不断增强,Ecera Comtek Corp公司开始寻求更广阔的发展空间。公司决定进军国际市场,拓展海外业务。然而,国际市场的竞争更加激烈,Ecera Comtek Corp公司面临着来自全球各地的强大竞争对手。为了应对这一挑战,Ecera Comtek Corp公司加强了与国际合作伙伴的联系,共同研发新产品,开拓新市场。同时,公司还加大了对海外市场的宣传力度,提高了品牌的知名度和美誉度。经过几年的努力,Ecera Comtek Corp公司的产品逐渐在国际市场上获得了认可,海外业务也取得了显著的进展。

Grayhill公司的发展小趣事
记录测试数据并进行分析,以便对电路进行进一步的优化和改进。

问答坊 | AI 解惑

一起来学MODELSIM

有对学习MODELSIM感举的朋友,一起来学习吧,欢迎访问我的博客,共同学习,共同进步…

查看全部问答>

很苦恼的GPS座标比对

现有固定座标100个(路径是一个大椭圆形,公交車的行駛路線) 和 现在座标1个(移动的) 如何得知目前的座标是往哪个固定座标移动中? 这问题看似简单,可是很复杂阿! 找出现在座标离最近的一站是可以找的出来,没啥, 就是比对100个固定座标和现在 ...…

查看全部问答>

为什么GPIO中有的Pin要设为Pull_Up/Pull_Down?

如题,其中有的pin为输入pin,有的pin为输出pin,但是为什么要设置一些pin的属性为pull up或者为pull down,pull up/pull down到底是干吗用的?根据什么来设的呢,聆听各位大虾的教诲!!…

查看全部问答>

uc/OSII中关于消息队列的疑惑,望大虾们指教

INT8U OSQPost (OS_EVENT *pevent, void *msg) 1、这个函数是发送消息的函数,如果每次都发送一个消息过来,这个消息是指针,那么我认为这个消息一定是一个占一定内存空间的结构。 2、而清空消息队列的函数只是将消息队列的信息给置成空了,但是 ...…

查看全部问答>

寒假想给自己补充些知识

看了DIY板块,发现自己对一些小制作十分有兴趣,高手可以推荐自己动手做一些东西方便入门嘛~~在学校学习了数模电,但是由于课程安排,实验在下个学期上,我想自己在寒假的时候也能进行些小实验。。  手头上有个avr的学习版,  不知道能不 ...…

查看全部问答>

2011年3月1日 有点惊喜

   今天早上九点多查看六级成绩,过了!呵呵·····    今天晚上在外边吃饭,刚吃完手机响了,原来是在论坛申请的“eZ430-RF2500开发套件”到了!    今天我们学校的一卡通正式开通了;    今天重庆 ...…

查看全部问答>

wince6.0无法启动

利用TQ2440开发板做应用,IO口连接到FPGA时,wince无法启动了,怎么回事啊?新手求指教,我是想用camera接口当成普通IO口使用…

查看全部问答>

S52单片机P0口的问题

为啥S52单片机的P0口是开漏的,AD采集必须接到这个口么,为什么,是因为高阻抗么?如果不用这个口,是不是在ADC的电压采集口加上电压跟随器就行了?…

查看全部问答>

关于CAN发送的问题

我在用CAN发送报文的时候,模式设置和初始化部分 我能确定都没有问题   但是报文发送时始终出现错误  我读取寄存器时,发现发送错误位检测为1. 问各位一个问题报文发送期间会发生总线错误有哪些原因呢    我用的是MSP430操作MC ...…

查看全部问答>

照相手机闪光灯LED驱动的新思路

replyreload += \',\' + 1340057;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>