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

如何在Arduino Uno(ATmega328p)的闪存中存储数据,arduino,avr,atmega,Arduino,Avr,Atmega,我有一个Arduino Uno项目,我需要存储一个字符**,这个字符对于EPROM来说太大了 我目前正在尝试使用串行接口,但如果需要,我也可以使用AVRISP程序员(不可取) 到目前为止,我已经研究了avr/boot.hapi,但我不确定如何正确使用它,或者它是否是正确的方法 从ATmega328P数据表,“引导加载程序支持”部分,“应用程序和引导加载程序闪存”部分,“应用程序部分”子部分: 。。。从应用程序部分执行时,SPM指令被禁用 因此,无法从正在运行的程序写入闪存。如果需要存储的数据超过

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

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


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

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

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


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

来自ATmega328P数据表,“引导加载程序支持”部分,“应用程序和引导加载程序闪存部分”部分,“应用程序部分”子部分:

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


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

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

我在数据表中搜索了“SPM指令已禁用”,仅在ATmega 48a/48pa上点击。我曾多次对读到的关于错误控制器的数据表感到困惑。这一点都不重要

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

‘ATmega 48A/48PA没有单独的引导加载程序部分,如果SELFPRGEN保险丝编程为(“0”),则SPM指令将在整个闪存中启用。否则,SPM指令将被禁用。’

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

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


杰克

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

我在数据表中搜索了“SPM指令已禁用”,仅在ATmega 48a/48pa上点击。我曾多次对读到的关于错误控制器的数据表感到困惑。这一点都不重要

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

‘ATmega 48A/48PA没有单独的引导加载程序部分,如果SELFPRGEN保险丝编程为(“0”),则SPM指令将在整个闪存中启用。否则,SPM指令将被禁用。’

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

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

Jack

arduino(特别是atmel 328版本)仅允许在引导加载程序允许的情况下写入闪存

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

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

这是一个arduino的引导加载程序(Hackday上的特色),允许您在运行时写入闪存

这是关于这个问题的哈克代帖子 arduino(特别是atmel 328版本)仅允许在引导加载程序允许的情况下写入闪存

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

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

这是一个arduino的引导加载程序(Hackday上的特色),允许您在运行时写入闪存

这是关于这个问题的哈克代帖子

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