赞
踩
我们知道stm32内部有唯一的96位组成的id号。这个id号有很多作用,如可以用来做设备标识和程序加密。
常用的stm32对应id在flash中的地址如下(这个图是我在网上扒的):
正常我们获取id的方法都是通过编写程序,然后通过打印输出出来,常见的用程序读写id的程序如下:
//stm32f091获取单片机内部id
uint32_t id_group[3] = {0};//存储96位id的数组
void get_stm32_ID()
{
id_group[0] = *(__IO uint32_t *)(0x1FFFF7AC);
id_group[1] = *(__IO uint32_t *)(0x1FFFF7B0);
id_group[2] = *(__IO uint32_t *)(0x1FFFF7B4);
return ;
}
这样当然可以,但是对于量产的产品,或者测试人员来说,这是非常麻烦的。那么有没有一种方法,不需要写程序就可以轻松将ID数据读取回来呢,当然有的。
下面我们将介绍一种不需要程序,只需要st-link或jlink配合它们的官方软件就可以实现读取ID的方法
ST-LINK Utility是st官方专门为st-link准备的下载调试软件,可以在stm32官网下载到,当然也可以使用更新的STM32CubeProgrammer,随意,本文只讲ST-LINK Utility。ST-LINK Utility安装后图标:
将stm连接st-link,打开ST-LINK Utility后点击链接,会在右上角出现单片机的信息,但是并没有显示全部的96位id,如下图:
我们发现并没有地方有显示96位id。但是我们通过上面的表格已经知道id在flash中的addr,比如stm32L4的id地址的起始地址是0x1FFF7590
,那么我们在address里面写上0x1FFF7590,然后回车,就会打印出这个地址的内容,如下图:
就会看到0x1FFF7590相邻的3个地址内存储的id了,然后选中这3个空间,右击复制,就得到了这个stm32的96为id了。
因为ARM是小端存储的,那个通过不一样的方法的读到的id排序是有区别的,在程序中,如:
//方法1获取stm32f091获取单片机内部id uint32_t id_group[3] = {0};//存储96位id的数组 void get_stm32_ID() { id_group[0] = *(__IO uint32_t *)(0x1FFFF7AC); id_group[1] = *(__IO uint32_t *)(0x1FFFF7B0); id_group[2] = *(__IO uint32_t *)(0x1FFFF7B4); return ; } //方法2获取stm32f091获取单片机内部id uint16_t id_group[6] = {0};//存储96位id的数组 void get_stm32_ID() { id_group[0] = *(__IO uint16_t *)(0x1FFFF7AC); id_group[1] = *(__IO uint16_t *)(0x1FFFF7AE); id_group[2] = *(__IO uint16_t *)(0x1FFFF7B0); id_group[3] = *(__IO uint16_t *)(0x1FFFF7B2); id_group[4] = *(__IO uint16_t *)(0x1FFFF7B4); id_group[5] = *(__IO uint16_t *)(0x1FFFF7B6); return ; }
这两种都是获取id,但是获取的结果是不同的,那么为了保证在ST-LINK Utility获取的和程序的方法一致,那么也要更改ST-LINK Utility中的Data Width选项,当你程序写的是uint32_t,那么Data Width选项就要选32bits,当程序写的是uint16_t,那么Data Width选项就要选16bits,同理uint8_t就选8bits。当选16bits后,内存内容会重新分割,如下图:
类比这中方法,也可以用STM32CubeProgrammer用实现读取id,用jlink配合J-Link Commaner来实现读取mcu的id
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。