我正在根据此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
设置为101
(VBOTmin=2.5V
,但我认为100
会更有意义,但Vcc
受到监管且不应更改,除非电力故障)感谢您阅读所有内容,如果您能回答,甚至更多!
答案 0 :(得分:0)
srec_cat
实用程序加入引导加载程序和固件,并上传已加入的固件。
srec_cat firmware.hex -Intel bootloader.hex -Intel -o combined-bootloader.hex -I
的第3-4页中有所描述