[研电赛技术支持] 不写程序怎么使用stlink获取gd32的96位id

[复制链接]
5|0
荣陶陶 发表于 2026-9-4 09:17 | 显示全部楼层 |阅读模式
1. 环境
系统:win10
ide: ST-LINK Utility
mcu:GD32F303
2. 需求
我们知道MCU内部有唯一的96位组成的id号。这个id号有很多作用,如可以用来做设备标识和程序加密。

常用的MCU对应id在flash中的地址如下(这个图是我在网上扒的):


397266a9787dc3e0ca.png

正常我们获取id的方法都是通过编写程序,然后通过打印输出出来,常见的用程序读写id的程序如下:
正常我们获取id的方法都是通过编写程序,然后通过打印输出出来,常见的用程序读写id的程序如下:

//stm32获取单片机内部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的方法

893326a9787d7109f4.png

将GD32 连接st-link,打开ST-LINK Utility后点击链接,会在右上角出现单片机的信息,但是并没有显示全部的96位id,如下图:

214976a9787d10affb.png

我们发现并没有地方有显示96位id。但是我们通过上面的表格已经知道id在flash中的addr,比如stm32L4的id地址的起始地址是0x1FFFF7E8,那么我们在address里面写上0x1FFFF7E8,然后回车,就会打印出这个地址的内容,如下图:

48166a9787cb62304.png

就会看到0x1FFFF7E8相邻的3个地址内存储的id了,然后选中这3个空间,右击复制,就得到了这个GD32的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 ;
}

这两种都是获取id,但是获取的结果是不同的,那么为了保证在ST-LINK Utility获取的和程序的方法一致,那么也要更改ST-LINK Utility中的Data Width选项,当你程序写的是uint32_t,那么Data Width选项就要选32bits,当程序写的是uint16_t,那么Data Width选项就要选16bits,同理uint8_t就选8bits。当选16bits后,内存内容会重新分割,如下图:

94616a9787b47b9f2.png

类比这中方法,也可以用STM32CubeProgrammer用实现读取id,用jlink配合J-Link Commaner来实现读取mcu的id
————————————————
版权声明:本文为CSDN博主「m0_70228896」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_70228896/article/details/163756442

您需要登录后才可以回帖 登录 | 注册

本版积分规则

166

主题

570

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0