复刻GitHub开源的基于Arduino的T12恒温电烙铁时,每次修改控制程序或者修复bug使用ISP重新升级程序时EEPROM的数据都会清空。导致每次都要重新录入烙铁的校准信息和配置烙铁,这样显得很麻烦。
其实,Arduino中有一个保险丝可以配置不擦除EEPROM。可以参考AVR® Fuse Calculator对bootloder进行配置
我使用的是ATmega328P主控(MUC)
我们来分析一下配置
修改前

修改后

由上面的两个图片红框的信息可以看出来,当勾选EESAVE(保留EEPROM数据)AVRDUDE arguments 中hfuse的值由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:m的DE改为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的数据了