【问题标题】:How to store data in the flash memory of a Arduino Uno (ATmega328p)如何将数据存储在 Arduino Uno (ATmega328p) 的闪存中
【发布时间】:2015-04-19 15:44:46
【问题描述】:

我有一个带有 Arduino Uno 的项目,我需要存储一个对于 EPROM 来说太大的字符**。

我目前正在尝试使用串行,但如果需要,我也可以使用 AVRISP 编程器(不推荐)

到目前为止,我已经研究了 avr/boot.h API,但我不确定如何正确使用它,或者它是否是正确的方法。

【问题讨论】:

  • 我不清楚您是要存储静态数据还是动态数据,因为您提到可能由 AVRISP 程序员执行。数据在编译时是否已知?
  • @Rev1.0 在编译时不知道,我想制作一个程序,让最终用户加载设置以自定义设备,所以不是在编译时。
  • 好的。正常的方法可能是使用一些外部 EEPROM。另一种方式可能类似于接收固件更新。根据请求启动设备 -> 从引导加载程序代码接收您的数据 -> 将数据写入闪存地址空间末尾附近的特定地址 -> 继续主程序,它知道在哪里查找数据。
  • 连续写MCU FLASH不是个好主意,不保证可以无限写!使用声明为 10000 次写入/擦除周期的 MCU 闪存性能更高的外部存储器可能会更好。
  • @SergioFormiggini,我知道写入/擦除周期,这是针对嵌入式设备的,用户可能只需要在其生命周期中最多 10-15 次执行此操作,因此应该没有问题.

标签: arduino avr atmega


【解决方案1】:

来自 ATmega328P 数据表,“Boot Loader Support”部分,“Application and Boot Loader Flash Sections”小节,“Application Section”小节:

...从应用程序部分执行时,SPM 指令被禁用。

因此无法从正在运行的程序写入闪存。如果您需要存储比板载更多的数据,请使用外部存储设备。

【讨论】:

    【解决方案2】:

    arduino(特别是 atmel 328 版本)只允许您在引导加载程序允许时写入闪存。

    标准引导加载程序允许您在安装新程序时写入闪存,但不允许运行时程序写入闪存。

    解决方案:安装一个引导加载程序,它允许您运行使您能够写入闪存的功能。

    这是一个用于 arduino 的引导加载程序(在 hackaday 上提供),它允许您在运行时写入闪存 http://majek.mamy.to/en/writing-to-internal-flash-on-arduino/

    这是关于该主题的 hackaday 帖子 https://hackaday.com/2015/07/03/arduinos-and-other-avrs-write-to-own-flash/

    【讨论】:

      【解决方案3】:

      我不认为这是正确的。 328p 确实有能力控制一些关于他们被允许访问的指令。我没有在任何地方看到这是不可能的,并且在某些配置中它(328p)可以在它自己的控制下写入闪存。

      我在数据表中搜索了“SPM 指令已禁用”,并且只在 ATmega 48a/48pa 上找到了。多次将自己与阅读错误控制器的数据表混淆。这没有敲响警钟。

      直接从数据表中复制(660 页):

      “ATmega 48A/48PA 没有单独的 Boot Loader 部分,如果 SELFPRGEN 熔丝被编程(“0”),则整个 Flash 的 SPM 指令被启用。否则,SPM 指令被禁用。”

      一般来说,328p 具有“锁定位字节”设置所有这些控件。 这些还控制他们拥有的访问权限。

      我想你会想把它放到 eeprom 中(这是不同的)......

      杰克

      【讨论】:

        猜你喜欢
        • 2022-12-14
        • 1970-01-01
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        相关资源
        最近更新 更多