【问题标题】:Flash Memory in 8051F340 Microcontroller gets erased8051F340 微控制器中的闪存被擦除
【发布时间】:2011-11-20 17:58:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c microcontroller 8051 flash-memory


    【解决方案1】:

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

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

    此 Silicon Labs 应用笔记"Writing to Flash from Firmware" 详细描述了该过程。

    【讨论】:

    • 是的,根据数据表我需要解锁它(那里描述了一个程序)但是我如何选择一个目的地?我的意思是只能有一个地址 0x0200 ?!我如何在 C 中做到这一点?有什么办法吗?
    • 好的,来自 silabs 的应用笔记链接有帮助。在那里,我尝试在我的代码中实现 F340 的示例。但实际上,如果我调用 FLASH_ByteWrite 函数,什么都不会发生 -> 如果我调试并进入它,我会看到第二个参数根本没有改变......所以例如如果我调用 FLASH_ByteWrite(0x0200, 0xFF) 然后进入函数,第二个参数的变量在函数本身中为零..?
    • 关于 MOVX 指令的问题,应用说明说:“当 PSWE 位 (PSCTL.0) 设置为逻辑 1 时,MOVX 写入操作码的目标是闪存而不是外部存储器 (XRAM ). 当 PSWE 和 PSEE(PSCTL.0 和 PSCTL.1)都设置为逻辑 1 时,MOVX 写操作码会擦除包含目标地址的 Flash 页。"
    • 不知道为什么你进入函数调用会如何错误的参数。但是,我质疑您使用 0x200 作为 Flash 地址来存储数据,除非您修改了链接描述文件,否则这通常就在您的代码放置位置的中间。您应该选择一个靠近闪存顶部的地址,例如 0xF000。
    • 是的,你是对的,0x0200 不是最好的主意,但根据数据表和 AP 0x2000 应该是正确的。实际上,您在取得进展方面帮助了我很多——我还有一些奇怪的问题。我将 AP 中的示例函数用于 F340。它编译没有问题,但就像我已经说过的那样,它在传递函数参数时存在问题......例如:如果我按照设计的方式调用函数,它就不起作用 - 如果我创建一个全局变量来“传递”函数参数它有效....我不知道这是为什么...???
    【解决方案2】:

    闪存不像普通的SRAM、SDRAM内存。

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

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

    PS

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2021-02-12
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 2015-04-14
      相关资源
      最近更新 更多