当前位置:   article > 正文

不需要写程序,通过st-link获取stm32的96位id_stlink读取芯片id

stlink读取芯片id

不需写程序,通过st-link获取stm32的96位id

1. 环境

  • 系统:win10
  • ide: ST-LINK Utility
  • mcu:stm32L476

2. 需求

我们知道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 ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这样当然可以,但是对于量产的产品,或者测试人员来说,这是非常麻烦的。那么有没有一种方法,不需要写程序就可以轻松将ID数据读取回来呢,当然有的。

下面我们将介绍一种不需要程序,只需要st-link或jlink配合它们的官方软件就可以实现读取ID的方法

3. st-link配合ST-LINK Utility实现读取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了。

3. 注意事项

因为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 ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这两种都是获取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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/277899
推荐阅读
相关标签
  

闽ICP备14008679号