Embedded 以块(1024字节)为单位擦除闪存

Embedded 以块(1024字节)为单位擦除闪存,embedded,microcontroller,pic,bootloader,microchip,Embedded,Microcontroller,Pic,Bootloader,Microchip,我正在做一个引导程序。我必须先擦除1024字节的内存,然后才能将任何内容写入该块中的寄存器。即使我想写2个字节,我也必须擦除1024个字节。我的问题是我不知道每个街区从哪里开始。例如,假设我想将以下字节写入此地址 地址:0x198F0 字节:C80E00010001616FDFECD6F08C8C92EC 当我尝试从地址0x198F0开始擦除1024个字节时,我注意到它开始从0x19800开始擦除 如何知道每个块从何处开始,以便在软件中进行计算? 我想知道这一点的原因是,我可以在擦除之前将整个块

我正在做一个引导程序。我必须先擦除1024字节的内存,然后才能将任何内容写入该块中的寄存器。即使我想写2个字节,我也必须擦除1024个字节。我的问题是我不知道每个街区从哪里开始。例如,假设我想将以下字节写入此地址

地址:
0x198F0

字节:
C80E00010001616FDFECD6F08C8C92EC

当我尝试从地址
0x198F0
开始擦除1024个字节时,我注意到它开始从
0x19800
开始擦除

如何知道每个块从何处开始,以便在软件中进行计算?

我想知道这一点的原因是,我可以在擦除之前将整个块复制到ram中,然后修改它,并将其写回同一块。我正在使用MPLAB XC8编译器。我希望它清楚我想做什么,否则让我在评论中知道


谢谢

PIC18f87J11的闪存块为1024字节对齐。要计算某个块的起始地址,请将地址的最后10位设置为0,以便使用:

StartAddress = AddressPtr and 0xFFFC00
就你而言:

0x198F0 and 0xFFFC00 = 0x19800 

所以读者们理解,注意,你取1024-1=0x3FF,你取这个掩码的倒数,所以~0x3FF=0xFFFF….FFFC00,这就是你所用的。如果您试图在64字节上对齐,则会使用~(64-1)和。只适用于2@dwelch,谢谢你的进一步解释。竖起你的大拇指!您昨天已经问了一个几乎相同的问题:。此外,您所描述的行为对于闪存来说是正常的,并且在零件的用户手册中有详细描述-包括块布局和地址。@Clifford,如果我在回答了这个问题后在该线程中问这个问题,那就没有意义了?在那个线程中,我问是否可以从内存中删除一些字节,但这里我想知道如何找到每个块的开头。是的,两者都是相关的,但我不同意你应该将此标记为重复。根据过去的经验,用户不喜欢我在一个线程中问多个问题,而这个问题是从一个问题开始的。我已经收回了副本。我可能会建议,在你进入实际问题之前,序言可能有点太多了。您可以先提出问题,然后添加支持/澄清信息(尽管这可能是不必要的)。问题是,任何能回答你问题的人都可能已经了解闪存擦除块。您可以按照GJ的建议屏蔽低阶地址位,也可以简单地用正常的截断整数除法将地址除以块大小。GJ的解决方案更有效,尤其是在照片上。@Clifford,谢谢!