Tiny AVR/PIC Bootloader+
Tiny AVR/PIC Bootloader+の起動処理についてまとめ
1.通信手順
以下にホストとブートローダーとの通信手順を示す。

まずホスト側からリセット直後のターゲットに向け、コード0xC1を送出する。
ターゲット側がこれを正しく受信できれば、データ転送を開始する。
ホストとターゲットが繋がっていないときは、ターゲット側の受信ルーチンが約1秒でタイムアウトし、ブートローダーの処理を抜ける。
このときユーザープログラムが書き込まれていれば、ユーザーブログラムが実行される。
ターゲット側は転送されるデータブロック毎にチェックサムの判定を行い、チェックサムでエラーを判定するとホストに向けて文字"N"を送出する。
ホストは"N"を受信すると、先に送ったデータブロックを再送信する。 "K"を受信すると次のデータブロックを転送する。
ホスト側が転送を完了してもターゲット側は受信待ち状態にあるが、約1秒でタイムアウトしてブートローダーの処理を抜ける。
2.メモリーマップと命令の置換(PICの場合)
以下にPICの場合のメモリーマップを示す。
PICのフラッシュメモリのうちアドレス0000~0002がブートローダーへジャンプコードに書き換えられる。
ブートローダーの処理が完了すると、ブートローダーの先頭4ワードの領域へとジャンプし、ここがブートローダーの出口となる。
PICの場合この4ワードにソースコード0x0000~0003の領域を強制コピーする。この4ワードに含まれるGOTO命令により、ユーザープログラムへとジャンプする。

<<PICブートローダーにおけるソースプログラム作成上の制約>>
①割り込み使用の有無に関わらず、ソースプログラムの先頭4ワード中に必ずユーザープログラムへのジャンプ命令を記述する必要がある。
②さらにGOTO命令やCALL命令の範囲を超えるフラッシュを塔載しているPICの場合はプログラムソースの先頭4ワード中でPCLATHの定義を行う必要がある。
例えば上図のソースプログラムで先頭clrf PCLATHがない場合を想定すると、ブートローダーの出口0F9CではPCLATHの値が0x0Fとなっているため。GOTO命令を実行するとINITのアドレス0x0010ではなく0x0F10にジャンプしてしまう。
③上記②の理由からソースプログラムの先頭4ワード中にBRA命令やBRW命令などの相対ジャンプ命令をそのまま記述できない。
④ブートローダーへのジャンプコードに書き換えられるアドレス0x0000~0002の領域へのジャンプやサブルーチンコールは不可。
2.メモリーマップと命令の置換(AVRの場合)
以下にAVRの場合のメモリーマップを示す。

AVRのフラッシュメモリのうちアドレス0000のみブートローダーへジャンプコードに書き換えられる。
ブートローダーの処理が完了すると、ブートローダーの先頭4ワードの領域へとジャンプし、ここがブートローダーの出口となる。
この領域は以下の3つの場合により、 異なる コードが書き込まれる。
(1)ソースコードの0x0000がRJMP命令のとき、(3ワード使用)
RJMP命令をIJMP命令に置換して記述する。IJMP命令に置換する理由はアドレス0x0000とブートローダーの先頭4ワードの領域とでRJMPが届く領域が異なるため。
(2)ソースコードの0x0000がRCALL命令のとき、(4ワード使用)
RCALL命令をICALL命令に置換して記述する。次に相対ジャンプ命令で0x0001へのジャンプを記述
割り込みを使用しない場合0x0000に任意のコードを記述することが許される。ICALL命令に置換する理由は上記と同じ。
AVRのフラッシュメモリは最上位アドレスから最下位アドレスへと循環しているので、ブートローダーの出口から0x0001への相対ジャンプが可能である。
(3)その他の場合、(2ワード使用)
ソースコードの0x0000をそのままコピー、その後ブートローダーの出口から0x0001への相対ジャンプ
<<AVRブートローダーにおけるソースプログラム作成上の制約>>
①ブートローダーへのジャンプコードに書き換えられるアドレス0x0000の領域へのジャンプやサブルーチンコールは不可。
ただし、ブートローダー支援機能を搭載したATMEGAの場合は、リセットベクターが変わるので上記制約も無くなる。
1.通信手順
以下にホストとブートローダーとの通信手順を示す。

まずホスト側からリセット直後のターゲットに向け、コード0xC1を送出する。
ターゲット側がこれを正しく受信できれば、データ転送を開始する。
ホストとターゲットが繋がっていないときは、ターゲット側の受信ルーチンが約1秒でタイムアウトし、ブートローダーの処理を抜ける。
このときユーザープログラムが書き込まれていれば、ユーザーブログラムが実行される。
ターゲット側は転送されるデータブロック毎にチェックサムの判定を行い、チェックサムでエラーを判定するとホストに向けて文字"N"を送出する。
ホストは"N"を受信すると、先に送ったデータブロックを再送信する。 "K"を受信すると次のデータブロックを転送する。
ホスト側が転送を完了してもターゲット側は受信待ち状態にあるが、約1秒でタイムアウトしてブートローダーの処理を抜ける。
2.メモリーマップと命令の置換(PICの場合)
以下にPICの場合のメモリーマップを示す。
PICのフラッシュメモリのうちアドレス0000~0002がブートローダーへジャンプコードに書き換えられる。
ブートローダーの処理が完了すると、ブートローダーの先頭4ワードの領域へとジャンプし、ここがブートローダーの出口となる。
PICの場合この4ワードにソースコード0x0000~0003の領域を強制コピーする。この4ワードに含まれるGOTO命令により、ユーザープログラムへとジャンプする。

<<PICブートローダーにおけるソースプログラム作成上の制約>>
①割り込み使用の有無に関わらず、ソースプログラムの先頭4ワード中に必ずユーザープログラムへのジャンプ命令を記述する必要がある。
②さらにGOTO命令やCALL命令の範囲を超えるフラッシュを塔載しているPICの場合はプログラムソースの先頭4ワード中でPCLATHの定義を行う必要がある。
例えば上図のソースプログラムで先頭clrf PCLATHがない場合を想定すると、ブートローダーの出口0F9CではPCLATHの値が0x0Fとなっているため。GOTO命令を実行するとINITのアドレス0x0010ではなく0x0F10にジャンプしてしまう。
③上記②の理由からソースプログラムの先頭4ワード中にBRA命令やBRW命令などの相対ジャンプ命令をそのまま記述できない。
④ブートローダーへのジャンプコードに書き換えられるアドレス0x0000~0002の領域へのジャンプやサブルーチンコールは不可。
2.メモリーマップと命令の置換(AVRの場合)
以下にAVRの場合のメモリーマップを示す。

AVRのフラッシュメモリのうちアドレス0000のみブートローダーへジャンプコードに書き換えられる。
ブートローダーの処理が完了すると、ブートローダーの先頭4ワードの領域へとジャンプし、ここがブートローダーの出口となる。
この領域は以下の3つの場合により、 異なる コードが書き込まれる。
(1)ソースコードの0x0000がRJMP命令のとき、(3ワード使用)
RJMP命令をIJMP命令に置換して記述する。IJMP命令に置換する理由はアドレス0x0000とブートローダーの先頭4ワードの領域とでRJMPが届く領域が異なるため。
(2)ソースコードの0x0000がRCALL命令のとき、(4ワード使用)
RCALL命令をICALL命令に置換して記述する。次に相対ジャンプ命令で0x0001へのジャンプを記述
割り込みを使用しない場合0x0000に任意のコードを記述することが許される。ICALL命令に置換する理由は上記と同じ。
AVRのフラッシュメモリは最上位アドレスから最下位アドレスへと循環しているので、ブートローダーの出口から0x0001への相対ジャンプが可能である。
(3)その他の場合、(2ワード使用)
ソースコードの0x0000をそのままコピー、その後ブートローダーの出口から0x0001への相対ジャンプ
<<AVRブートローダーにおけるソースプログラム作成上の制約>>
①ブートローダーへのジャンプコードに書き換えられるアドレス0x0000の領域へのジャンプやサブルーチンコールは不可。
ただし、ブートローダー支援機能を搭載したATMEGAの場合は、リセットベクターが変わるので上記制約も無くなる。
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT