Arduino STK500v2引导加载程序仅在通电复位时加载,不在引脚/WDT复位时加载

Arduino STK500v2引导加载程序仅在通电复位时加载,不在引脚/WDT复位时加载,arduino,avr,bootloader,Arduino,Avr,Bootloader,基于此,我正在为定制的Atmega2560板破解stk500v2引导加载程序,因此它使用UART2而不是UART0,我还更改了led引脚以匹配我的板引脚定义,并更改了WDT重置检测代码,因此它增加了引导超时,而不是直接进入应用程序代码。有关我在电路板上所做的详细更改和设置,请参见下文 我的问题是,当我执行引脚重置或WDT重置时,MCU不会运行引导加载程序,但仅在执行棕色输出重置(插入/拔出)或上电重置(在刷新固件后的第一次引导时)时才会运行引导加载程序。我试着在Intertube上查找关于该主题

基于此,我正在为定制的Atmega2560板破解stk500v2引导加载程序,因此它使用
UART2
而不是
UART0
,我还更改了led引脚以匹配我的板引脚定义,并更改了
WDT
重置检测代码,因此它增加了引导超时,而不是直接进入应用程序代码。有关我在电路板上所做的详细更改和设置,请参见下文

我的问题是,当我执行引脚重置或WDT重置时,MCU不会运行引导加载程序,但仅在执行棕色输出重置(插入/拔出)或上电重置(在刷新固件后的第一次引导时)时才会运行引导加载程序。我试着在Intertube上查找关于该主题的文档,我已经阅读了Atmega2560的数据表(虽然它很长,我可能遗漏了相关部分),但我发现没有任何相关内容可以解决该问题

我猜,我的代码和/或设置有问题,但我不知道是什么

因此,基本上,我更新了代码以添加一个预处理器条件(
\u USE\u UART2\u
),该条件在

还对pin进行了另一次更改,大约:

我还致力于改变引导超时值,这取决于它是一个棕色的重置,还是一个WDT/引脚重置(我的目标是让引导加载程序在WDT/引脚重置时等待更长的时间)。因此,我在进行了以下更改:

最后,我按如下方式设置保险丝:

  • BOOTRST
    设置为
    0
    (已启用)
  • BOOTSZ
    设置为
    00
    (4096字引导加载程序部分)
  • 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