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

时间:2013-10-22 12:34:54

标签: arduino avr bootloader

我正在根据此code攻击自定义Atmega2560主板的stk500v2引导加载程序,因此它使用UART2代替UART0,我也更改了引脚以匹配我的主板引脚定义并更改了WDT重置检测代码,因此它增加了引导超时,而不是直接转到应用程序代码。请参阅下文,了解我在电路板上所做的详细更改和设置。

我的问题是,当我执行引脚复位或WDT复位时,MCU不会运行引导加载程序,但仅在执行掉电复位(插拔)或上电复位时(在闪存后首次启动时)固件)。我试着寻找关于intertubes主题的文档,我已经阅读了Atmega2560的数据表(虽然它很长,我可能错过了相关部分),但我发现没有任何相关的解决这个问题。

我想,我在我的代码和/或设置中做错了,但我不知道是什么。

基本上,我更新了代码以添加预处理器条件(_USE_UART2_),在line 315 block中启用以下内容:

[...]
#elif defined(_M2560_UART2_)
  #define    UART_BAUD_RATE_LOW           UBRR2L
  #define    UART_STATUS_REG              UCSR2A
  #define    UART_CONTROL_REG             UCSR2B
  #define    UART_ENABLE_TRANSMITTER      TXEN2
  #define    UART_ENABLE_RECEIVER         RXEN2
  #define    UART_TRANSMIT_COMPLETE       TXC2
  #define    UART_RECEIVE_COMPLETE        RXC2
  #define    UART_DATA_REG                UDR2
  #define    UART_DOUBLE_SPEED            U2X2
[...]

并在line 155附近对引脚进行了另一次更改:

[...]
#elif defined(_M2560_UART2_)
#define PROGLED_PORT       PORTJ
#define PROGLED_DDR        DDRJ
#define PROGLED_PIN        PINJ0
[...]

我还在努力改变启动超时值,具体取决于它是否为欠压复位或WDT /引脚复位(我的目标是让WDO /引脚复位时引导加载程序等待更长时间)。所以我在line 545进行了以下更改:

    unsigned long long  boot_timeout    =   1200000;

line 560

    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

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

  • BOOTRST设置为0(已启用)
  • BOOTSZ设置为00(4096字引导加载程序部分)
  • WDTON设为1(已停用)
  • BODLEVEL设置为101VBOTmin=2.5V,但我认为100会更有意义,但Vcc受到监管且不应更改,除非电力故障)

感谢您阅读所有内容,如果您能回答,甚至更多!

1 个答案:

答案 0 :(得分:0)

可能看起来很愚蠢,直到那时我才不清楚的是,闪存引导加载程序和固件分别不起作用。需要做的是使用srec_cat实用程序加入引导加载程序和固件,并上传已加入的固件。

srec_cat firmware.hex -Intel bootloader.hex -Intel -o combined-bootloader.hex -I

The Bootloader FAQ

的第3-4页中有所描述