我正在基于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页中对此进行了描述