3

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

我的问题是,当我进行引脚复位或 WDT 复位时,MCU 不会运行引导加载程序,但只有在进行掉电复位(插入/拔出)或上电复位时才会运行(在刷新固件后首次启动) . 我尝试在 intertubes 上查找有关该主题的文档,我已经阅读了 Atmega2560 的数据表(虽然它很长而且我可能错过了相关部分),但我发现没有任何相关的东西可以解决这个问题。

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

所以基本上,我更新了代码,在第315 行块_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
[...]

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

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

我还在努力更改启动超时值,具体取决于它是掉电复位还是 WDT/引脚复位(我的目标是让引导加载程序在 WDT/引脚复位时等待更长时间)。所以我在第 545 行做了以下更改:

    unsigned long long  boot_timeout    =   1200000;

第 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设置为101( VBOTmin=2.5V,虽然我认为这100更有意义,但Vcc受到监管,除非电源故障,否则永远不会改变)

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

4

1 回答 1

0

看起来很愚蠢,直到那时我还不清楚的是,分别刷新引导加载程序和固件是行不通的。需要做的是使用该srec_cat实用程序加入引导加载程序和固件,并上传加入的固件。

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

它在引导加载程序常见问题的第 3-4 页中以某种方式进行了描述

于 2014-02-22T12:02:25.133 回答