我正在根据此代码为自定义 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
受到监管,除非电源故障,否则永远不会改变)
感谢您阅读所有内容,如果您能回答,甚至更多!