【问题标题】:Writing in STM32L4x1 flash memory in C用 C 语言写入 STM32L4x1 闪存
【发布时间】:2017-05-22 09:21:35
【问题描述】:

我正在尝试在 Windows 7 上使用 JTAG ST-Link/V2 写入 STM32L476 的闪存。无需上传软件,我只需将数据写入可读取和删除的非易失性位置.

作为一个硬件新手,只有在编写非嵌入式常规 C 时才高效,我担心我可能会损坏或不可撤销地修改闪存。另外,我不确定我能做什么或不能做什么。

我在阅读manual 时发现,在0x08000000 内存位置写入似乎是个好主意。使用C代码调用ST-Link_Utility

const char CMD_ACCESS_ST_UTILITY[] = "cd C:/Program Files (x86)/STMicroelectronics/STM32 ST-LINK Utility/ST-LINK Utility&&ST-LINK_CLI.exe ";

bool STLINKWriteSystemCalls(void)
{
    char cmd[200] = "";


    strcpy(cmd, CMD_ACCESS_ST_UTILITY); // cmd to access utility
    strcat(cmd, "-c"); // Then connect with ST-Link
    if (system(cmd) != 0)
        return false; // If failed exit


    strcpy(cmd, CMD_ACCESS_ST_UTILITY);
    strcat(cmd, "-r8 0x08000000 0x100"); // Read to check if there is data already

    // I haven't managed yet how I'll compare the result of read
    // To FFFF but that's not the main issue

    if (system(cmd) != 0)
        return false; // If failed exit


    strcpy(cmd, CMD_ACCESS_ST_UTILITY);
    strcat(cmd, "-w8 0x08000000 0x00"); // Write data into 0x080000000
    if (system(cmd) != 0)
        return false; // If failed exit

    return true;
}

有没有更好的方法来解决在哪里写以及如何写错误检查、使用的资源等

【问题讨论】:

  • 你可以使用 openocd 并且应该能够在终端 (telnet) 上运行命令来刷机,对于 SWD,我专门使用 openocd,对于引导加载程序,另一个故事(编写我自己的工具)。

标签: c embedded stm32 flash-memory jtag


【解决方案1】:

关于闪存的主要知识:

  1. 闪存是页可擦除的,如果2K,则在您的情况下页大小。这是什么意思?您必须确保您的代码不在页面的2k 范围内。
  2. 擦除后内存中所有字节的状态为 0xFF。
  3. 写入闪存字节意味着,在原始级别,将设置为1 的位修改为设置为0 的位。如果您想将0 稍微修改为1 您必须删除整个页面。

ST-Link_Utility 采用嵌入式方式,因此当您写入闪存时,它会擦除​​整个扇区,然后写入数据。如果您的代码需要在使用后简化数据,则同样如此。


默认情况下,您的 mCU 在启动时使用 0x0000 0000 别名地址 0x0800 0000

第一个词应该包含重置向量和默认向量表。复位向量始终是要执行的第一条指令。此表中的复位向量将包含一个分支,指向包含复位代码的地址。

所以,换句话说, 上电时,处理器跳转到固定位置0x0,即跳转到0x0800 0000。显然你选择的地址不正确;)

【讨论】:

  • @Badda 是也不是。问题是我写的0x08000000是mCU跳转查看代码所在的地址。因此,如果您对其进行写入,St 实用程序将擦除整个页面并写入您的数据,从而丢失之前写入的数据。因此,您会覆盖 MCU 在启动时查找的内容。
  • @Badda ARM 的工作原理。你可以在网上找到很多信息只要搜索Boot sequence ARM
  • @LPs :更具体地说,它是 ARM Cortex-M 的工作原理 - 不是所有 ARM架构。
  • @Badda : STM32L4x1 特定于 ARM Cortex-M4 的部分在 STM32L4x1 用户手册中没有描述,但由 ARM's technical documentation 提供。
  • @Badda 此类信息最简单的来源是 ST 的参考手册。对于您提到的 STM32L4x1,请参阅 RM0392,在第 2.6 节引导配置下,您可以找到此处讨论的确切内容。
【解决方案2】:

好消息!由于您使用的是 ST Link 实用程序,因此您无法破坏芯片。它只会拒绝在没有可访问内存的地方写入。

将自己永久锁定在芯片之外的唯一方法是将读取保护启用到最大 2 级。为此,您必须写入选项字节。而且您不会不小心将 0xCC33 写入锁定字节。

需要考虑的一点是,芯片只写入半字(16 位),并且只有在 FLASH 仍然为 0xFFFF(已擦除状态)时才写入。否则会返回写错误。

更新:来自 RDP 的手动 sn-p。代码读取保护。

2 级:无调试
在这个级别,保证1级保护。
此外,Cortex®-M4 调试端口, 从 RAM 启动(启动 RAM 模式)和从系统内存启动(boot loader 模式) 不再可用
在用户执行模式(boot FLASH模式)下,所有操作都是 允许在闪存主存储器上。 ...
2 级根本无法移除: 这是一个不可逆的操作。

简而言之:不要写入 0x1FFF7800。

【讨论】:

  • 例如,如果我尝试在 OTP 中写入,要么 JTAG 允许我稍后擦除数据,要么写入失败?我没有完全理解“将自己永久锁定在芯片之外”的部分,英语不是我的母语,并且仍在学习技术词汇。你能再解释一下吗?
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
相关资源
最近更新 更多