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