このコードに基づいてカスタム 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
(有効)BOOTSZ
00
(4096 ワードのブートローダ セクション)に設定WDTON
1
(無効)に設定BODLEVEL
101
(に設定しますが、それはより理にかなっVBOTmin=2.5V
ていると思いますが、規制されており、電源障害以外では決して変化しないはずです)100
Vcc
以上をお読みいただきありがとうございます。また、ご回答いただければなおさらです。