3

好吧,我希望这个问题适合 Stackoverflow(如果不是这样,我已经想道歉了)

我有来自 Silabs 的 C8051F340 微控制器。我写了一个小接口,它将信息存储在来自 uC 的非易失性闪存中。现在就像在描述的数据表中一样,我将所有数据保存在地址 0x0200 - 0x0300 之间。要在那里复制我的数据,我只需使用 memcpy。

char xdata *ptr_selection       = 0x0210;
// Some other code here
memcpy (ptr_selection, writeBuffer, sizeof (writeBuffer));

好吧,复制本身运行良好(我查看了闪存,它正确保存了我的数据) - 如果我现在断开我的 uC 并在 5 秒内再次连接它,数据仍然存在。但是,如果我让它断开连接,我的数据或多或少会“重置” - 这意味着它每次都会获得几乎相同的“重置值”。那我做错了什么?我的意思是闪存数据不是非易失性的还是我做错了什么?

4

2 回答 2

2

根据您在问题中显示的代码,您正在尝试写入外部数据(xdata),即 RAM,而不是非易失性闪存。几秒钟后数据消失的原因是电源电容器仍然为芯片供电足够长的时间以保持内部 RAM 的运行。

要写入闪存,您需要遵循特定协议来解锁闪存编程电路,然后擦除您将写入的区域,然后使用 MOVX 指令写入字节,如数据表第 12 节所述。

此 Silicon Labs 应用说明“从固件写入闪存”详细描述了该过程。

于 2011-11-20T19:55:55.520 回答
1

Flash存储器不像普通的SRAM、SDRAM存储器。

你不能只写它。您可以做到的最大值 - 从普通内存中读取它(仅当您有 NOR 闪存时)。

但是如果你想写它,你必须首先擦除它(将所有位设置为 1)。只有这样你才能写信给它。Normaly,擦除由扇区完成。他们称之为擦除扇区。请参阅微控制器的数据表以了解其尺寸。

附言

根据您的 CPU 的数据表,要编写您必须使用特殊指令。确保 memcpy 在内部使用它。

于 2011-11-20T19:56:54.537 回答