2013-10-22 26 views
3

我的黑客在此基礎上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設置爲101VBOTmin=2.5V,儘管我認爲100會更有意義,雖然Vcc被限制,除了在電源故障絕不會發生變化)

謝謝您閱讀所有內容,如果您能回答,甚至更多!

回答

0

可能看起來很愚蠢,直到那時我纔不清楚的是,閃爍引導加載程序和固件單獨不起作用。需要做的是使用srec_cat實用程序加入引導加載程序和固件,並上傳加入的固件。

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

它在3-4頁莫名其妙描述The Bootloader FAQ