我的黑客在此基礎上code定製Atmega2560板stk500v2引導程序,因此它使用UART2
代替UART0
,我也改變了導致銷匹配我的電路板引腳定義並更改了WDT
重置檢測代碼,因此它增加了引導超時而不是直接轉到應用程序代碼。請參閱下面的詳細變化和設置我已經在板上。STK500v2引導程序只有裝上上電覆位,而不是針/ WDT復位
我的問題是,當我執行引腳復位或WDT復位時,MCU不會運行引導加載程序,但僅在進行欠壓復位(插拔)或上電覆位(在第一次啓動後閃爍固件)。我試過尋找有關這個話題的文檔,我已經閱讀了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 /引腳復位(我的目標是讓引導加載程序在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
最後,我設置的保險絲如下:
BOOTRST
設置爲0
(啓用)BOOTSZ
設置爲00
(4 096字bootloader區)WDTON
設置爲1
(禁用)BODLEVEL
設置爲101
(VBOTmin=2.5V
,儘管我認爲100
會更有意義,雖然Vcc
被限制,除了在電源故障絕不會發生變化)
謝謝您閱讀所有內容,如果您能回答,甚至更多!