Arduino使用ISP烧写程序不擦除(保留)EEPROM(教程)

复刻GitHub开源的基于Arduino的T12恒温电烙铁时,每次修改控制程序或者修复bug使用ISP重新升级程序时EEPROM的数据都会清空。导致每次都要重新录入烙铁的校准信息和配置烙铁,这样显得很麻烦。

其实,Arduino中有一个保险丝可以配置不擦除EEPROM。可以参考AVR® Fuse Calculator对bootloder进行配置

我使用的是ATmega328P主控(MUC)

我们来分析一下配置

修改前

修改后

由上面的两个图片红框的信息可以看出来,当勾选EESAVE(保留EEPROM数据)AVRDUDE argumentshfuse的值由d9变成了d1

我们来对比这两个值

D9

D1

可以看出,这个寄存器hfuse的第四位由1变成了0,可以确定第四位是用来配置是否保留EEPROM数据的

那么我们在烧写bootloader的时候就可以配置这个寄存器的第四位为0则可实现烧写程序时保留EEPROM的数据。下面我们来看看怎么操作。

我使用Arduino UNO做ISP,按下图进行接线,但是需要注意RESET的接线(请看下面的说明)不能使用Arduino UNO上的RESET,需要根据ISP程序的定义来接线。

烧写ISP程序

按上图在Arduino IDE的【文件】->【示例】->【ArduinoISP】->【ArduinoISP】打开ISP程序的代码

准备烧录ISP之前来说一下RESET的接线问题

RSET的接线

从ISP程序的代码注释可以看出来RESET控制被定义为Pin 10

也就是被烧写的芯片的RESET引脚要接到UNO的10号引脚,如下图

接好先之后我们直接点击【上传】即可将ISP程序烧录到UNO中。

烧写Bootloader(引导程序)

重新烧写Bootloader会导致EEPROM数据丢失

重新烧写Bootloader会导致EEPROM数据丢失

重新烧写Bootloader会导致EEPROM数据丢失

点击烧录Bootloader(引导程序)可以在输出窗口看到一下命令代码

烧写bootloader命令

"C:\Users\XXXX\AppData\Local\Arduino15\packages\arduino\tools\avrdude.3.0-arduino17/bin/avrdude" "-CC:\Users\XXXX\AppData\Local\Arduino15\packages\arduino\tools\avrdude.3.0-arduino17/etc/avrdude.conf" -v -patmega328p -cstk500v1 -PCOM6 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDE:m -Ulfuse:w:0xFF:m

我们需要关注-Uhfuse:w:0xDE:m这个参数

前面说到hfuse的第四位需要改成0,我们可以直接用电脑计算器的程序员模式修改

如下图,先在计算器的16进制模式下输入DE,点击箭头所指的第四位数字将其改为0

如下图,我们得到了配置值为16进制的D6

熟悉的位运算的小伙伴可以直接使用位运算亦可

DE & F7 = D6

烧写bootloader命令-Uhfuse:w:0xDE:mDE改为D6


"C:\Users\XXXX\AppData\Local\Arduino15\packages\arduino\tools\avrdude.3.0-arduino17/bin/avrdude" "-CC:\Users\XXXX\AppData\Local\Arduino15\packages\arduino\tools\avrdude.3.0-arduino17/etc/avrdude.conf" -v -patmega328p -cstk500v1 -PCOM6 -b19200 -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD6:m -Ulfuse:w:0xFF:m

执行上面的新的命令重新烧写bootloader即可。(可能会报错,需要先关闭Arduino IDE)

重要提示烧写bootloader亦会擦除EEPROM的数据

完结,下次使用ISP升级程序就不会清除EEPROM的数据了