C中通过JTAG读取STM32L4闪存

Read STM32L4 flash memory through JTAG in C

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

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

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

到目前为止我做了什么

在花了几天时间寻找一些函数或例子来做一些像读取闪存这样简单的事情之后,我在这个网站上问过,这帮助我理解了一些关于我的东西不得不做;尽管如此,即使在阅读了评论中建议的所有链接和文档几天之后,我仍然无法找到我正在寻找的东西。

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

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

总结 :

我无法显示任何代码,因为到目前为止我唯一拥有的是一个 #include "stm32l476xx.h" 和一个空的 main。
关于 How to read a STM32L476's flash memory in C 的提示或解决方案将是完美的。与 STM32 芯片内存交互的 C(或任何低级或高级编程语言)程序或指令的每个示例都可以帮助我很多,因为在互联网上很难找到。

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

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

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

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

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

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

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

ST-Link 实用程序提供 CLI(命令行界面)来执行最常见的操作。这是使用位于 ST-Link 实用程序安装目录中的 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) 或内部目录等位置创建文件"Program Files",最有可能安装程序的位置(例如通过指定相对路径,例如仅给出输出文件名 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 实用程序读取的相同 3x32 位值。您当然可以选择将其读取为 uint8_t 大小为 12 的字节数组,您甚至可以选择将其读入结构,以防您对详细信息(批号、晶圆编号等)感兴趣。但是,此示例应该让您大致了解如何访问此值。