通过C中的JTAG读取STM32L4闪存

通过C中的JTAG读取STM32L4闪存,c,embedded,stm32,flash-memory,jtag,C,Embedded,Stm32,Flash Memory,Jtag,我试图在Windows 7上使用JTAG ST Link/V2从STM32L476芯片读取MCU_ID(设备电子签名)。无需在芯片内上传代码,程序只需在我的电脑上启动,并从闪存中读取此信息 我已设法从ST网站上找到并提取以下截图: 因此,我必须使用C程序读取adess 0x1FF7590闪存中存储的值。我使用的是ST本身推荐的Atolic TrueStudio IDE,但在我看来,它包含了“stm32l476xx.h”库,它甚至不包含任何可以帮助我的函数 我到目前为止所做的事情 在花了好几天的

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

我已设法从ST网站上找到并提取以下截图:

因此,我必须使用C程序读取adess 0x1FF7590闪存中存储的值。我使用的是ST本身推荐的Atolic TrueStudio IDE,但在我看来,它包含了
“stm32l476xx.h”
库,它甚至不包含任何可以帮助我的函数

我到目前为止所做的事情

在花了好几天的时间寻找一些函数或示例来做一些像读闪存这样简单的事情之后,我在这个网站上提出了问题,这帮助我了解了一些我必须做的事情;然而,即使在阅读了评论中建议的所有链接和文档几天后,我仍然无法找到我想要的内容

我问过几位专业人士,他们告诉我应该搜索JTAG驱动程序来与闪存交互,但这似乎有点复杂,我还没有找到。 这个网站上有人告诉我,仅仅使用指针就足够了;缺少C示例和internet教程无法帮助我了解如何做到这一点

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

总之

我无法显示任何代码,因为到目前为止我只有一个
#include“stm32l476xx.h”
和一个空的main。

关于如何在C中读取STM32L476闪存的提示或解决方案将是完美的。每一个与STM32芯片内存交互的C(或任何低或高级别的编程语言)程序或指令的例子都能给我很大帮助,因为在互联网上很难找到它。

有,这就是你想要的。它是用C编写的,通过ST-Link适配器与STM32芯片交互,并且可以从芯片内存中读取。

您要寻找的不是ST的功能,而是ARM的功能。
记住,ST只是使用一个ARM核心。我知道大多数程序员在RAM中加载一些代码,并使用它们访问flash。例如,您可以在install目录或Keil中找到这些简单的程序


我想这是你需要的手册。但我不知道登录墙后面是否有更多信息。

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

您可以使用ST Link实用程序(可从ST.com下载,网址:)。完成Target->Connect后,可以在窗口顶部指定要读取的地址和字节数。这也适用于定义MCU ID的内存区域

对于您使用的STM32L476 MCU,它将是内存地址0x1FF7590,大小0xC(96位)。按enter键应允许您查看从所连接的MCU读取的唯一ID,以3x32位值的形式


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

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

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

读取为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
)。遗憾的是,程序没有告知写入文件的尝试失败,但它确实说明了创建文件的成功时间。程序执行结束时应显示一条绿线,表示
将内存转储到D:\temp\out.bin succeed
。此外,请记住,仅支持以下文件扩展名:
*.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位值相同的值。您当然可以选择将其作为大小为12的
uint8\t
字节数组读取,如果您对细节(批号、晶圆号等)感兴趣,您甚至可以选择将其读入结构中但是,这个例子应该让您大致了解如何访问这个值。

为什么您要编写自己的程序,而不是使用现有的工具,例如我不明白实际的要点。如果您知道设备签名的地址,那么您可以这样做:
uint16\u t sign=*(uint16\u t*)0x1FF7590;
并且您有设备的签名。生产友好的方式可能是1)让MCU程序在您最喜欢的串行总线上吐出数据,或者2)下载一个只吐出数据的虚拟程序,然后稍后用实际固件覆盖它。加载测试fi是常见的做法
#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);