3

このコードに基づいてカスタム Atmega2560 ボード用の stk500v2 ブートローダーをハッキングしているので、UART2代わりに使用しUART0ます。ボードのピン定義に一致するように led ピンも変更し、WDTリセット検出コードを変更して、代わりにブート タイムアウトを増加させました。アプリケーションコードに直接。ボードで行った詳細な変更とセットアップについては、以下を参照してください。

私の問題は、ピン リセットまたは WDT リセットを行うときに MCU がブートローダーを実行せず、ブラウン アウト リセット (プラグを差し込む/抜く) または電源オン リセット (ファームウェアのフラッシュ後の最初の起動時) を行うときにのみ実行することです。 . インターチューブのトピックに関するドキュメントを探してみました。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(有効)
  • BOOTSZ00(4096 ワードのブートローダ セクション)に設定
  • WDTON1(無効)に設定
  • BODLEVEL101(に設定しますが、それはより理にかなっVBOTmin=2.5Vていると思いますが、規制されており、電源障害以外では決して変化しないはずです)100Vcc

以上をお読みいただきありがとうございます。また、ご回答いただければなおさらです。

4

1 に答える 1

0

ばかげているように見えるかもしれませんが、それまで私には不明だったのは、ブートローダーとファームウェアを別々にフラッシュすることは機能しないということです。実行する必要があるのは、srec_catユーティリティを使用してブートローダーとファームウェアを結合し、結合したファームウェアをアップロードすることです。

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

The Bootloader FAQ の3-4 ページにどういうわけか説明されています

于 2014-02-22T12:02:25.133 に答える