我有几个基于ATMEGA328的自定义板:我最近发现标准的Arduino引导加载程序不能正确处理看门狗超时(它一直在重置,所以设备在下一次电源循环之前都会被有效地阻塞(,所以我切换到Optiboot引导加载程序。
我想在我的应用程序中添加一些东西,告诉我引导程序是Arduino还是Optiboot。由于Optiboot要小得多,重置矢量不同,因此打印出来将是一个很好的指示。
Serial.println(pgm_read_word_near(0(,HEX(;
上面的代码行打印出940C,我期待着类似7E00的东西。如何从重置矢量中打印出地址?
启动闪存部分的实际起始地址由BOOTSZ保险丝确定。
这读取经典ATmega:的引导加载程序的大小
uint32_t bootloaderSize;
cli();
uint8_t highBits = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS);
sei();
if (!(highBits & bit(FUSE_BOOTRST))) {
uint8_t v = (highBits & ((~FUSE_BOOTSZ1 ) + (~FUSE_BOOTSZ0 )));
bootloaderSize = MIN_BOOTSZ << ((v >> 1) ^ 3);
}
使用#include <avr/boot.h>