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

时间:2015-04-19 15:44:46

标签: arduino avr atmega

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

我目前正在尝试使用serial,但如果需要,我也可以使用AVRISP程序员(不可取)

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

3 个答案:

答案 0 :(得分:1)

从ATmega328P数据表,“引导加载程序支持”部分,“应用程序和引导加载程序Flash部分”小节,“应用程序部分”子部分:

  

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

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

答案 1 :(得分:1)

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/

答案 2 :(得分:0)

我不相信这是对的。 328p确实能够控制关于允许访问的位置的一些指令。我没有在任何地方看到这是不可能的,在某些配置中它(328p)可以在它自己的控制下写下flash。

我在数据表中搜索了SPM指令被禁用'并且仅在ATmega 48a / 48pa上击中。在阅读有关错误控制器的数据表时,我多次迷惑自己。这并没有响铃。

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

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

328p具有锁定位字节'一般而言,设置所有这些控件。 这些也控制着他们拥有的访问权限。

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

杰克