通过C中的JTAG读取STM32L4闪存

时间:2017-05-10 08:12:52

标签: c embedded stm32 flash-memory jtag

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

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

Device Electronic Signature Registre

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

到目前为止我做了什么

花了几天时间寻找一些功能或例子来做一些像读取闪存这样简单的事情,我已经在这个网站How to interact with a STM32 chip memory上提出了问题,这有助于我了解一些关于我所拥有的内容的事情。做;然而,即使在阅读了评论中建议的所有链接和文档的几天之后,我仍未能找到我想要的东西。

我问过一些专业人士,他们告诉我应该搜索 JTAG驱动程序与闪存进行交互,但它看起来有点复杂,我无法找到任何。 这个网站上有人告诉我,只需使用指针即可;缺乏C示例和互联网教程无法帮助我弄清楚如何做到这一点。

最后,我最近开始挖掘 STM32Cube和HAL ,因为我想避免使用它们,因为我认为可以在不必包含这些层的情况下完成简单的读取。在尝试使用它们之前,询问这个问题是我最后的希望。

结论

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

3 个答案:

答案 0 :(得分:1)

使用ST-Link(图形界面)

读取MCU ID

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

对于您使用的STM32L476 MCU,它将是内存地址0x1FFF7590,大小为0xC(96位)。按Enter键可以让您看到从您连接的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读取的相同3x32bit值。您当然可以选择将其读作大小为12的uint8_t字节数组,如果您对详细信息(批号,晶圆号等)感兴趣,您甚至可以选择将其读入结构中。但是,此示例应该为您提供有关如何访问此值的一般概念。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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