Arduino STK500v2引导加载程序仅在通电复位时加载,不在引脚/WDT复位时加载
基于此,我正在为定制的Atmega2560板破解stk500v2引导加载程序,因此它使用Arduino STK500v2引导加载程序仅在通电复位时加载,不在引脚/WDT复位时加载,arduino,avr,bootloader,Arduino,Avr,Bootloader,基于此,我正在为定制的Atmega2560板破解stk500v2引导加载程序,因此它使用UART2而不是UART0,我还更改了led引脚以匹配我的板引脚定义,并更改了WDT重置检测代码,因此它增加了引导超时,而不是直接进入应用程序代码。有关我在电路板上所做的详细更改和设置,请参见下文 我的问题是,当我执行引脚重置或WDT重置时,MCU不会运行引导加载程序,但仅在执行棕色输出重置(插入/拔出)或上电重置(在刷新固件后的第一次引导时)时才会运行引导加载程序。我试着在Intertube上查找关于该主题
UART2
而不是UART0
,我还更改了led引脚以匹配我的板引脚定义,并更改了WDT
重置检测代码,因此它增加了引导超时,而不是直接进入应用程序代码。有关我在电路板上所做的详细更改和设置,请参见下文
我的问题是,当我执行引脚重置或WDT重置时,MCU不会运行引导加载程序,但仅在执行棕色输出重置(插入/拔出)或上电重置(在刷新固件后的第一次引导时)时才会运行引导加载程序。我试着在Intertube上查找关于该主题的文档,我已经阅读了Atmega2560的数据表(虽然它很长,我可能遗漏了相关部分),但我发现没有任何相关内容可以解决该问题
我猜,我的代码和/或设置有问题,但我不知道是什么
因此,基本上,我更新了代码以添加一个预处理器条件(\u USE\u UART2\u
),该条件在
还对pin进行了另一次更改,大约:
我还致力于改变引导超时值,这取决于它是一个棕色的重置,还是一个WDT/引脚重置(我的目标是让引导加载程序在WDT/引脚重置时等待更长的时间)。因此,我在进行了以下更改:
及
最后,我按如下方式设置保险丝:
设置为BOOTRST
(已启用)0
设置为BOOTSZ
(4096字引导加载程序部分)00
设置为WDTON
(禁用)1
设置为BODLEVEL
(101
,尽管我认为VBOTmin=2.5V
更有意义,但100
是受监管的,除了电源故障外,不应变化)Vcc
感谢您阅读所有这些内容,如果您能回答的话,更是如此 尽管看起来很愚蠢,但在那之前我还不清楚的是,单独刷新引导加载程序和固件是不起作用的。需要做的是使用
srec_cat
实用程序加入引导加载程序和固件,并上传加入的固件
srec_cat firmware.hex -Intel bootloader.hex -Intel -o combined-bootloader.hex -I
第3-4页对其进行了描述
[...]
#elif defined(_M2560_UART2_)
#define PROGLED_PORT PORTJ
#define PROGLED_DDR DDRJ
#define PROGLED_PIN PINJ0
[...]
unsigned long long boot_timeout = 1200000;
WDTCSR = 0;
__asm__ __volatile__ ("sei");
// check if WDT generated the reset, if so, go straight to app
#ifndef SOFTWARE_RESET
if (mcuStatusReg & _BV(WDRF))
{
app_start();
}
#else
// if WDT generated the reset, increase the boot timeout time
if (mcuStatusReg & _BV(WDRF))
boot_timeout = 3500000; // 7 seconds
#endif
srec_cat firmware.hex -Intel bootloader.hex -Intel -o combined-bootloader.hex -I