如何将数据存储在 Arduino Uno (ATmega328p) 的闪存中

How to store data in the flash memory of a Arduino Uno (ATmega328p)

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

我目前正在尝试使用串口来完成,但如果需要我也可以使用 AVRISP 编程器(不可取)

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

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

... the SPM instruction is disabled when executed from the Application section.

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

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

我在数据 sheet 中搜索了 'SPM instruction is disabled',结果只命中了 ATmega 48a/48pa。多次将自己与数据 sheet 混淆,阅读有关错误的控制器。这没有响起。

直接从资料中复制sheet(660页):

"The ATmega 48A/48PA has no separate Boot Loader section, and the SPM instruction is enabled for the whole Flash if the SELFPRGEN fuse is programmed (“0”). Otherwise the SPM instruction is disabled."

一般来说,328p 'Lock Bit Byte' 设置了所有这些控件。 这些还控制他们拥有的访问权限。

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

杰克

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

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

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

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

期间写入闪存

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