1

我正在尝试在 Windows 7上使用JTAG ST-Link/V2从STM32L476芯片读取 MCU_ID(设备电子签名)。芯片内无需上传代码,程序只需在我的电脑上启动并读取此信息从闪存。

我设法从ST 网站上给出的参考手册中找到并提取了以下屏幕截图:

设备电子签名注册

所以我必须使用 C 程序读取存储在 adess 0x1FFF7590 闪存中的值。我正在使用 ST 本身推荐的 Atollic TrueStudio IDE,但在我看来,它包含的"stm32l476xx.h"库​​甚至不包含任何可以帮助我的功能。

到目前为止我做了什么

在花了几天时间寻找一些功能或示例来做一些像读取闪存这样简单的事情之后,我在这个网站上询问了How to interact with a STM32 chip memory,这帮助我了解了一些关于我必须做什么的事情做; 尽管如此,即使在阅读了评论中建议的所有链接和文档数天后,我仍然无法找到我想要的东西。

我问了几个专业人士,他们告诉我我应该搜索一个JTAG 驱动程序来与闪存交互,但它似乎有点复杂,我还没有找到任何东西。这个网站上有人告诉我,简单地使用指针就足够了;缺乏 C 示例和互联网教程无法帮助我弄清楚如何做到这一点。

最后,我最近开始研究 STM32Cube 和 HAL,即使我想避免使用它们,因为我认为无需包含这些层就可以完成简单的读取。在尝试使用它们之前,提出这个问题是我的最后希望。

结论

我无法显示任何代码,因为到目前为止我唯一的东西是#include "stm32l476xx.h"一个空的 main。
关于如何用 C 语言读取 STM32L476 的闪存的提示或解决方案将是完美的。每个与 STM32 芯片内存交互的 C(或任何低级或更高级别的编程语言)程序或指令的示例都可以帮助我很多,因为在互联网上很难找到。

4

3 回答 3

2

使用 ST-Link(图形界面)读取 MCU ID

您可以使用 ST-Link Utility(可以从 ST.com 下载:http: //www.st.com/en/embedded-software/stsw-link004.html)。完成 Target->Connect 后,您可以指定要在 Window 顶部读取的地址和字节数。这也适用于定义了 MCU ID 的内存区域。

对于您使用的 STM32L476 MCU,它将是内存地址 0x1FFF7590,大小为 0xC(96 位)。按下回车应该可以让您看到从您连接到的 MCU 读取的唯一 ID,以 3x32 位值的形式。

使用 ST-Link(命令行界面)读取 MCU ID

ST-Link Utility 提供 CLI(命令行界面)来执行最常见的操作。这是使用 ST-Link Utility 安装目录中的 ST-LINK_CLI.exe 完成的。

将唯一 ID 读取为 32 位值(示例中的 STM32L476 MCU):

ST-LINK_CLI.exe -r32 0x1FFF7590 0xC

读取为 8 位值:

ST-LINK_CLI.exe -r8 0x1FFF7590 0xC

您还可以使用 -Dump 参数将其读取到文件中:

ST-LINK_CLI.exe -Dump 0x1FFF7590 0xC D:\temp\out.bin

请记住,您必须具有写入目标目录的权限。如果您不以管理权限运行命令提示符,在大多数情况下,这意味着您将无法在根驱动器目录 ( C:\out.bin) 或“程序文件”等位置创建文件,这些位置很可能是您程序已安装(例如通过指定相对路径,例如仅给出输出文件名out.bin)。遗憾的是,该程序没有通知写入文件失败的尝试,但是它确实说明了它何时成功创建文件。程序执行应以绿线结束Dumping memory to D:\temp\out.bin succeded。此外,请记住,仅支持以下文件扩展名:*.bin *.hex *.srec *.s19. 它不能是任何东西,因为扩展名决定了将数据写入文件的格式。

您可以在用户手册 UM0892 中找到有关 CLI 参数的更多信息。

使用 C 代码读取 MCU ID

同样可以使用加载到 MCU 中的程序来完成。您只需直接访问内存即可读取它。示例代码:

#define STM32_UNIQUEID_ADDR 0x1FFF7590
uint32_t id[3];
id[0] = *(STM32_UNIQUEID_ADDR + 0);
id[1] = *(STM32_UNIQUEID_ADDR + 1);
id[2] = *(STM32_UNIQUEID_ADDR + 2);

在此操作之后,id数组应该包含您之前使用 ST-Link Utility 读取的相同的 3x32 位值。您当然可以选择将其读取为uint8_t大小为 12 的字节数组,您甚至可以选择将其读取到结构中,以防您对详细信息(批号、晶圆号等)感兴趣。但是,此示例应该让您大致了解如何访问此值。

于 2017-05-11T09:02:28.517 回答
0

Texane stlink,可以满足您的要求。它是用 C 语言编写的,通过 ST-Link 适配器与 STM32 芯片交互,它可以从芯片内存中读取。

于 2017-05-10T08:52:49.927 回答
0

您正在寻找的不是 ST 的功能,而是 ARM 的功能。
请记住,ST 只是使用 ARM 内核。我知道大多数程序员在 RAM 中加载一些代码并使用它来访问闪存。例如,您可以在安装目录或 Keil 中找到这些简单的程序。

我认为是您需要的手册。但我不知道登录墙后面是否有更多信息。

于 2017-05-10T14:31:33.340 回答