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

我的问题是,当我进行引脚复位或WDT复位时,MCU不运行引导加载程序,而仅在进行掉电复位(插入/拔出)或上电复位(刷新固件后的首次引导)时才执行引导加载程序。我试图在Intertubes上寻找有关该主题的文档,我已经阅读了Atmega2560的数据表(尽管它很长,而且我可能错过了相关的零件),但没有发现解决该问题的相关信息。

我想我在代码和/或设置中做错了,但我不知道该怎么办。

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

[...]
#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 /引脚复位来更改启动超时值(我的目标是使引导加载程序在WDT /引脚复位上等待更长的时间)。因此,我在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

最后,我将 fuse 设置如下:
  • 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
    

    The Bootloader FAQ的第3-4页中对此进行了描述

    07-28 02:26
    查看更多