STM32的OTP写入64位数据

我正在尝试在 STM32L4 芯片的内存闪存中写入数据。这将在我使用 C 调用 ST-Link 实用程序命令行编程上下文中完成

所以这里是闪存的一个例子:

               0             4             8             C
0x1FFF7000  FFFFFFFF     FFFFFFFF       FFFFFFFF       FFFFFFFF

到目前为止,我只能64 位数据空间写入32

               0             4             8             C
0x1FFF7000  AAAAAAAF     FFFFFFFF       BBBCCCDD       FFFFFFFF

在前 32 位上写入时,后 32 位被锁定。因此,鉴于内存处于先前状态,不允许进行以下写入:

               0             4             8             C
0x1FFF7000  AAAAAAAF     00000001       BBBCCCDD       FFFFFFFF
                            ^^                            ^^
                         Not allowed                     Locked

我只能在 64 位数据空间中写入一次大小受 32 位限制的数据。我发现这非常奇怪,因为没有理由以这种方式处理内存。

编辑:这只是因为我想在 OTP 中写入,当我在其他地方写入时它似乎正常工作

第一个可能的解决方案

这个对我之前一个问题的回答引用了这个:

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

有什么方法可以启用级别 2允许我在 64 位内存空间上写入 32 位两次?

第二种可能的解决方案

查看芯片的文档,我找到了闪存编程序列(第 102 页):

  1. 通过检查闪存状态寄存器 (FLASH_SR) 中的 BSY 位,检查是否没有正在进行的闪存主存储器操作。
  2. 检查并清除由于先前编程导致的所有错误编程标志。如果不是,则设置 PGSERR。
  3. 设置 Flash 控制寄存器 (FLASH_CR) 中的 PG 位。
  4. 在所需的内存地址、主内存块或 OTP 区域内执行数据写入操作。只能编程双字。– 在与双字对齐的地址中写入第一个字 – 写入第二个字
  5. 等到 FLASH_SR 寄存器中的 BSY 位被清除。
  6. 检查FLASH_SR寄存器中是否设置了EOP标志(即编程操作成功),并由软件清零。
  7. 如果不再有编程请求,则清除 FLASH_SR 寄存器中的 PG 位。

我一直无法真正理解3中的PG 位是什么但是当我尝试设置它时,不允许写入。

我使用ST-Link 实用程序进行写入,并且-w32根据手册,该命令应该允许我在寄存器上写入。

-w32 支持写入闪存、OTP、SRAM 和 R/W 寄存器

此外,第4似乎描述了我正在反对的确切问题,但我无法理解它提出的解决方案。

关于如何用任何解决方案解决问题的任何提示都将是一种祝福。另外,由于我对嵌入的低级词汇不是很熟悉,请不要犹豫编辑我的问题以使其更清楚。

雅克·斯利莫克

您观察到这种行为的原因如下(来自 STM32L4x5 STM32L4x6 RM):

1 KB(128 双字)OTP(一次性可编程)字节用于用户数据。OTP 区域仅在 Bank 1 中可用。OTP 数据无法擦除,只能写入一次。如果只有一位为 0,则不能再写入整个双字,即使值为 0x0000 0000 0000 0000。

这意味着 OTP 区域被组织为 64 位值并且写入它应该是“原子的”,这意味着您一次写入所有 64 位。在 64 位中的任何一个设置 0 会锁定整个双字以供进一步写入。在您的示例中,这意味着,如果您尝试使用 using 以 8 位批量写入值,-w8您将只能在给定的双字(64 位)中写入 8 中的第一个字节。

反过来,这意味着即使 ST-Link 实用程序手册声明-w32允许对 OTP 区域进行编程,也仅意味着可以将 OTP 指定为要写入的目标地址,而不一定能够正确编程所有每个双字的位。这看起来像是一个疏忽,尽管您对此无能为力。

我个人会尝试使用以下-P命令对其进行编程

Description: Loads binary, Intel Hex or Motorola S-record file into device memory without
verification. For hex and srec format, the address is relevant.
Syntax: -P <File_Path> [<Address>]
Examples: -P C:\file.srec
-P C:\file.bin 0x08002000
-P C:\file.hex

我自己还没有测试过,但目前对我来说,这似乎是唯一一种可以让您通过 ST-Link 将 64 位值“原子地”编程到 OTP 中的可能性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章