Arm STM32F7-写入闪存时的奇怪行为

Arm STM32F7-写入闪存时的奇怪行为,arm,microcontroller,stm32,flash-memory,Arm,Microcontroller,Stm32,Flash Memory,我使用\uuuu属性(at())命令(ARM编译器v5,Keil uVision 5)创建了一个放置在闪存中的变量: 使用&myVar检查位置会给出正确的值。要写入闪存中的区域,需要解锁闪存。但是当我试图用myVar=someValue直接写入变量时,变量实际上改变了它的值。在Keil uVision 5内存窗口中,我检查了变量的地址0x081C0008,并且该值已更改。但当我重置MCU时,0x081C0008处的值将重置为其旧值 所以我的问题是,当我写到myVar时会发生什么。它是否存储在RA

我使用
\uuuu属性(at())
命令(ARM编译器v5,Keil uVision 5)创建了一个放置在闪存中的变量:

使用
&myVar
检查位置会给出正确的值。要写入闪存中的区域,需要解锁闪存。但是当我试图用
myVar=someValue
直接写入变量时,变量实际上改变了它的值。在Keil uVision 5内存窗口中,我检查了变量的地址0x081C0008,并且该值已更改。但当我重置MCU时,0x081C0008处的值将重置为其旧值

所以我的问题是,当我写到
myVar
时会发生什么。它是否存储在RAM中的其他位置,或者在运行期间和重置后如何更改,以保持存储在闪存中的原始值

编辑:
以下是用于更改闪存中变量值的代码和相应的汇编代码

C:

myVar=!myVar;
someVar=myVar;
汇编程序:

0x0800F196 4888      LDR           r0,[pc,#544]  ; @0x0800F3B8 (Memory location of the value 0x081C0008)
0x0800F198 7800      LDRB          r0,[r0,#0x00]
0x0800F19A B908      CBNZ          r0,0x0800F1A0
0x0800F19C 2001      MOVS          r0,#0x01
0x0800F19E E000      B             0x0800F1A2
0x0800F1A0 2000      MOVS          r0,#0x00
0x0800F1A2 4985      LDR           r1,[pc,#532]  ; @0x0800F3B8
0x0800F1A4 7008      STRB          r0,[r1,#0x00]                                                                                
0x0800F1A6 4608      MOV           r0,r1
0x0800F1A8 7800      LDRB          r0,[r0,#0x00]
0x0800F1AA 4984      LDR           r1,[pc,#528]  ; @0x0800F3BC
0x0800F1AC 7008      STRB          r0,[r1,#0x00]
如果我在调试期间观察寄存器,变量“myVar”实际上是从闪存地址加载的,那么它会被更改并存储回闪存地址。
当“myVar”被分配给someVar时,它读取实际的闪存地址并将其写入someVar。最后,someVar保存了“myVar”的更改值。

写入操作不会更改闪存中的任何内容。调试器正在缓存内存访问,并认为它是RAM。它给了你虚假的信息


要写入flash,仅解锁它是不够的。您还需要删除整个扇区。因此,分配给这类变量完全没有任何作用。

该地址的底层是否有阴影RAM?@wallyk F7没有类似的内容。反汇编显示了什么?@old_timer您希望dissasembly显示:扇区复制到RAM,擦除扇区,修改RAM中的数据,写入闪存?为什么在F7上使用0x08xxxxxx。取决于f7,我猜,这是哪个具体的f7?为什么?任何解释都取决于闪光灯,有些你可以写你想写的,它们会(反转或不反转)或在差异中,因此最终取决于你使用的值,结果会是全1或全0。通常情况下,没有擦除就不能写,事实上,你可以在没有擦除的情况下写,因为写入是过程中的一个擦除后步骤,但有些供应商和某些部件你只需戳一下地址就可以写,有些则不能写。(samd可以置于这种模式,怀疑stm32s)@old_timer没有一个stm32设备允许它。问题是关于stm32F7的。你的SAMD评论毫无用处。某些STM32允许将形式1更改为零。大多数F7、L4等都有闪存奇偶校验或ECC保护,您只能写一次,并且您必须写入部分数据(例如64位)。您的答案太笼统,导致人们认为您无法写入闪存。@old_timer我在哪里写的。我刚刚写的这还不足以在flashaddres声明变量并分配它。
0x0800F196 4888      LDR           r0,[pc,#544]  ; @0x0800F3B8 (Memory location of the value 0x081C0008)
0x0800F198 7800      LDRB          r0,[r0,#0x00]
0x0800F19A B908      CBNZ          r0,0x0800F1A0
0x0800F19C 2001      MOVS          r0,#0x01
0x0800F19E E000      B             0x0800F1A2
0x0800F1A0 2000      MOVS          r0,#0x00
0x0800F1A2 4985      LDR           r1,[pc,#532]  ; @0x0800F3B8
0x0800F1A4 7008      STRB          r0,[r1,#0x00]                                                                                
0x0800F1A6 4608      MOV           r0,r1
0x0800F1A8 7800      LDRB          r0,[r0,#0x00]
0x0800F1AA 4984      LDR           r1,[pc,#528]  ; @0x0800F3BC
0x0800F1AC 7008      STRB          r0,[r1,#0x00]